vega_lite_4 0.6.0

rust api for vega-lite v4
Documentation
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#![allow(missing_docs, clippy::large_enum_variant)]

use crate::removable_value::RemovableValue;
use derive_builder::Builder;
use derive_more::From;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

/// A Vega-Lite top-level specification. This is the root class for all Vega-Lite
/// specifications. (The json schema is generated from this type.)
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Vegalite {
    /// URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you
    /// have a reason to change this, use `https://vega.github.io/schema/vega-lite/v4.json`.
    /// Setting the `$schema` property allows automatic validation and autocomplete in editors
    /// that support JSON schema.
    #[serde(rename = "$schema")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default = "Some(\"https://vega.github.io/schema/vega-lite/v4.17.0.json\".to_string())"
    )]
    pub schema: Option<String>,
    /// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
    /// `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// Alternatively, an object value of the form `{"row": string, "column": string}` can be
    /// used to supply different alignments for rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<VegaliteAlign>,
    /// How the visualization size should be determined. If a string, should be one of `"pad"`,
    /// `"fit"` or `"none"`. Object values can additionally specify parameters for content sizing
    /// and automatic resizing.
    ///
    /// __Default value__: `pad`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub autosize: Option<Autosize>,
    /// CSS color property to use as the background of the entire view.
    ///
    /// __Default value:__ `"white"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub background: Option<Color>,
    /// The bounds calculation method to use for determining the extent of a sub-plot. One of
    /// `full` (the default) or `flush`.
    ///
    /// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
    /// be used. - If set to `flush`, only the specified width and height values for the sub-view
    /// will be used. The `flush` setting can be useful when attempting to place sub-plots
    /// without axes or legends into a uniform grid structure.
    ///
    /// __Default value:__ `"full"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bounds: Option<Bounds>,
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// An object value of the form `{"row": boolean, "column": boolean}` can be used to supply
    /// different centering values for rows and columns.
    ///
    /// __Default value:__ `false`
    ///
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Center>,
    /// Vega-Lite configuration object. This property can only be defined at the top-level of a
    /// specification.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub config: Option<Box<Config>>,
    /// An object describing the data source. Set to `null` to ignore the parent's data source.
    /// If no data is set, it is derived from the parent.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub data: RemovableValue<UrlData>,
    /// A global data store for named datasets. This is a mapping from names to inline datasets.
    /// This can be an array of objects or primitive values or a string. Arrays of primitive
    /// values are ingested as objects with a `data` property.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datasets: Option<HashMap<String, InlineDatasetValue>>,
    /// Description of this mark for commenting purpose.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// A key-value mapping between encoding channels and definition of fields.
    ///
    /// A shared key-value mapping between encoding channels and definition of fields in the
    /// underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<Box<EdEncoding>>,
    /// The height of a visualization.
    ///
    /// - For a plot with a continuous y-field, height should be a number. - For a plot with
    /// either a discrete y-field or no y-field, height can be either a number indicating a fixed
    /// height or an object in the form of `{step: number}` defining the height per discrete
    /// step. (No y-field is equivalent to having one discrete step.) - To enable responsive
    /// sizing on height, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous
    /// y-field and `config.view.discreteHeight` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// height of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<HeightUnion>,
    /// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
    /// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
    /// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<AnyMark>,
    /// Name of the visualization for later reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// The default visualization padding, in pixels, from the edge of the visualization canvas
    /// to the data rectangle. If a number, specifies padding for all sides. If an object, the
    /// value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify
    /// padding for each side of the visualization.
    ///
    /// __Default value__: `5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding: Option<Padding>,
    /// Dynamic variables that parameterize a visualization.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub params: Option<Vec<Parameter>>,
    /// An object defining properties of geographic projection, which will be applied to `shape`
    /// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other
    /// marks.
    ///
    /// An object defining properties of the geographic projection shared by underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// Scale, axis, and legend resolutions for view composition specifications.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<Resolve>,
    /// A key-value mapping between selection names and definitions.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<HashMap<String, SelectionDef>>,
    /// The spacing in pixels between sub-views of the composition operator. An object of the
    /// form `{"row": number, "column": number}` can be used to set different spacing values for
    /// rows and columns.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    ///
    /// The spacing in pixels between sub-views of the concat operator.
    ///
    /// __Default value__: `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<Spacing>,
    /// Title for the plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<TitleUnion>,
    /// An array of data transformations such as filter and new field calculation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform: Option<Vec<Transform>>,
    /// Optional metadata that will be passed to Vega. This object is completely ignored by Vega
    /// and Vega-Lite and can be used for custom metadata.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub usermeta: Option<HashMap<String, Option<serde_json::Value>>>,
    /// An object defining the view background's fill and stroke.
    ///
    /// __Default value:__ none (transparent)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewBackground>,
    /// The width of a visualization.
    ///
    /// - For a plot with a continuous x-field, width should be a number. - For a plot with
    /// either a discrete x-field or no x-field, width can be either a number indicating a fixed
    /// width or an object in the form of `{step: number}` defining the width per discrete step.
    /// (No x-field is equivalent to having one discrete step.) - To enable responsive sizing on
    /// width, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous
    /// x-field and `config.view.discreteWidth` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// width of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<HeightUnion>,
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// Definition for how to facet the data. One of: 1) [a field definition for faceting the
    /// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
    /// object that maps `row` and `column` channels to their field
    /// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<Facet>,
    /// A specification of the view that gets faceted.
    ///
    /// A specification of the view that gets repeated.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spec: Option<Box<VegaliteSpec>>,
    /// Layer or single view specifications to be layered.
    ///
    /// __Note__: Specifications inside `layer` cannot use `row` and `column` channels as
    /// layering facet specifications is not allowed. Instead, use the [facet
    /// operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a
    /// facet.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<LayerElement>>,
    /// Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If
    /// `"repeat"` is an array, the field can be referred to as `{"repeat": "repeat"}`. The
    /// repeated views are laid out in a wrapped row. You can set the number of columns to
    /// control the wrapping. 2) An object that maps `"row"` and/or `"column"` to the listed
    /// fields to be repeated along the particular orientations. The objects `{"repeat": "row"}`
    /// and `{"repeat": "column"}` can be used to refer to the repeated field respectively.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatUnion>,
    /// A list of views to be concatenated.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub concat: Option<Vec<NormalizedSpec>>,
    /// A list of views to be concatenated and put into a column.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub vconcat: Option<Vec<NormalizedSpec>>,
    /// A list of views to be concatenated and put into a row.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hconcat: Option<Vec<NormalizedSpec>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RowColLayoutAlign {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<LayoutAlign>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<LayoutAlign>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AutoSizeParams {
    /// Determines how size calculation should be performed, one of `"content"` or `"padding"`.
    /// The default setting (`"content"`) interprets the width and height settings as the data
    /// rectangle (plotting) dimensions, to which padding is then added. In contrast, the
    /// `"padding"` setting includes the padding within the view size calculations, such that the
    /// width and height settings indicate the **total** intended size of the view.
    ///
    /// __Default value__: `"content"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub contains: Option<Contains>,
    /// A boolean flag indicating if autosize layout should be re-calculated on every view
    /// update.
    ///
    /// __Default value__: `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resize: Option<bool>,
    /// The sizing format type. One of `"pad"`, `"fit"`, `"fit-x"`, `"fit-y"`,  or `"none"`. See
    /// the [autosize type](https://vega.github.io/vega-lite/docs/size.html#autosize)
    /// documentation for descriptions of each.
    ///
    /// __Default value__: `"pad"`
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub auto_size_params_type: Option<AutosizeType>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BackgroundExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RowColBoolean {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<bool>,
}

/// Any specification in Vega-Lite.
///
/// Unit spec that can have a composite mark and row or column channels (shorthand for a
/// facet spec).
///
/// A full layered plot specification, which may contains `encoding` and `projection`
/// properties that will be applied to underlying unit (single-view) specifications.
///
/// Base interface for a repeat specification.
///
/// Base interface for a facet specification.
///
/// Base interface for a generalized concatenation specification.
///
/// Base interface for a vertical concatenation specification.
///
/// Base interface for a horizontal concatenation specification.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct NormalizedSpec {
    /// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
    /// `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// Alternatively, an object value of the form `{"row": string, "column": string}` can be
    /// used to supply different alignments for rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<VegaliteAlign>,
    /// The bounds calculation method to use for determining the extent of a sub-plot. One of
    /// `full` (the default) or `flush`.
    ///
    /// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
    /// be used. - If set to `flush`, only the specified width and height values for the sub-view
    /// will be used. The `flush` setting can be useful when attempting to place sub-plots
    /// without axes or legends into a uniform grid structure.
    ///
    /// __Default value:__ `"full"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bounds: Option<Bounds>,
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// An object value of the form `{"row": boolean, "column": boolean}` can be used to supply
    /// different centering values for rows and columns.
    ///
    /// __Default value:__ `false`
    ///
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Center>,
    /// An object describing the data source. Set to `null` to ignore the parent's data source.
    /// If no data is set, it is derived from the parent.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub data: RemovableValue<UrlData>,
    /// Description of this mark for commenting purpose.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// A key-value mapping between encoding channels and definition of fields.
    ///
    /// A shared key-value mapping between encoding channels and definition of fields in the
    /// underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<EdEncoding>,
    /// The height of a visualization.
    ///
    /// - For a plot with a continuous y-field, height should be a number. - For a plot with
    /// either a discrete y-field or no y-field, height can be either a number indicating a fixed
    /// height or an object in the form of `{step: number}` defining the height per discrete
    /// step. (No y-field is equivalent to having one discrete step.) - To enable responsive
    /// sizing on height, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous
    /// y-field and `config.view.discreteHeight` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// height of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<HeightUnion>,
    /// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
    /// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
    /// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<AnyMark>,
    /// Name of the visualization for later reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An object defining properties of geographic projection, which will be applied to `shape`
    /// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other
    /// marks.
    ///
    /// An object defining properties of the geographic projection shared by underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// Scale, axis, and legend resolutions for view composition specifications.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<Resolve>,
    /// A key-value mapping between selection names and definitions.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<HashMap<String, SelectionDef>>,
    /// The spacing in pixels between sub-views of the composition operator. An object of the
    /// form `{"row": number, "column": number}` can be used to set different spacing values for
    /// rows and columns.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    ///
    /// The spacing in pixels between sub-views of the concat operator.
    ///
    /// __Default value__: `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<Spacing>,
    /// Title for the plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<TitleUnion>,
    /// An array of data transformations such as filter and new field calculation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform: Option<Vec<Transform>>,
    /// An object defining the view background's fill and stroke.
    ///
    /// __Default value:__ none (transparent)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewBackground>,
    /// The width of a visualization.
    ///
    /// - For a plot with a continuous x-field, width should be a number. - For a plot with
    /// either a discrete x-field or no x-field, width can be either a number indicating a fixed
    /// width or an object in the form of `{step: number}` defining the width per discrete step.
    /// (No x-field is equivalent to having one discrete step.) - To enable responsive sizing on
    /// width, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous
    /// x-field and `config.view.discreteWidth` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// width of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<HeightUnion>,
    /// Layer or single view specifications to be layered.
    ///
    /// __Note__: Specifications inside `layer` cannot use `row` and `column` channels as
    /// layering facet specifications is not allowed. Instead, use the [facet
    /// operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a
    /// facet.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<LayerElement>>,
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If
    /// `"repeat"` is an array, the field can be referred to as `{"repeat": "repeat"}`. The
    /// repeated views are laid out in a wrapped row. You can set the number of columns to
    /// control the wrapping. 2) An object that maps `"row"` and/or `"column"` to the listed
    /// fields to be repeated along the particular orientations. The objects `{"repeat": "row"}`
    /// and `{"repeat": "column"}` can be used to refer to the repeated field respectively.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatUnion>,
    /// A specification of the view that gets repeated.
    ///
    /// A specification of the view that gets faceted.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spec: Option<NormalizedSpecSpec>,
    /// Definition for how to facet the data. One of: 1) [a field definition for faceting the
    /// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
    /// object that maps `row` and `column` channels to their field
    /// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<Facet>,
    /// A list of views to be concatenated.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub concat: Option<Vec<NormalizedSpec>>,
    /// A list of views to be concatenated and put into a column.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub vconcat: Option<Vec<NormalizedSpec>>,
    /// A list of views to be concatenated and put into a row.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hconcat: Option<Vec<NormalizedSpec>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct UrlData {
    /// An object that specifies the format for parsing the data.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<DataFormat>,
    /// Provide a placeholder name and bind data at runtime.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An URL from which to load the data set. Use the `format.type` property to ensure the
    /// loaded data is correctly parsed.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<String>,
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub values: Option<UrlDataInlineDataset>,
    /// Generate a sequence of numbers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sequence: Option<SequenceParams>,
    /// Generate sphere GeoJSON data for the full globe.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sphere: Option<SphereUnion>,
    /// Generate graticule GeoJSON data for geographic reference lines.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub graticule: Option<Graticule>,
}

/// An object that specifies the format for parsing the data.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DataFormat {
    /// 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.
    ///
    /// For `"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)
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub parse: RemovableValue<HashMap<String, Option<String>>>,
    /// Type of input data: `"json"`, `"csv"`, `"tsv"`, `"dsv"`.
    ///
    /// __Default value:__  The default format type is determined by the extension of the file
    /// URL. If no extension is detected, `"json"` will be used by default.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub data_format_type: Option<DataFormatType>,
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub delimiter: Option<String>,
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub property: Option<String>,
    /// The name of the TopoJSON object set to convert to a GeoJSON feature collection. For
    /// example, in a map of the world, there may be an object set named `"countries"`. Using the
    /// feature property, we can extract this set and generate a GeoJSON feature object for each
    /// country.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub feature: Option<String>,
    /// The name of the TopoJSON object set to convert to mesh. Similar to the `feature` option,
    /// `mesh` extracts a named TopoJSON object set.   Unlike the `feature` option, the
    /// corresponding geo data is returned as a single, unified mesh instance, not as individual
    /// GeoJSON features. Extracting a mesh is useful for more efficiently drawing borders or
    /// other geographic elements that you do not need to associate with specific regions such as
    /// individual countries, states or counties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mesh: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GraticuleParams {
    /// Sets both the major and minor extents to the same values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<Vec<Vec<f64>>>,
    /// The major extent of the graticule as a two-element array of coordinates.
    #[serde(rename = "extentMajor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent_major: Option<Vec<Vec<f64>>>,
    /// The minor extent of the graticule as a two-element array of coordinates.
    #[serde(rename = "extentMinor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent_minor: Option<Vec<Vec<f64>>>,
    /// The precision of the graticule in degrees.
    ///
    /// __Default value:__ `2.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub precision: Option<f64>,
    /// Sets both the major and minor step angles to the same values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<Vec<f64>>,
    /// The major step angles of the graticule.
    ///
    ///
    /// __Default value:__ `[90, 360]`
    #[serde(rename = "stepMajor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step_major: Option<Vec<f64>>,
    /// The minor step angles of the graticule.
    ///
    /// __Default value:__ `[10, 10]`
    #[serde(rename = "stepMinor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step_minor: Option<Vec<f64>>,
}

/// Generate a sequence of numbers.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SequenceParams {
    /// The name of the generated sequence field.
    ///
    /// __Default value:__ `"data"`
    #[serde(rename = "as")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sequence_params_as: Option<String>,
    /// The starting value of the sequence (inclusive).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start: Option<f64>,
    /// The step value between sequence entries.
    ///
    /// __Default value:__ `1`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// The ending value of the sequence (exclusive).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stop: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SphereClass {}

/// A key-value mapping between encoding channels and definition of fields.
///
/// A shared key-value mapping between encoding channels and definition of fields in the
/// underlying layers.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct EdEncoding {
    /// Rotation angle of point and text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<AngleClass>,
    /// Color of the marks – either fill or stroke color based on  the `filled` property of mark
    /// definition. By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,
    /// `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and
    /// `"point"`.
    ///
    /// __Default value:__ If undefined, the default color depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _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).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<ColorClass>,
    /// A field definition for the horizontal facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<RowColumnEncodingFieldDef>,
    /// A text description of this mark for ARIA accessibility (SVG output only). For SVG output
    /// the `"aria-label"` attribute will be set to this description.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<DescriptionClass>,
    /// Additional levels of detail for grouping data in aggregate views and in line, trail, and
    /// area marks without mapping data to a specific visual channel.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub detail: Option<Detail>,
    /// A field definition for the (flexible) facet of trellis plots.
    ///
    /// If either `row` or `column` is specified, this channel will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<FacetEncodingFieldDef>,
    /// Fill color of the marks. __Default value:__ If undefined, the default color depends on
    /// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _Note:_ The `fill` encoding has higher precedence than `color`, thus may override the
    /// `color` encoding if conflicting encodings are specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<FillClass>,
    /// Fill opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
    /// property.
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<FillOpacityClass>,
    /// A URL to load upon mouse click.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<HrefClass>,
    /// A data field to use as a unique key for data binding. When a visualization’s data is
    /// updated, the key value will be used to match data elements to existing mark instances.
    /// Use a key channel to enable object constancy for transitions over dynamic data.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub key: Option<KeyClass>,
    /// Latitude position of geographically projected marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub latitude: Option<LatitudeClass>,
    /// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
    /// `"rule"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub latitude2: Option<Latitude2Class>,
    /// Longitude position of geographically projected marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub longitude: Option<LongitudeClass>,
    /// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
    /// and  `"rule"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub longitude2: Option<Longitude2Class>,
    /// Opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
    /// property.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<OpacityClass>,
    /// Order of the marks. - For stacked marks, this `order` channel encodes [stack
    /// order](https://vega.github.io/vega-lite/docs/stack.html#order). - For line and trail
    /// marks, this `order` channel encodes order of data points in the lines. This can be useful
    /// for creating [a connected
    /// scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html).
    /// Setting `order` to `{"value": null}` makes the line marks use the original order in the
    /// data sources. - Otherwise, this `order` channel encodes layer order of the marks.
    ///
    /// __Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating
    /// additional aggregation grouping.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<Order>,
    /// The outer radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<RadiusClass>,
    /// The inner radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<Radius2Class>,
    /// A field definition for the vertical facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<RowColumnEncodingFieldDef>,
    /// Shape of the mark.
    ///
    /// 1. For `point` marks the supported values include:    - plotting shapes: `"circle"`,
    /// `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, `"triangle-down"`,
    /// `"triangle-right"`, or `"triangle-left"`.    - the line symbol `"stroke"`    - centered
    /// directional shapes `"arrow"`, `"wedge"`, or `"triangle"`    - a custom [SVG path
    /// string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct
    /// sizing, custom shape paths should be defined within a square bounding box with
    /// coordinates ranging from -1 to 1 along both the x and y dimensions.)
    ///
    /// 2. For `geoshape` marks it should be a field definition of the geojson data
    ///
    /// __Default value:__ If undefined, the default shape depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape`
    /// property. (`"circle"` if unset.)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<MarkPropDefStringNullTypeForShape>,
    /// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
    /// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
    /// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
    /// `"trail"` instead of line with varying size)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<SizeClass>,
    /// Stroke color of the marks. __Default value:__ If undefined, the default color depends on
    /// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the
    /// `color` encoding if conflicting encodings are specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<StrokeClass>,
    /// Stroke dash of the marks.
    ///
    /// __Default value:__ `[1,0]` (No dash).
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<MarkPropDefNumber>,
    /// Stroke opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
    /// property.
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<StrokeOpacityClass>,
    /// Stroke width of the marks.
    ///
    /// __Default value:__ If undefined, the default stroke width depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
    /// property.
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<StrokeWidthClass>,
    /// Text of the `text` mark.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<TextDef>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<ThetaClass>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<Theta2Class>,
    /// The tooltip text to show upon mouse hover. Specifying `tooltip` encoding overrides [the
    /// `tooltip` property in the mark
    /// definition](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip in Vega-Lite.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<EncodingTooltip>,
    /// The URL of an image mark.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<UrlClass>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XClass>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<X2Class>,
    /// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "xError")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_error: Option<XErrorClass>,
    /// Secondary error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "xError2")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_error2: Option<XError2Class>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YClass>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<Y2Class>,
    /// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "yError")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_error: Option<YErrorClass>,
    /// Secondary error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "yError2")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_error2: Option<YError2Class>,
}

/// Rotation angle of point and text marks.
///
/// Fill opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
/// property.
///
/// Opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
/// property.
///
/// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
/// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
/// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
/// `"trail"` instead of line with varying size)
///
/// Stroke opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
/// property.
///
/// Stroke width of the marks.
///
/// __Default value:__ If undefined, the default stroke width depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
/// property.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AngleClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<AngleCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ArgmDef {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub argmax: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub argmin: Option<String>,
}

/// Binning properties or boolean flag for determining whether to bin data or not.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BinParams {
    /// A value in the binned domain at which to anchor the bins, shifting the bin boundaries if
    /// necessary to ensure that a boundary aligns with the anchor value.
    ///
    /// __Default value:__ the minimum bin extent value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub anchor: Option<f64>,
    /// The number base to use for automatic bin determination (default is base 10).
    ///
    /// __Default value:__ `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub base: Option<f64>,
    /// When set to `true`, Vega-Lite treats the input data as already binned.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub binned: Option<bool>,
    /// Scale factors indicating allowable subdivisions. The default value is [5, 2], which
    /// indicates that for base 10 numbers (the default base), the method may consider dividing
    /// bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can
    /// check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the
    /// given constraints.
    ///
    /// __Default value:__ `[5, 2]`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub divide: Option<Vec<f64>>,
    /// A two-element (`[min, max]`) array indicating the range of desired bin values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<BinExtent>,
    /// Maximum number of bins.
    ///
    /// __Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub maxbins: Option<f64>,
    /// A minimum allowable step size (particularly useful for integer values).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minstep: Option<f64>,
    /// If true, attempts to make the bin boundaries use human-friendly boundaries, such as
    /// multiples of ten.
    ///
    /// __Default value:__ `true`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub nice: Option<bool>,
    /// An exact step size to use between bins.
    ///
    /// __Note:__ If provided, options such as maxbins will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// An array of allowable step sizes to choose from.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub steps: Option<Vec<f64>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BinExtentClass {
    /// The field name to extract selected values for, when a selection is
    /// [projected](https://vega.github.io/vega-lite/docs/project.html) over multiple fields or
    /// encodings.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// The name of a selection.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<String>,
    /// The encoding channel to extract selected values for, when a selection is
    /// [projected](https://vega.github.io/vega-lite/docs/project.html) over multiple fields or
    /// encodings.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<SingleDefUnitChannel>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalValueDefNumberExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefNumberExprRefValue>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Selection {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub not: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub and: Option<Vec<SelectionCompositionElement>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub or: Option<Vec<SelectionCompositionElement>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Predicate {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub not: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub and: Option<Vec<PredicateCompositionElement>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub or: Option<Vec<PredicateCompositionElement>>,
    /// The value that the field should be equal to.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub equal: Option<Equal>,
    /// Field to be tested.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// Time unit for the field to be tested.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// An array of inclusive minimum and maximum values for a field value of a data item to be
    /// included in the filtered data.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub range: Option<LogicalNotPredicateRange>,
    /// A set of values that the `field`'s value should be a member of, for a data item included
    /// in the filtered data.
    #[serde(rename = "oneOf")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub one_of: Option<Vec<SelectionInitInterval>>,
    /// The value that the field should be less than.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub lt: Option<Lt>,
    /// The value that the field should be greater than.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gt: Option<Lt>,
    /// The value that the field should be less than or equals to.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub lte: Option<Lt>,
    /// The value that the field should be greater than or equals to.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gte: Option<Lt>,
    /// If set to true the field's value has to be valid, meaning both not `null` and not
    /// [`NaN`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub valid: Option<bool>,
    /// Filter using a selection name or a logical composition of selection names.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct EqualDateTime {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GtDateTime {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DateTime {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RangeDateTime {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TimeUnitParams {
    /// If no `unit` is specified, maxbins is used to infer time units.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub maxbins: Option<f64>,
    /// The number of steps between bins, in terms of the least significant unit provided.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// Defines how date-time values should be binned.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub unit: Option<TimeUnit>,
    /// True to use UTC timezone. Equivalent to using a `utc` prefixed `TimeUnit`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefNumberExprRefClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_value_def_number_expr_ref_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
///
/// Reference to a repeated value.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RepeatRefClass {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatEnum>,
}

/// Reference to a repeated value.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RepeatRef {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatEnum>,
}

/// Properties of a legend or boolean flag for determining whether to show it.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Legend {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "clipHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clip_height: Option<CornerRadiusUnion>,
    #[serde(rename = "columnPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column_padding: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    /// The direction of the legend, one of `"vertical"` or `"horizontal"`.
    ///
    /// __Default value:__ - For top-/bottom-`orient`ed legends, `"horizontal"` - For
    /// left-/right-`orient`ed legends, `"vertical"` - For top/bottom-left/right-`orient`ed
    /// legends, `"horizontal"` for gradient legends and `"vertical"` for symbol legends.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub direction: Option<Orientation>,
    #[serde(rename = "fillColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_color: Option<Color>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    #[serde(rename = "gradientLength")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_length: Option<FontSize>,
    #[serde(rename = "gradientOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "gradientStrokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_stroke_color: Option<Color>,
    #[serde(rename = "gradientStrokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_stroke_width: Option<FontSize>,
    #[serde(rename = "gradientThickness")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_thickness: Option<FontSize>,
    #[serde(rename = "gridAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_align: Option<GridAlign>,
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<TitleAlignUnion>,
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<TextBaseline>,
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<Color>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the legend's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<Color>,
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<FontSize>,
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<Color>,
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOverlap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_overlap: Option<LabelOverlapUnion>,
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "labelSeparation")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_separation: Option<CornerRadiusUnion>,
    #[serde(rename = "legendX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend_x: Option<CornerRadiusUnion>,
    #[serde(rename = "legendY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend_y: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<CornerRadiusUnion>,
    /// The orientation of the legend, which determines how the legend is positioned within the
    /// scene. One of `"left"`, `"right"`, `"top"`, `"bottom"`, `"top-left"`, `"top-right"`,
    /// `"bottom-left"`, `"bottom-right"`, `"none"`.
    ///
    /// __Default value:__ `"right"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<LegendOrient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding: Option<CornerRadiusUnion>,
    #[serde(rename = "rowPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_color: Option<Color>,
    #[serde(rename = "symbolDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_dash: Option<StrokeDashUnion>,
    #[serde(rename = "symbolDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolFillColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_fill_color: Option<Color>,
    #[serde(rename = "symbolLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_size: Option<FontSize>,
    #[serde(rename = "symbolStrokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_stroke_color: Option<Color>,
    #[serde(rename = "symbolStrokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_stroke_width: Option<FontSize>,
    #[serde(rename = "symbolType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_type: Option<Color>,
    #[serde(rename = "tickCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_count: Option<TickCount>,
    /// The minimum desired step between legend 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.
    ///
    /// __Default value__: `undefined`
    #[serde(rename = "tickMinStep")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_min_step: Option<CornerRadiusUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorUnion>,
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<CornerRadiusUnion>,
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<FontSize>,
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOrient")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_orient: Option<TitleOrientUnion>,
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
    /// The type of the legend. Use `"symbol"` to create a discrete legend and `"gradient"` for a
    /// continuous color gradient.
    ///
    /// __Default value:__ `"gradient"` for non-binned quantitative fields and temporal fields;
    /// `"symbol"` otherwise.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend_type: Option<LegendType>,
    /// Explicitly set the visible legend values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub values: Option<Values>,
    /// A non-negative integer indicating the z-index of the legend. If zindex is 0, legend
    /// should be drawn behind all chart elements. To put them in front, use zindex = 1.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TickCountTimeIntervalStep {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interval: Option<TimeInterval>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Scale {
    /// The alignment of the steps within the scale range.
    ///
    /// This 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.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<CornerRadiusUnion>,
    /// The logarithm base of the `log` scale (default `10`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub base: Option<CornerRadiusUnion>,
    /// Bin boundaries can be provided to scales as either an explicit array of bin boundaries or
    /// as a bin specification object. The legal values are: - An [array](../types/#Array)
    /// literal of bin boundary values. For example, `[0, 5, 10, 15, 20]`. The array must include
    /// both starting and ending boundaries. The previous example uses five values to indicate a
    /// total of four bin intervals: [0-5), [5-10), [10-15), [15-20]. Array literals may include
    /// signal references as elements. - A [bin specification
    /// object](https://vega.github.io/vega-lite/docs/scale.html#bins) that indicates the bin
    /// _step_ size, and optionally the _start_ and _stop_ boundaries. - 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bins: Option<ScaleBins>,
    /// If `true`, values that exceed the data domain are clamped to either the minimum or
    /// maximum range value
    ///
    /// __Default value:__ derived from the [scale
    /// config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true`
    /// by default).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clamp: Option<Aria>,
    /// A constant determining the slope of the symlog function around zero. Only used for
    /// `symlog` scales.
    ///
    /// __Default value:__ `1`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub constant: Option<CornerRadiusUnion>,
    /// Customized domain values in the form of constant values or dynamic values driven by a
    /// selection.
    ///
    /// 1) Constant `domain` for _quantitative_ fields can take one of the following forms:
    ///
    /// - A two-element array with minimum and maximum values. To create a diverging scale, this
    /// two-element array can be combined with the `domainMid` property. - An array with more
    /// than two entries, for [Piecewise quantitative
    /// scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). - A string value
    /// `"unaggregated"`, if the input field is aggregated, to indicate that the domain should
    /// include the raw data values prior to the aggregation.
    ///
    /// 2) Constant `domain` for _temporal_ fields can be a two-element array with 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).
    ///
    /// 3) Constant `domain` for _ordinal_ and _nominal_ fields can be an array that lists valid
    /// input values.
    ///
    /// 4) To combine (union) specified constant domain with the field's values, `domain` can be
    /// an object with a `unionWith` property that specify constant domain to be combined. For
    /// example, `domain: {unionWith: [0, 100]}` for a quantitative scale means that the scale
    /// domain always includes `[0, 100]`, but will include other values in the fields beyond
    /// `[0, 100]`.
    ///
    /// 5) Domain can also takes an object defining a field or encoding of a selection that
    /// [interactively
    /// determines](https://vega.github.io/vega-lite/docs/selection.html#scale-domains) the scale
    /// domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain: Option<DomainUnion>,
    /// Sets the maximum value in the scale domain, overriding the `domain` property. This
    /// property is only intended for use with scales having continuous domains.
    #[serde(rename = "domainMax")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_max: Option<DomainM>,
    /// 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.
    #[serde(rename = "domainMid")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_mid: Option<CornerRadiusUnion>,
    /// Sets the minimum value in the scale domain, overriding the domain property. This property
    /// is only intended for use with scales having continuous domains.
    #[serde(rename = "domainMin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_min: Option<DomainM>,
    /// The exponent of the `pow` scale.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub exponent: Option<CornerRadiusUnion>,
    /// 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).
    ///
    /// * __Default value:__ `hcl`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<ScaleInterpolate>,
    /// 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]_.
    ///
    /// For 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.
    ///
    /// For temporal fields with time and utc scales, the `nice` value can be a string indicating
    /// the desired time interval. Legal values are `"millisecond"`, `"second"`, `"minute"`,
    /// `"hour"`, `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, `time` and `utc`
    /// scales can accept an object-valued interval specifier of the form `{"interval": "month",
    /// "step": 3}`, which includes a desired number of interval steps. Here, the domain would
    /// snap to quarter (Jan, Apr, Jul, Oct) boundaries.
    ///
    /// __Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub nice: Option<Nice>,
    /// 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.
    ///
    /// For _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for
    /// setting `paddingInner` and `paddingOuter` to the same value.
    ///
    /// For _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for
    /// `paddingOuter`.
    ///
    /// __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_.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding: Option<CornerRadiusUnion>,
    /// 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].
    ///
    /// For point scale, this property is invalid as point scales do not have internal band
    /// widths (only step sizes between bands).
    ///
    /// __Default value:__ derived from the [scale
    /// config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`.
    #[serde(rename = "paddingInner")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding_inner: Option<CornerRadiusUnion>,
    /// 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].
    ///
    /// __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_.
    #[serde(rename = "paddingOuter")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding_outer: Option<CornerRadiusUnion>,
    /// The range of the scale. One of:
    ///
    /// - 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"`).
    ///
    /// - 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).
    ///
    /// - 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 or an object with a `field` property representing the
    /// range values.  For example, if a field `color` contains CSS color names, we can set
    /// `range` to `{field: "color"}`.
    ///
    /// __Notes:__
    ///
    /// 1) For color scales you can also specify a color
    /// [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.
    ///
    /// 2) 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`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub range: Option<ScaleRange>,
    /// Sets the maximum value in the scale range, overriding the `range` property or the default
    /// range. This property is only intended for use with scales having continuous ranges.
    #[serde(rename = "rangeMax")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub range_max: Option<RangeM>,
    /// Sets the minimum value in the scale range, overriding the `range` property or the default
    /// range. This property is only intended for use with scales having continuous ranges.
    #[serde(rename = "rangeMin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub range_min: Option<RangeM>,
    /// If true, reverses the order of the scale range. __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub reverse: Option<Aria>,
    /// If `true`, rounds numeric output values to integers. This can be helpful for snapping to
    /// the pixel grid.
    ///
    /// __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub round: Option<Aria>,
    /// 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).
    ///
    /// Discrete 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.
    ///
    /// For the full list of supported schemes, please refer to the [Vega
    /// Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub scheme: Option<Scheme>,
    /// The type of scale. Vega-Lite supports the following categories of scale types:
    ///
    /// 1) [**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).
    ///
    /// 2) [**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.
    ///
    /// 3) [**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).
    ///
    /// __Default value:__ please see the [scale type
    /// table](https://vega.github.io/vega-lite/docs/scale.html#type).
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub scale_type: Option<ScaleType>,
    /// If `true`, ensures that a zero baseline value is included in the scale domain.
    ///
    /// __Default value:__ `true` for x and y channels if the quantitative field is not binned
    /// and no custom `domain` is provided; `false` otherwise.
    ///
    /// __Note:__ Log, time, and utc scales do not support `zero`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zero: Option<Aria>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ScaleBinParams {
    /// The starting (lowest-valued) bin boundary.
    ///
    /// __Default value:__ The lowest value of the scale domain will be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start: Option<f64>,
    /// The step size defining the bin interval width.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// The stopping (highest-valued) bin boundary.
    ///
    /// __Default value:__ The highest value of the scale domain will be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stop: Option<f64>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DomainDateTime {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DomainUnionWith {
    /// The field name to extract selected values for, when a selection is
    /// [projected](https://vega.github.io/vega-lite/docs/project.html) over multiple fields or
    /// encodings.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// The name of a selection.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<String>,
    /// The encoding channel to extract selected values for, when a selection is
    /// [projected](https://vega.github.io/vega-lite/docs/project.html) over multiple fields or
    /// encodings.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<SingleDefUnitChannel>,
    /// Customized domain values to be union with the field's values.
    ///
    /// 1) `domain` for _quantitative_ fields can take one of the following forms:
    ///
    /// - a two-element array with minimum and maximum values. - an array with more than two
    /// entries, for [Piecewise  quantitative
    /// scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). (Alternatively, the
    /// `domainMid` property can be set for a diverging scale.) - a string value
    /// `"unaggregated"`, if the input field is aggregated, to indicate that the domain should
    /// include the raw data values prior to the aggregation.
    ///
    /// 2) `domain` for _temporal_ fields 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).
    ///
    /// 3) `domain` for _ordinal_ and _nominal_ fields can be an array that lists valid input
    /// values.
    #[serde(rename = "unionWith")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub union_with: Option<Vec<SelectionInitInterval>>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

/// Object for defining datetime in Vega-Lite Filter. If both month and quarter are provided,
/// month has higher precedence. `day` cannot be combined with other date. We accept string
/// for month and day names.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DomainMaxDateTime {
    /// Integer value representing the date (day of the month) from 1-31.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub date: Option<f64>,
    /// Value representing the day of a week. This can be one of: (1) integer value -- `1`
    /// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
    /// case-insensitive, 3-character short day name (e.g., `"Mon"`).
    ///
    /// **Warning:** A DateTime definition object with `day`** should not be combined with
    /// `year`, `quarter`, `month`, or `date`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub day: Option<Day>,
    /// Integer value representing the hour of a day from 0-23.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hours: Option<f64>,
    /// Integer value representing the millisecond segment of time.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub milliseconds: Option<f64>,
    /// Integer value representing the minute segment of time from 0-59.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minutes: Option<f64>,
    /// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
    /// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
    /// short month name (e.g., `"Jan"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub month: Option<Month>,
    /// Integer value representing the quarter of the year (from 1-4).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quarter: Option<f64>,
    /// Integer value representing the second segment (0-59) of a time value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub seconds: Option<f64>,
    /// A boolean flag indicating if date time is in utc time. If false, the date time is in
    /// local time
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub utc: Option<bool>,
    /// Integer value representing the year.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub year: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gamma: Option<f64>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr_ref_type: Option<ExprRefType>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct NiceTimeIntervalStep {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interval: Option<TimeInterval>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RangeClass {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SchemeParams {
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub count: Option<f64>,
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<Vec<f64>>,
    /// A color scheme name for ordinal scales (e.g., `"category10"` or `"blues"`).
    ///
    /// For the full list of supported schemes, please refer to the [Vega
    /// Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

/// A sort definition for sorting a discrete scale in an encoding field definition.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct EncodingSortField {
    /// The data [field](https://vega.github.io/vega-lite/docs/field.html) to sort by.
    ///
    /// __Default value:__ If unspecified, defaults to the field specified in the outer data
    /// reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An [aggregate operation](https://vega.github.io/vega-lite/docs/aggregate.html#ops) to
    /// perform on the field prior to sorting (e.g., `"count"`, `"mean"` and `"median"`). An
    /// aggregation is required when there are multiple values of the sort field for each encoded
    /// data field. The input data objects will be aggregated, grouped by the encoded data
    /// field.
    ///
    /// For a full list of operations, please see the documentation for
    /// [aggregate](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
    ///
    /// __Default value:__ `"sum"` for stacked plots. Otherwise, `"min"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<NonArgAggregateOp>,
    /// The sort order. One of `"ascending"` (default), `"descending"`, or `null` (no not sort).
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub order: RemovableValue<SortOrder>,
    /// The [encoding channel](https://vega.github.io/vega-lite/docs/encoding.html#channels) to
    /// sort by (e.g., `"x"`, `"y"`)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<SortByChannel>,
}

/// Color of the marks – either fill or stroke color based on  the `filled` property of mark
/// definition. By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,
/// `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and
/// `"point"`.
///
/// __Default value:__ If undefined, the default color depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _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).
///
/// Fill color of the marks. __Default value:__ If undefined, the default color depends on
/// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _Note:_ The `fill` encoding has higher precedence than `color`, thus may override the
/// `color` encoding if conflicting encodings are specified.
///
/// Stroke color of the marks. __Default value:__ If undefined, the default color depends on
/// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the
/// `color` encoding if conflicting encodings are specified.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ColorClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ColorCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_gradient_string_null_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefGradientStringNullExprRefValue>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalValueDefGradientStringNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefGradientStringNullExprRefValue>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ValueLinearGradient {
    /// The type of gradient. Use `"linear"` for a linear gradient.
    ///
    /// The type of gradient. Use `"radial"` for a radial gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient: Option<Gradient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub id: Option<String>,
    /// An array of gradient stops defining the gradient color sequence.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stops: Option<Vec<GradientStop>>,
    /// The starting x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x1: Option<f64>,
    /// The ending x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `1`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<f64>,
    /// The starting y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y1: Option<f64>,
    /// The ending y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the inner circle for the
    /// gradient.
    ///
    /// __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r1: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the outer circle for the
    /// gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r2: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GradientStop {
    /// The color value at this point in the gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<String>,
    /// The offset fraction for the color stop, indicating its position within the gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefGradientStringNullExprRefClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefGradientStringNullExprRefValue>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_value_def_gradient_string_null_expr_ref_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
}

/// A field definition for the horizontal facet of trellis plots.
///
/// A field definition for the vertical facet of trellis plots.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RowColumnEncodingFieldDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// The alignment to apply to row/column facet's subplot. The supported string values are
    /// `"all"`, `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<LayoutAlign>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// Boolean flag indicating if facet's subviews should be centered relative to their
    /// respective rows or columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<bool>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of a facet's header.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<Header>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` is not supported for `row` and `column`.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<PurpleSortArray>,
    /// The spacing in pixels between facet's sub-views.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<f64>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row_column_encoding_field_def_type: Option<StandardType>,
}

/// An object defining properties of a facet's header.
///
/// Headers of row / column channels for faceted plots.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Header {
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// Horizontal text alignment of header labels. One of `"left"`, `"center"`, or `"right"`.
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<TitleAlignUnion>,
    /// The anchor position for placing the labels. One of `"start"`, `"middle"`, or `"end"`. For
    /// example, with a label orientation of top these anchor positions map to a left-, center-,
    /// or right-aligned label.
    #[serde(rename = "labelAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_anchor: Option<TitleAnchorEnum>,
    /// The rotation angle of the header labels.
    ///
    /// __Default value:__ `0` for column header, `-90` for row header.
    #[serde(rename = "labelAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_angle: Option<f64>,
    /// The vertical text baseline for the header labels. One of `"alphabetic"` (default),
    /// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
    /// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
    /// relative to the `titleLineHeight` rather than `titleFontSize` alone.
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<TextBaseline>,
    /// The color of the header label, can be in hex color code or regular color name.
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<Color>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the header's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// The font of the header label.
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<Color>,
    /// The font size of the header label, in pixels.
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<CornerRadiusUnion>,
    /// The font style of the header label.
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<Color>,
    /// The font weight of the header label.
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeightUnion>,
    /// The maximum length of the header label in pixels. The text value will be automatically
    /// truncated if the rendered size exceeds the limit.
    ///
    /// __Default value:__ `0`, indicating no limit
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    /// Line height in pixels for multi-line header labels or title text with `"line-top"` or
    /// `"line-bottom"` baseline.
    #[serde(rename = "labelLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_line_height: Option<CornerRadiusUnion>,
    /// The orientation of the header label. One of `"top"`, `"bottom"`, `"left"` or `"right"`.
    #[serde(rename = "labelOrient")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_orient: Option<Orient>,
    /// The padding, in pixel, between facet header's label and the plot.
    ///
    /// __Default value:__ `10`
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<CornerRadiusUnion>,
    /// A boolean flag indicating if labels should be included as part of the header.
    ///
    /// __Default value:__ `true`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<bool>,
    /// Shortcut for setting both labelOrient and titleOrient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orient>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// Horizontal text alignment (to the anchor) of header titles.
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    /// The anchor position for placing the title. 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.
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorEnum>,
    /// The rotation angle of the header title.
    ///
    /// __Default value:__ `0`.
    #[serde(rename = "titleAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_angle: Option<f64>,
    /// The vertical text baseline for the header title. One of `"alphabetic"` (default),
    /// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
    /// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
    /// relative to the `titleLineHeight` rather than `titleFontSize` alone.
    ///
    /// __Default value:__ `"middle"`
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    /// Color of the header title, can be in hex color code or regular color name.
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    /// Font of the header title. (e.g., `"Helvetica Neue"`).
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    /// Font size of the header title.
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<CornerRadiusUnion>,
    /// The font style of the header title.
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    /// Font weight of the header title. This can be either a string (e.g `"bold"`, `"normal"`)
    /// or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` =
    /// `700`).
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    /// The maximum length of the header title in pixels. The text value will be automatically
    /// truncated if the rendered size exceeds the limit.
    ///
    /// __Default value:__ `0`, indicating no limit
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<CornerRadiusUnion>,
    /// Line height in pixels for multi-line header title text or title text with `"line-top"` or
    /// `"line-bottom"` baseline.
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    /// The orientation of the header title. One of `"top"`, `"bottom"`, `"left"` or `"right"`.
    #[serde(rename = "titleOrient")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_orient: Option<Orient>,
    /// The padding, in pixel, between facet header's title and the label.
    ///
    /// __Default value:__ `10`
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
}

/// A sort definition for sorting a discrete scale in an encoding field definition.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SortEncodingSortField {
    /// The data [field](https://vega.github.io/vega-lite/docs/field.html) to sort by.
    ///
    /// __Default value:__ If unspecified, defaults to the field specified in the outer data
    /// reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An [aggregate operation](https://vega.github.io/vega-lite/docs/aggregate.html#ops) to
    /// perform on the field prior to sorting (e.g., `"count"`, `"mean"` and `"median"`). An
    /// aggregation is required when there are multiple values of the sort field for each encoded
    /// data field. The input data objects will be aggregated, grouped by the encoded data
    /// field.
    ///
    /// For a full list of operations, please see the documentation for
    /// [aggregate](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
    ///
    /// __Default value:__ `"sum"` for stacked plots. Otherwise, `"min"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<NonArgAggregateOp>,
    /// The sort order. One of `"ascending"` (default), `"descending"`, or `null` (no not sort).
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub order: RemovableValue<SortOrder>,
}

/// A text description of this mark for ARIA accessibility (SVG output only). For SVG output
/// the `"aria-label"` attribute will be set to this description.
///
/// A URL to load upon mouse click.
///
/// The URL of an image mark.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DescriptionClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<DescriptionCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field_or_datum_def_with_condition_string_field_def_string_type: Option<StandardType>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleConditionalValueDefStringExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleConditionalExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_expr_ref_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
}

/// Field Def without scale (and without bin: "binned" support).
///
/// Definition object for a data field, its type and transformation of an encoding channel.
///
/// A data field to use as a unique key for data binding. When a visualization’s data is
/// updated, the key value will be used to match data elements to existing mark instances.
/// Use a key channel to enable object constancy for transitions over dynamic data.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TypedFieldDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub typed_field_def_type: Option<StandardType>,
}

/// A field definition for the (flexible) facet of trellis plots.
///
/// If either `row` or `column` is specified, this channel will be ignored.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FacetEncodingFieldDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
    /// `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// Alternatively, an object value of the form `{"row": string, "column": string}` can be
    /// used to supply different alignments for rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<VegaliteAlign>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// The bounds calculation method to use for determining the extent of a sub-plot. One of
    /// `full` (the default) or `flush`.
    ///
    /// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
    /// be used. - If set to `flush`, only the specified width and height values for the sub-view
    /// will be used. The `flush` setting can be useful when attempting to place sub-plots
    /// without axes or legends into a uniform grid structure.
    ///
    /// __Default value:__ `"full"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bounds: Option<Bounds>,
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// An object value of the form `{"row": boolean, "column": boolean}` can be used to supply
    /// different centering values for rows and columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Center>,
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of a facet's header.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<Header>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` is not supported for `row` and `column`.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<PurpleSortArray>,
    /// The spacing in pixels between sub-views of the composition operator. An object of the
    /// form `{"row": number, "column": number}` can be used to set different spacing values for
    /// rows and columns.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<Spacing>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet_encoding_field_def_type: Option<StandardType>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RowColNumber {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<f64>,
}

/// Color of the marks – either fill or stroke color based on  the `filled` property of mark
/// definition. By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,
/// `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and
/// `"point"`.
///
/// __Default value:__ If undefined, the default color depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _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).
///
/// Fill color of the marks. __Default value:__ If undefined, the default color depends on
/// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _Note:_ The `fill` encoding has higher precedence than `color`, thus may override the
/// `color` encoding if conflicting encodings are specified.
///
/// Stroke color of the marks. __Default value:__ If undefined, the default color depends on
/// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the
/// `color` encoding if conflicting encodings are specified.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FillClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ColorCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_gradient_string_null_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefGradientStringNullExprRefValue>,
}

/// Rotation angle of point and text marks.
///
/// Fill opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
/// property.
///
/// Opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
/// property.
///
/// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
/// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
/// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
/// `"trail"` instead of line with varying size)
///
/// Stroke opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
/// property.
///
/// Stroke width of the marks.
///
/// __Default value:__ If undefined, the default stroke width depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
/// property.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FillOpacityClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<AngleCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

/// A text description of this mark for ARIA accessibility (SVG output only). For SVG output
/// the `"aria-label"` attribute will be set to this description.
///
/// A URL to load upon mouse click.
///
/// The URL of an image mark.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct HrefClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<DescriptionCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field_or_datum_def_with_condition_string_field_def_string_type: Option<StandardType>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
}

/// Field Def without scale (and without bin: "binned" support).
///
/// Definition object for a data field, its type and transformation of an encoding channel.
///
/// A data field to use as a unique key for data binding. When a visualization’s data is
/// updated, the key value will be used to match data elements to existing mark instances.
/// Use a key channel to enable object constancy for transitions over dynamic data.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct KeyClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub typed_field_def_type: Option<StandardType>,
}

/// Latitude position of geographically projected marks.
///
/// Longitude position of geographically projected marks.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LatitudeClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub lat_long_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

/// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
/// `"rule"`.
///
/// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
/// and  `"rule"`.
///
/// The inner radius in pixels of arc marks.
///
/// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
/// values proceed clockwise.
///
/// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Latitude2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position2_def_type: Option<Type>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Latitude position of geographically projected marks.
///
/// Longitude position of geographically projected marks.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LongitudeClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub lat_long_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

/// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
/// `"rule"`.
///
/// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
/// and  `"rule"`.
///
/// The inner radius in pixels of arc marks.
///
/// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
/// values proceed clockwise.
///
/// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Longitude2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position2_def_type: Option<Type>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Rotation angle of point and text marks.
///
/// Fill opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
/// property.
///
/// Opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
/// property.
///
/// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
/// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
/// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
/// `"trail"` instead of line with varying size)
///
/// Stroke opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
/// property.
///
/// Stroke width of the marks.
///
/// __Default value:__ If undefined, the default stroke width depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
/// property.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct OpacityClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<AngleCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct OrderFieldDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// The sort order. One of `"ascending"` (default) or `"descending"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sort: Option<SortOrder>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order_field_def_type: Option<StandardType>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct OrderDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// The sort order. One of `"ascending"` (default) or `"descending"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sort: Option<SortOrder>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order_def_type: Option<StandardType>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<OrderFieldDefCondition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalValueDefNumber {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefNumberClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

/// The outer radius in pixels of arc marks.
///
/// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
/// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
/// clockwise.)
///
/// - For text marks, polar coordinate angle in radians.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RadiusClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Type of stacking offset if the field should be stacked. `stack` is only applicable for
    /// `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of
    /// `y` can be used to customize stacking for a vertical bar chart.
    ///
    /// `stack` can be one of the following values: - `"zero"` or `true`: stacking with baseline
    /// offset at zero value of the scale (for creating typical stacked
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and
    /// [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart). - `"normalize"` -
    /// stacking with normalized domain (for creating [normalized stacked bar and area
    /// charts](https://vega.github.io/vega-lite/docs/stack.html#normalized). <br/> -`"center"` -
    /// stacking with center baseline (for
    /// [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)). - `null` or
    /// `false` - No-stacking. This will produce layered
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area
    /// chart.
    ///
    /// __Default value:__ `zero` for plots with all of the following conditions are true: (1)
    /// the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a
    /// linear scale; (3) At least one of non-position channels mapped to an unaggregated field
    /// that is different from x and y. Otherwise, `null` by default.
    ///
    /// __See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stack: Option<Stack>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub polar_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
/// `"rule"`.
///
/// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
/// and  `"rule"`.
///
/// The inner radius in pixels of arc marks.
///
/// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
/// values proceed clockwise.
///
/// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Radius2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position2_def_type: Option<Type>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Shape of the mark.
///
/// 1. For `point` marks the supported values include:    - plotting shapes: `"circle"`,
/// `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, `"triangle-down"`,
/// `"triangle-right"`, or `"triangle-left"`.    - the line symbol `"stroke"`    - centered
/// directional shapes `"arrow"`, `"wedge"`, or `"triangle"`    - a custom [SVG path
/// string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct
/// sizing, custom shape paths should be defined within a square bounding box with
/// coordinates ranging from -1 to 1 along both the x and y dimensions.)
///
/// 2. For `geoshape` marks it should be a field definition of the geojson data
///
/// __Default value:__ If undefined, the default shape depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape`
/// property. (`"circle"` if unset.)
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct MarkPropDefStringNullTypeForShape {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ShapeCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_string_null_type_for_shape_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalValueDefStringNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefStringNullExprRefClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_value_def_string_null_expr_ref_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
}

/// Rotation angle of point and text marks.
///
/// Fill opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
/// property.
///
/// Opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
/// property.
///
/// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
/// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
/// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
/// `"trail"` instead of line with varying size)
///
/// Stroke opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
/// property.
///
/// Stroke width of the marks.
///
/// __Default value:__ If undefined, the default stroke width depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
/// property.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SizeClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<AngleCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

/// Color of the marks – either fill or stroke color based on  the `filled` property of mark
/// definition. By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,
/// `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and
/// `"point"`.
///
/// __Default value:__ If undefined, the default color depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _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).
///
/// Fill color of the marks. __Default value:__ If undefined, the default color depends on
/// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _Note:_ The `fill` encoding has higher precedence than `color`, thus may override the
/// `color` encoding if conflicting encodings are specified.
///
/// Stroke color of the marks. __Default value:__ If undefined, the default color depends on
/// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
/// property.
///
/// _Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the
/// `color` encoding if conflicting encodings are specified.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StrokeClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ColorCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_gradient_string_null_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefGradientStringNullExprRefValue>,
}

/// Stroke dash of the marks.
///
/// __Default value:__ `[1,0]` (No dash).
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct MarkPropDefNumber {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<StrokeDashCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<StrokeDashUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalValueDefNumberExprRefElement {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefNumberExprRefValueUnion>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalSelectionValueDefNumberExprRefClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<StrokeDashUnion>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_value_def_number_expr_ref_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
}

/// Rotation angle of point and text marks.
///
/// Fill opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
/// property.
///
/// Opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
/// property.
///
/// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
/// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
/// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
/// `"trail"` instead of line with varying size)
///
/// Stroke opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
/// property.
///
/// Stroke width of the marks.
///
/// __Default value:__ If undefined, the default stroke width depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
/// property.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StrokeOpacityClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<AngleCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

/// Rotation angle of point and text marks.
///
/// Fill opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
/// property.
///
/// Opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
/// property.
///
/// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
/// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
/// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
/// `"trail"` instead of line with varying size)
///
/// Stroke opacity of the marks.
///
/// __Default value:__ If undefined, the default opacity depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
/// property.
///
/// Stroke width of the marks.
///
/// __Default value:__ If undefined, the default stroke width depends on [mark
/// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
/// property.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StrokeWidthClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<AngleCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark_prop_def_number_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<CornerRadiusUnion>,
}

/// Text of the `text` mark.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TextDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<TextCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalPredicateValueDefTextExprRefText>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalValueDefTextExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalValueDefTextExprRefText>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Conditional {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_type: Option<StandardType>,
}

/// The outer radius in pixels of arc marks.
///
/// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
/// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
/// clockwise.)
///
/// - For text marks, polar coordinate angle in radians.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ThetaClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Type of stacking offset if the field should be stacked. `stack` is only applicable for
    /// `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of
    /// `y` can be used to customize stacking for a vertical bar chart.
    ///
    /// `stack` can be one of the following values: - `"zero"` or `true`: stacking with baseline
    /// offset at zero value of the scale (for creating typical stacked
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and
    /// [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart). - `"normalize"` -
    /// stacking with normalized domain (for creating [normalized stacked bar and area
    /// charts](https://vega.github.io/vega-lite/docs/stack.html#normalized). <br/> -`"center"` -
    /// stacking with center baseline (for
    /// [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)). - `null` or
    /// `false` - No-stacking. This will produce layered
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area
    /// chart.
    ///
    /// __Default value:__ `zero` for plots with all of the following conditions are true: (1)
    /// the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a
    /// linear scale; (3) At least one of non-position channels mapped to an unaggregated field
    /// that is different from x and y. Otherwise, `null` by default.
    ///
    /// __See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stack: Option<Stack>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub polar_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
/// `"rule"`.
///
/// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
/// and  `"rule"`.
///
/// The inner radius in pixels of arc marks.
///
/// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
/// values proceed clockwise.
///
/// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Theta2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position2_def_type: Option<Type>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StringFieldDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub string_field_def_type: Option<StandardType>,
}

/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FieldOrDatumDefWithConditionStringFieldDefString {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<FieldOrDatumDefWithConditionStringFieldDefStringCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field_or_datum_def_with_condition_string_field_def_string_type: Option<StandardType>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyConditionalValueDefStringExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyConditionalExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
    /// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
    /// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<Box<ConditionalValueDefNumberExprRefSelectionComposition>>,
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of the legend. If `null`, the legend for the encoding
    /// channel will be removed.
    ///
    /// __Default value:__ If undefined, default [legend
    /// properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
    ///
    /// __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub legend: RemovableValue<Legend>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub conditional_expr_ref_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
}

/// A text description of this mark for ARIA accessibility (SVG output only). For SVG output
/// the `"aria-label"` attribute will be set to this description.
///
/// A URL to load upon mouse click.
///
/// The URL of an image mark.
///
/// A FieldDef with Condition<ValueDef> {    condition: {value: ...},    field: ...,    ... }
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct UrlClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// One or more value definition(s) with [a selection or a test
    /// predicate](https://vega.github.io/vega-lite/docs/condition.html).
    ///
    /// __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.
    ///
    /// A field definition or one or more value definition(s) with a selection predicate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<DescriptionCondition>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field_or_datum_def_with_condition_string_field_def_string_type: Option<StandardType>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Color>,
}

/// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
/// `x2` or `width`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
/// `y2` or `height`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct XClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis
    /// for the encoding channel will be removed.
    ///
    /// __Default value:__ If undefined, default [axis
    /// properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.
    ///
    /// __See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub axis: RemovableValue<Axis>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining the properties of the Impute Operation to be applied. The field value
    /// of the other positional channel is taken as `key` of the `Impute` Operation. The field of
    /// the `color` channel if specified is used as `groupby` of the `Impute` Operation.
    ///
    /// __See also:__ [`impute`](https://vega.github.io/vega-lite/docs/impute.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub impute: Option<ImputeParams>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Type of stacking offset if the field should be stacked. `stack` is only applicable for
    /// `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of
    /// `y` can be used to customize stacking for a vertical bar chart.
    ///
    /// `stack` can be one of the following values: - `"zero"` or `true`: stacking with baseline
    /// offset at zero value of the scale (for creating typical stacked
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and
    /// [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart). - `"normalize"` -
    /// stacking with normalized domain (for creating [normalized stacked bar and area
    /// charts](https://vega.github.io/vega-lite/docs/stack.html#normalized). <br/> -`"center"` -
    /// stacking with center baseline (for
    /// [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)). - `null` or
    /// `false` - No-stacking. This will produce layered
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area
    /// chart.
    ///
    /// __Default value:__ `zero` for plots with all of the following conditions are true: (1)
    /// the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a
    /// linear scale; (3) At least one of non-position channels mapped to an unaggregated field
    /// that is different from x and y. Otherwise, `null` by default.
    ///
    /// __See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stack: Option<Stack>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Axis {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "bandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_position: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain: Option<Aria>,
    #[serde(rename = "domainCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_cap: Option<Cap>,
    #[serde(rename = "domainColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_color: Option<Color>,
    #[serde(rename = "domainDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_dash: Option<StrokeDashUnion>,
    #[serde(rename = "domainDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "domainOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "domainWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_width: Option<CornerRadiusUnion>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// A boolean flag indicating if grid lines should be included as part of the axis
    ///
    /// __Default value:__ `true` for [continuous
    /// scales](https://vega.github.io/vega-lite/docs/scale.html#continuous) that are not binned;
    /// otherwise, `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid: Option<bool>,
    #[serde(rename = "gridCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_cap: Option<Cap>,
    #[serde(rename = "gridColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_color: Option<GridColorUnion>,
    #[serde(rename = "gridDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_dash: Option<AxisGridDash>,
    #[serde(rename = "gridDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_dash_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "gridOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_opacity: Option<GridOpacityUnion>,
    #[serde(rename = "gridWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_width: Option<GridWidthUnion>,
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<ConditionalAxisPropertyAlignNull>,
    #[serde(rename = "labelAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_angle: Option<LabelAngle>,
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<PurpleTextBaseline>,
    #[serde(rename = "labelBound")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_bound: Option<Label>,
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<GridColorUnion>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Indicates if the first and last axis labels should be aligned flush with the scale range.
    /// Flush alignment for a horizontal axis will left-align the first label and right-align the
    /// last label. For vertical axes, bottom and top text baselines are applied instead. If this
    /// property is a number, it also indicates the number of pixels by which to offset the first
    /// and last labels; for example, a value of 2 will flush-align the first and last labels and
    /// also push them 2 pixels outward from the center of the axis. The additional adjustment
    /// can sometimes help the labels better visually group with corresponding axis ticks.
    ///
    /// __Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`.
    #[serde(rename = "labelFlush")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_flush: Option<LabelFlush>,
    #[serde(rename = "labelFlushOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_flush_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<ConditionalAxisPropertyStringNull>,
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<GridWidthUnion>,
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<ConditionalAxisPropertyFontStyleNull>,
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeight>,
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "labelLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "labelOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_opacity: Option<GridDashOffsetUnion>,
    /// The strategy to use for resolving overlap of axis labels. If `false` (the default), no
    /// overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing
    /// every other label is used (this works well for standard linear axes). If set to
    /// `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps
    /// with the last visible label (this often works better for log-scaled axes).
    ///
    /// __Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log
    /// scales; otherwise `false`.
    #[serde(rename = "labelOverlap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_overlap: Option<LabelOverlapUnion>,
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<GridDashOffsetUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<Aria>,
    #[serde(rename = "labelSeparation")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_separation: Option<CornerRadiusUnion>,
    #[serde(rename = "maxExtent")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_extent: Option<CornerRadiusUnion>,
    #[serde(rename = "minExtent")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_extent: Option<CornerRadiusUnion>,
    /// The offset, in pixels, by which to displace the axis from the edge of the enclosing group
    /// or data rectangle.
    ///
    /// __Default value:__ derived from the [axis
    /// config](https://vega.github.io/vega-lite/docs/config.html#facet-scale-config)'s `offset`
    /// (`0` by default)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<f64>,
    /// 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
    /// towards the right edge of the chart).
    ///
    /// __Default value:__ `"bottom"` for x-axes and `"left"` for y-axes.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<TitleOrientUnion>,
    /// The anchor position of the axis in pixels. For x-axes with top or bottom orientation,
    /// this sets the axis group x coordinate. For y-axes with left or right orientation, this
    /// sets the axis group y coordinate.
    ///
    /// __Default value__: `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position: Option<CornerRadiusUnion>,
    /// A string or array of strings indicating the name of custom styles to apply to the axis. A
    /// style is a named collection of axis property defined within the [style
    /// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
    /// an array, later styles will override earlier styles.
    ///
    /// __Default value:__ (none) __Note:__ Any specified style will augment the default style.
    /// For example, an x-axis mark with `"style": "foo"` will use `config.axisX` and
    /// `config.style.foo` (the specified style `"foo"` has higher precedence).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
    #[serde(rename = "tickBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_band: Option<TickBandUnion>,
    #[serde(rename = "tickCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_cap: Option<Cap>,
    #[serde(rename = "tickColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_color: Option<GridColorUnion>,
    /// 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.
    ///
    /// For scales of type `"time"` or `"utc"`, the tick count can instead be a time interval
    /// specifier. Legal string values are `"millisecond"`, `"second"`, `"minute"`, `"hour"`,
    /// `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, an object-valued interval
    /// specifier of the form `{"interval": "month", "step": 3}` includes a desired number of
    /// interval steps. Here, ticks are generated for each quarter (Jan, Apr, Jul, Oct)
    /// boundary.
    ///
    /// __Default value__: Determine using a formula `ceil(width/40)` for x and `ceil(height/40)`
    /// for y.
    #[serde(rename = "tickCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_count: Option<TickCount>,
    #[serde(rename = "tickDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_dash: Option<AxisTickDash>,
    #[serde(rename = "tickDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_dash_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "tickExtra")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_extra: Option<Aria>,
    /// 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.
    #[serde(rename = "tickMinStep")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_min_step: Option<CornerRadiusUnion>,
    #[serde(rename = "tickOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "tickOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_opacity: Option<GridDashOffsetUnion>,
    #[serde(rename = "tickRound")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_round: Option<Aria>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ticks: Option<Aria>,
    #[serde(rename = "tickSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_size: Option<GridWidthUnion>,
    #[serde(rename = "tickWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_width: Option<GridWidthUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorUnion>,
    #[serde(rename = "titleAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_angle: Option<CornerRadiusUnion>,
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<FontSize>,
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<FontSize>,
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "titleX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_x: Option<CornerRadiusUnion>,
    #[serde(rename = "titleY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_y: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub translate: Option<CornerRadiusUnion>,
    /// Explicitly set the visible axis tick values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub values: Option<Values>,
    /// A non-negative integer indicating the z-index of the axis. If zindex is 0, axes should be
    /// drawn behind all chart elements. To put them in front, set `zindex` to `1` or more.
    ///
    /// __Default value:__ `0` (behind the marks).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GridColorExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ConditionUnion>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefColorNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<TentacledConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Vec<f64>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefNumberNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Vec<f64>>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleConditionalPredicateValueDefNumberNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Vec<f64>>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GridDashOffsetExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<StickyConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefNumberNullExprRefElement {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyConditionalPredicateValueDefNumberNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GridOpacityExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<StickyConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct GridWidthExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<StickyConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ExprRefCondition>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Align>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefAlignNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Align>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionCondition {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Align>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TentacledExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<ExprRefConditionUnion>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Baseline>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefTextBaselineNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Baseline>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionConditionClass {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Baseline>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StickyExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<FluffyConditionalPredicateValueDefStringNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefStringNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleConditionalPredicateValueDefStringNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct IndigoExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<FluffyConditionalPredicateValueDefFontStyleNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefFontStyleNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleConditionalPredicateValueDefFontStyleNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<String>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct IndecentExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<FluffyConditionalPredicateValueDefFontWeightNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ValueUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ConditionalPredicateValueDefFontWeightNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ValueUnion>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleConditionalPredicateValueDefFontWeightNullExprRef {
    /// Predicate for triggering the condition
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub test: Option<PredicateCompositionElement>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<ValueUnion>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct HilariousExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<TentacledConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Vec<f64>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ImputeParams {
    /// A frame specification as a two-element array used to control the window over which the
    /// specified method is applied. The array entries should either be a number indicating the
    /// offset from the current data object, or null to indicate unbounded rows preceding or
    /// following the current data object. For example, the value `[-5, 5]` indicates that the
    /// window should include five objects preceding and five objects following the current
    /// object.
    ///
    /// __Default value:__:  `[null, null]` indicating that the window includes all objects.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub frame: Option<Vec<Option<f64>>>,
    /// Defines the key values that should be considered for imputation. An array of key values
    /// or an object defining a [number
    /// sequence](https://vega.github.io/vega-lite/docs/impute.html#sequence-def).
    ///
    /// If provided, this will be used in addition to the key values observed within the input
    /// data. If not provided, the values will be derived from all unique values of the `key`
    /// field. For `impute` in `encoding`, the key field is the x-field if the y-field is
    /// imputed, or vice versa.
    ///
    /// If there is no impute grouping, this property _must_ be specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub keyvals: Option<Keyvals>,
    /// The imputation method to use for the field value of imputed data objects. One of
    /// `"value"`, `"mean"`, `"median"`, `"max"` or `"min"`.
    ///
    /// __Default value:__  `"value"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub method: Option<ImputeParamsMethod>,
    /// The field value to use when the imputation `method` is `"value"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ImputeSequence {
    /// The starting value of the sequence. __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start: Option<f64>,
    /// The step value between sequence entries. __Default value:__ `1` or `-1` if `stop < start`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// The ending value(exclusive) of the sequence.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stop: Option<f64>,
}

/// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
/// `"rule"`.
///
/// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
/// and  `"rule"`.
///
/// The inner radius in pixels of arc marks.
///
/// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
/// values proceed clockwise.
///
/// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct X2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position2_def_type: Option<Type>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of x coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of y coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct XErrorClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

/// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of x coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of y coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct XError2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

/// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
/// `x2` or `width`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
/// `y2` or `height`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct YClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// An object defining properties of axis's gridlines, ticks and labels. If `null`, the axis
    /// for the encoding channel will be removed.
    ///
    /// __Default value:__ If undefined, default [axis
    /// properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.
    ///
    /// __See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub axis: RemovableValue<Axis>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<DescriptionBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining the properties of the Impute Operation to be applied. The field value
    /// of the other positional channel is taken as `key` of the `Impute` Operation. The field of
    /// the `color` channel if specified is used as `groupby` of the `Impute` Operation.
    ///
    /// __See also:__ [`impute`](https://vega.github.io/vega-lite/docs/impute.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub impute: Option<ImputeParams>,
    /// 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.
    ///
    /// If `null`, the scale will be [disabled and the data value will be directly
    /// encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).
    ///
    /// __Default value:__ If undefined, default [scale
    /// properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.
    ///
    /// __See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub scale: RemovableValue<Scale>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
    /// indicating an encoding channel name to sort
    /// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
    /// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
    /// x-field, descending). This channel string is short-form of [a sort-by-encoding
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
    /// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
    /// "descending"}`. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
    ///
    /// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<SortUnion>,
    /// Type of stacking offset if the field should be stacked. `stack` is only applicable for
    /// `x`, `y`, `theta`, and `radius` channels with continuous domains. For example, `stack` of
    /// `y` can be used to customize stacking for a vertical bar chart.
    ///
    /// `stack` can be one of the following values: - `"zero"` or `true`: stacking with baseline
    /// offset at zero value of the scale (for creating typical stacked
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and
    /// [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart). - `"normalize"` -
    /// stacking with normalized domain (for creating [normalized stacked bar and area
    /// charts](https://vega.github.io/vega-lite/docs/stack.html#normalized). <br/> -`"center"` -
    /// stacking with center baseline (for
    /// [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)). - `null` or
    /// `false` - No-stacking. This will produce layered
    /// [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area
    /// chart.
    ///
    /// __Default value:__ `zero` for plots with all of the following conditions are true: (1)
    /// the mark is `bar`, `area`, or `arc`; (2) the stacked measure channel (x or y) has a
    /// linear scale; (3) At least one of non-position channels mapped to an unaggregated field
    /// that is different from x and y. Otherwise, `null` by default.
    ///
    /// __See also:__ [`stack`](https://vega.github.io/vega-lite/docs/stack.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stack: Option<Stack>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position_def_type: Option<Type>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
/// `"rule"`.
///
/// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
/// and  `"rule"`.
///
/// The inner radius in pixels of arc marks.
///
/// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
/// values proceed clockwise.
///
/// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"width"` for the width of the
/// plot.
///
/// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
///
/// The `value` of this channel can be a number or a string `"height"` for the height of the
/// plot.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Y2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in data domain.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub datum: Option<PrimitiveValue>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position2_def_type: Option<Type>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Latitude2Value>,
}

/// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of x coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of y coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct YErrorClass {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

/// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of x coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
///
/// Secondary error value of y coordinates for error specified `"errorbar"` and
/// `"errorband"`.
///
/// A field definition of a secondary channel that shares a scale with another primary
/// channel. For example, `x2`, `xError` and `xError2` share the same scale with `x`.
///
/// Definition object for a constant value (primitive value or gradient definition) of an
/// encoding channel.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct YError2Class {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<serde_json::Value>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<f64>,
}

/// Definition for how to facet the data. One of: 1) [a field definition for faceting the
/// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
/// object that maps `row` and `column` channels to their field
/// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
///
/// A field definition for the horizontal facet of trellis plots.
///
/// A field definition for the vertical facet of trellis plots.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Facet {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of a facet's header.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<Header>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` is not supported for `row` and `column`.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<PurpleSortArray>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet_type: Option<StandardType>,
    /// A field definition for the horizontal facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<FacetFieldDef>,
    /// A field definition for the vertical facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<FacetFieldDef>,
}

/// A field definition for the horizontal facet of trellis plots.
///
/// A field definition for the vertical facet of trellis plots.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FacetFieldDef {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<Field>,
    /// An object defining properties of a facet's header.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<Header>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` is not supported for `row` and `column`.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<PurpleSortArray>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet_field_def_type: Option<StandardType>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Step {
    /// The size (width/height) per discrete step.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
}

/// A specification of the view that gets repeated.
///
/// A full layered plot specification, which may contains `encoding` and `projection`
/// properties that will be applied to underlying unit (single-view) specifications.
///
/// A unit specification, which can contain either [primitive marks or composite
/// marks](https://vega.github.io/vega-lite/docs/mark.html#types).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LayerElement {
    /// An object describing the data source. Set to `null` to ignore the parent's data source.
    /// If no data is set, it is derived from the parent.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub data: RemovableValue<UrlData>,
    /// Description of this mark for commenting purpose.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// A shared key-value mapping between encoding channels and definition of fields in the
    /// underlying layers.
    ///
    /// A key-value mapping between encoding channels and definition of fields.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<LayerEncoding>,
    /// The height of a visualization.
    ///
    /// - For a plot with a continuous y-field, height should be a number. - For a plot with
    /// either a discrete y-field or no y-field, height can be either a number indicating a fixed
    /// height or an object in the form of `{step: number}` defining the height per discrete
    /// step. (No y-field is equivalent to having one discrete step.) - To enable responsive
    /// sizing on height, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous
    /// y-field and `config.view.discreteHeight` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// height of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<HeightUnion>,
    /// Layer or single view specifications to be layered.
    ///
    /// __Note__: Specifications inside `layer` cannot use `row` and `column` channels as
    /// layering facet specifications is not allowed. Instead, use the [facet
    /// operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a
    /// facet.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<LayerElement>>,
    /// Name of the visualization for later reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An object defining properties of the geographic projection shared by underlying layers.
    ///
    /// An object defining properties of geographic projection, which will be applied to `shape`
    /// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// Scale, axis, and legend resolutions for view composition specifications.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<Resolve>,
    /// Title for the plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<TitleUnion>,
    /// An array of data transformations such as filter and new field calculation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform: Option<Vec<Transform>>,
    /// An object defining the view background's fill and stroke.
    ///
    /// __Default value:__ none (transparent)
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewBackground>,
    /// The width of a visualization.
    ///
    /// - For a plot with a continuous x-field, width should be a number. - For a plot with
    /// either a discrete x-field or no x-field, width can be either a number indicating a fixed
    /// width or an object in the form of `{step: number}` defining the width per discrete step.
    /// (No x-field is equivalent to having one discrete step.) - To enable responsive sizing on
    /// width, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous
    /// x-field and `config.view.discreteWidth` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// width of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<HeightUnion>,
    /// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
    /// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
    /// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<AnyMark>,
    /// A key-value mapping between selection names and definitions.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<HashMap<String, SelectionDef>>,
}

/// A shared key-value mapping between encoding channels and definition of fields in the
/// underlying layers.
///
/// A key-value mapping between encoding channels and definition of fields.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LayerEncoding {
    /// Rotation angle of point and text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<AngleClass>,
    /// Color of the marks – either fill or stroke color based on  the `filled` property of mark
    /// definition. By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,
    /// `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and
    /// `"point"`.
    ///
    /// __Default value:__ If undefined, the default color depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _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).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<ColorClass>,
    /// A text description of this mark for ARIA accessibility (SVG output only). For SVG output
    /// the `"aria-label"` attribute will be set to this description.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<DescriptionClass>,
    /// Additional levels of detail for grouping data in aggregate views and in line, trail, and
    /// area marks without mapping data to a specific visual channel.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub detail: Option<Detail>,
    /// Fill color of the marks. __Default value:__ If undefined, the default color depends on
    /// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _Note:_ The `fill` encoding has higher precedence than `color`, thus may override the
    /// `color` encoding if conflicting encodings are specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<FillClass>,
    /// Fill opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
    /// property.
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<FillOpacityClass>,
    /// A URL to load upon mouse click.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<HrefClass>,
    /// A data field to use as a unique key for data binding. When a visualization’s data is
    /// updated, the key value will be used to match data elements to existing mark instances.
    /// Use a key channel to enable object constancy for transitions over dynamic data.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub key: Option<KeyClass>,
    /// Latitude position of geographically projected marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub latitude: Option<LatitudeClass>,
    /// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
    /// `"rule"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub latitude2: Option<Latitude2Class>,
    /// Longitude position of geographically projected marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub longitude: Option<LongitudeClass>,
    /// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
    /// and  `"rule"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub longitude2: Option<Longitude2Class>,
    /// Opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
    /// property.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<OpacityClass>,
    /// Order of the marks. - For stacked marks, this `order` channel encodes [stack
    /// order](https://vega.github.io/vega-lite/docs/stack.html#order). - For line and trail
    /// marks, this `order` channel encodes order of data points in the lines. This can be useful
    /// for creating [a connected
    /// scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html).
    /// Setting `order` to `{"value": null}` makes the line marks use the original order in the
    /// data sources. - Otherwise, this `order` channel encodes layer order of the marks.
    ///
    /// __Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating
    /// additional aggregation grouping.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<Order>,
    /// The outer radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<RadiusClass>,
    /// The inner radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<Radius2Class>,
    /// Shape of the mark.
    ///
    /// 1. For `point` marks the supported values include:    - plotting shapes: `"circle"`,
    /// `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, `"triangle-down"`,
    /// `"triangle-right"`, or `"triangle-left"`.    - the line symbol `"stroke"`    - centered
    /// directional shapes `"arrow"`, `"wedge"`, or `"triangle"`    - a custom [SVG path
    /// string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct
    /// sizing, custom shape paths should be defined within a square bounding box with
    /// coordinates ranging from -1 to 1 along both the x and y dimensions.)
    ///
    /// 2. For `geoshape` marks it should be a field definition of the geojson data
    ///
    /// __Default value:__ If undefined, the default shape depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape`
    /// property. (`"circle"` if unset.)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<MarkPropDefStringNullTypeForShape>,
    /// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
    /// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
    /// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
    /// `"trail"` instead of line with varying size)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<SizeClass>,
    /// Stroke color of the marks. __Default value:__ If undefined, the default color depends on
    /// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the
    /// `color` encoding if conflicting encodings are specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<StrokeClass>,
    /// Stroke dash of the marks.
    ///
    /// __Default value:__ `[1,0]` (No dash).
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<MarkPropDefNumber>,
    /// Stroke opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
    /// property.
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<StrokeOpacityClass>,
    /// Stroke width of the marks.
    ///
    /// __Default value:__ If undefined, the default stroke width depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
    /// property.
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<StrokeWidthClass>,
    /// Text of the `text` mark.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<TextDef>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<ThetaClass>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<Theta2Class>,
    /// The tooltip text to show upon mouse hover. Specifying `tooltip` encoding overrides [the
    /// `tooltip` property in the mark
    /// definition](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip in Vega-Lite.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<EncodingTooltip>,
    /// The URL of an image mark.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<UrlClass>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XClass>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<X2Class>,
    /// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "xError")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_error: Option<XErrorClass>,
    /// Secondary error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "xError2")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_error2: Option<XError2Class>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YClass>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<Y2Class>,
    /// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "yError")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_error: Option<YErrorClass>,
    /// Secondary error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "yError2")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_error2: Option<YError2Class>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Def {
    #[serde(rename = "box")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub def_box: Option<DefBox>,
    /// Whether a composite mark be clipped to the enclosing group’s width and height.
    ///
    /// Whether a mark be clipped to the enclosing group’s width and height.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clip: Option<bool>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    /// The extent of the whiskers. Available options include: - `"min-max"`: min and max are the
    /// lower and upper whiskers respectively. - A number representing multiple of the
    /// interquartile range. This number will be multiplied by the IQR to determine whisker
    /// boundary, which spans from the smallest data to the largest data within the range _[Q1 -
    /// k * IQR, Q3 + k * IQR]_ where _Q1_ and _Q3_ are the first and third quartiles while _IQR_
    /// is the interquartile range (_Q3-Q1_).
    ///
    /// __Default value:__ `1.5`.
    ///
    /// The extent of the rule. Available options include: - `"ci"`: Extend the rule to the
    /// confidence interval of the mean. - `"stderr"`: The size of rule are set to the value of
    /// standard error, extending from the mean. - `"stdev"`: The size of rule are set to the
    /// value of standard deviation, extending from the mean. - `"iqr"`: Extend the rule to the
    /// q1 and q3.
    ///
    /// __Default value:__ `"stderr"`.
    ///
    /// The extent of the band. Available options include: - `"ci"`: Extend the band to the
    /// confidence interval of the mean. - `"stderr"`: The size of band are set to the value of
    /// standard error, extending from the mean. - `"stdev"`: The size of band are set to the
    /// value of standard deviation, extending from the mean. - `"iqr"`: Extend the band to the
    /// q1 and q3.
    ///
    /// __Default value:__ `"stderr"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<MarkDefExtent>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub median: Option<DefBox>,
    /// The opacity (value between [0,1]) of the mark.
    ///
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// Orientation of the box plot. This is normally automatically determined based on types of
    /// fields on x and y channels. However, an explicit `orient` be specified when the
    /// orientation is ambiguous.
    ///
    /// __Default value:__ `"vertical"`.
    ///
    /// Orientation of the error bar. This is normally automatically determined, but can be
    /// specified when the orientation is ambiguous and cannot be automatically determined.
    ///
    /// Orientation of the error band. This is normally automatically determined, but can be
    /// specified when the orientation is ambiguous and cannot be automatically determined.
    ///
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outliers: Option<DefBox>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rule: Option<DefBox>,
    /// Size of the box and median tick of a box plot
    ///
    /// Size of the ticks of an error bar
    ///
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ticks: Option<DefBox>,
    /// The mark type. This could a primitive mark type (one of `"bar"`, `"circle"`, `"square"`,
    /// `"tick"`, `"line"`, `"area"`, `"point"`, `"geoshape"`, `"rule"`, and `"text"`) or a
    /// composite mark type (`"boxplot"`, `"errorband"`, `"errorbar"`).
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub def_type: Option<Mark>,
    /// Thickness of the ticks and the bar of an error bar
    ///
    /// Thickness of the tick mark.
    ///
    /// __Default value:__  `1`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub thickness: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<DefBox>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub borders: Option<DefBox>,
    /// The line interpolation method for the error band. One of the following: - `"linear"`:
    /// piecewise linear segments, as in a polyline. - `"linear-closed"`: close the linear
    /// segments to form a polygon. - `"step"`: a piecewise constant function (a step function)
    /// consisting of alternating horizontal and vertical lines. The y-value changes at the
    /// midpoint of each pair of adjacent x-values. - `"step-before"`: a piecewise constant
    /// function (a step function) consisting of alternating horizontal and vertical lines. The
    /// y-value changes before the x-value. - `"step-after"`: a piecewise constant function (a
    /// step function) consisting of alternating horizontal and vertical lines. The y-value
    /// changes after the x-value. - `"basis"`: a B-spline, with control point duplication on the
    /// ends. - `"basis-open"`: an open B-spline; may not intersect the start or end. -
    /// `"basis-closed"`: a closed B-spline, as in a loop. - `"cardinal"`: a Cardinal spline,
    /// with control point duplication on the ends. - `"cardinal-open"`: an open Cardinal spline;
    /// may not intersect the start or end, but will intersect other control points. -
    /// `"cardinal-closed"`: a closed Cardinal spline, as in a loop. - `"bundle"`: equivalent to
    /// basis, except the tension parameter is used to straighten the spline. - `"monotone"`:
    /// cubic interpolation that preserves monotonicity in y.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// The tension parameter for the interpolation type of the error band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<Opacity>,
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// The width of the ticks.
    ///
    /// __Default value:__  3/4 of step (width step for horizontal ticks and height step for
    /// vertical ticks).
    #[serde(rename = "bandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_size: Option<f64>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    /// Offset between bars for binned field. The ideal value for this is either 0 (preferred by
    /// statisticians) or 1 (Vega-Lite default, D3 example style).
    ///
    /// __Default value:__ `1`
    #[serde(rename = "binSpacing")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin_spacing: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// The default size of the bars on continuous scales.
    ///
    /// __Default value:__ `5`
    #[serde(rename = "continuousBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_band_size: Option<f64>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    /// - For vertical bars, top-left and top-right corner radius. - For horizontal bars,
    /// top-right and bottom-right corner radius.
    #[serde(rename = "cornerRadiusEnd")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_end: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    /// The default size of the bars with discrete dimensions. If unspecified, the default size
    /// is  `step-2`, which provides 2 pixel offset between bars.
    #[serde(rename = "discreteBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub discrete_band_size: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    /// A flag for overlaying line on top of area marks, or an object defining the properties of
    /// the overlayed lines.
    ///
    /// - If this value is an empty object (`{}`) or `true`, lines with default properties will
    /// be used.
    ///
    /// - If this value is `false`, no lines would be automatically added to area marks.
    ///
    /// __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line: Option<Line>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// A flag for overlaying points on top of line or area marks, or an object defining the
    /// properties of the overlayed points.
    ///
    /// - If this property is `"transparent"`, transparent points will be used (for enhancing
    /// tooltips and selections).
    ///
    /// - If this property is an empty object (`{}`) or `true`, filled points with default
    /// properties will be used.
    ///
    /// - If this property is `false`, no points would be automatically added to line or area
    /// marks.
    ///
    /// __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point: Option<PointUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    /// Offset for radius2.
    #[serde(rename = "radius2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2_offset: Option<CornerRadiusUnion>,
    /// Offset for radius.
    #[serde(rename = "radiusOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius_offset: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    /// A string or array of strings indicating the name of custom styles to apply to the mark. A
    /// style is a named collection of mark property defaults defined within the [style
    /// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
    /// an array, later styles will override earlier styles. Any [mark
    /// properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly
    /// defined within the `encoding` will override a style default.
    ///
    /// __Default value:__ The mark's name. For example, a bar mark will have style `"bar"` by
    /// default. __Note:__ Any specified style will augment the default style. For example, a bar
    /// mark with `"style": "foo"` will receive from `config.style.bar` and `config.style.foo`
    /// (the specified style `"foo"` has higher precedence).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Offset for theta2.
    #[serde(rename = "theta2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2_offset: Option<CornerRadiusUnion>,
    /// Offset for theta.
    #[serde(rename = "thetaOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta_offset: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Offset for x2-position.
    #[serde(rename = "x2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2_offset: Option<CornerRadiusUnion>,
    /// Offset for x-position.
    #[serde(rename = "xOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_offset: Option<CornerRadiusUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
    /// Offset for y2-position.
    #[serde(rename = "y2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2_offset: Option<CornerRadiusUnion>,
    /// Offset for y-position.
    #[serde(rename = "yOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_offset: Option<CornerRadiusUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct MarkConfigExprOrSignalRef {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleLinearGradient {
    /// The type of gradient. Use `"linear"` for a linear gradient.
    ///
    /// The type of gradient. Use `"radial"` for a radial gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient: Option<Gradient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub id: Option<String>,
    /// An array of gradient stops defining the gradient color sequence.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stops: Option<Vec<GradientStop>>,
    /// The starting x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x1: Option<f64>,
    /// The ending x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `1`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<f64>,
    /// The starting y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y1: Option<f64>,
    /// The ending y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the inner circle for the
    /// gradient.
    ///
    /// __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r1: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the outer circle for the
    /// gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r2: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyLinearGradient {
    /// The type of gradient. Use `"linear"` for a linear gradient.
    ///
    /// The type of gradient. Use `"radial"` for a radial gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient: Option<Gradient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub id: Option<String>,
    /// An array of gradient stops defining the gradient color sequence.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stops: Option<Vec<GradientStop>>,
    /// The starting x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x1: Option<f64>,
    /// The ending x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `1`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<f64>,
    /// The starting y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y1: Option<f64>,
    /// The ending y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the inner circle for the
    /// gradient.
    ///
    /// __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r1: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the outer circle for the
    /// gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r2: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleTooltipContent {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub content: Option<Content>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct OverlayMarkDef {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Whether a mark be clipped to the enclosing group’s width and height.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clip: Option<bool>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    /// Offset for radius2.
    #[serde(rename = "radius2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2_offset: Option<CornerRadiusUnion>,
    /// Offset for radius.
    #[serde(rename = "radiusOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius_offset: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    /// A string or array of strings indicating the name of custom styles to apply to the mark. A
    /// style is a named collection of mark property defaults defined within the [style
    /// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
    /// an array, later styles will override earlier styles. Any [mark
    /// properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly
    /// defined within the `encoding` will override a style default.
    ///
    /// __Default value:__ The mark's name. For example, a bar mark will have style `"bar"` by
    /// default. __Note:__ Any specified style will augment the default style. For example, a bar
    /// mark with `"style": "foo"` will receive from `config.style.bar` and `config.style.foo`
    /// (the specified style `"foo"` has higher precedence).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Offset for theta2.
    #[serde(rename = "theta2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2_offset: Option<CornerRadiusUnion>,
    /// Offset for theta.
    #[serde(rename = "thetaOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta_offset: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Offset for x2-position.
    #[serde(rename = "x2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2_offset: Option<CornerRadiusUnion>,
    /// Offset for x-position.
    #[serde(rename = "xOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_offset: Option<CornerRadiusUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
    /// Offset for y2-position.
    #[serde(rename = "y2Offset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2_offset: Option<CornerRadiusUnion>,
    /// Offset for y-position.
    #[serde(rename = "yOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_offset: Option<CornerRadiusUnion>,
}

/// Projection configuration, which determines default properties for all
/// [projections](https://vega.github.io/vega-lite/docs/projection.html). For a full list of
/// projection configuration options, please see the [corresponding section of the projection
/// documentation](https://vega.github.io/vega-lite/docs/projection.html#config).
///
/// Any property of Projection can be in config
///
/// An object defining properties of geographic projection, which will be applied to `shape`
/// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other
/// marks.
///
/// An object defining properties of the geographic projection shared by underlying layers.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Projection {
    /// The projection's center, a two-element array of longitude and latitude in degrees.
    ///
    /// __Default value:__ `[0, 0]`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Vec<f64>>,
    /// The projection's clipping circle radius to the specified angle in degrees. If `null`,
    /// switches to [antimeridian](http://bl.ocks.org/mbostock/3788999) cutting rather than
    /// small-circle clipping.
    #[serde(rename = "clipAngle")]
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub clip_angle: RemovableValue<f64>,
    /// The projection's viewport clip extent to the specified bounds in pixels. The extent
    /// bounds are specified as an array `[[x0, y0], [x1, y1]]`, where `x0` is the left-side of
    /// the viewport, `y0` is the top, `x1` is the right and `y1` is the bottom. If `null`, no
    /// viewport clipping is performed.
    #[serde(rename = "clipExtent")]
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub clip_extent: RemovableValue<Vec<Vec<f64>>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub coefficient: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub distance: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<Vec<Vec<f64>>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fit: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fraction: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub lobes: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub parallel: Option<f64>,
    /// For conic projections, the [two standard
    /// parallels](https://en.wikipedia.org/wiki/Map_projection#Conic) that define the map
    /// layout. The default depends on the specific conic projection used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub parallels: Option<Vec<f64>>,
    /// The default radius (in pixels) to use when drawing GeoJSON `Point` and `MultiPoint`
    /// geometries. This parameter sets a constant default value. To modify the point radius in
    /// response to data, see the corresponding parameter of the GeoPath and GeoShape
    /// transforms.
    ///
    /// __Default value:__ `4.5`
    #[serde(rename = "pointRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point_radius: Option<f64>,
    /// The threshold for the projection's [adaptive
    /// resampling](http://bl.ocks.org/mbostock/3795544) to the specified value in pixels. This
    /// value corresponds to the [Douglas–Peucker
    /// distance](http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm).
    /// If precision is not specified, returns the projection's current resampling precision
    /// which defaults to `√0.5 ≅ 0.70710…`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub precision: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ratio: Option<f64>,
    #[serde(rename = "reflectX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub reflect_x: Option<bool>,
    #[serde(rename = "reflectY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub reflect_y: Option<bool>,
    /// The projection's three-axis rotation to the specified angles, which must be a two- or
    /// three-element array of numbers [`lambda`, `phi`, `gamma`] specifying the rotation angles
    /// in degrees about each spherical axis. (These correspond to yaw, pitch and roll.)
    ///
    /// __Default value:__ `[0, 0, 0]`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rotate: Option<Vec<f64>>,
    /// The projection’s scale (zoom) factor, overriding automatic fitting. The default scale is
    /// projection-specific. The scale factor corresponds linearly to the distance between
    /// projected points; however, scale factor values are not equivalent across projections.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub scale: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<Vec<f64>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tilt: Option<f64>,
    /// The projection’s translation offset as a two-element array `[tx, ty]`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub translate: Option<Vec<f64>>,
    /// The cartographic projection to use. This value is case-insensitive, for example
    /// `"albers"` and `"Albers"` indicate the same projection type. You can find all valid
    /// projection types [in the
    /// documentation](https://vega.github.io/vega-lite/docs/projection.html#projection-types).
    ///
    /// __Default value:__ `mercator`
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection_type: Option<ProjectionType>,
}

/// Scale, axis, and legend resolutions for view composition specifications.
///
/// Defines how scales, axes, and legends from different specs should be combined. Resolve is
/// a mapping from `scale`, `axis`, and `legend` to a mapping from channels to resolutions.
/// Scales and guides can be resolved to be `"independent"` or `"shared"`.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Resolve {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis: Option<AxisResolveMap>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend: Option<LegendResolveMap>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub scale: Option<ScaleResolveMap>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AxisResolveMap {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<ResolveMode>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LegendResolveMap {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<ResolveMode>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<ResolveMode>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<ResolveMode>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<ResolveMode>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<ResolveMode>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ScaleResolveMap {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<ResolveMode>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<ResolveMode>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<ResolveMode>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<ResolveMode>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<ResolveMode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<ResolveMode>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SelectionDef {
    /// When set, a selection is populated by input elements (also known as dynamic query
    /// widgets) or by interacting with the corresponding legend. Direct manipulation interaction
    /// is disabled by default; to re-enable it, set the selection's
    /// [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties)
    /// property.
    ///
    /// Legend bindings are restricted to selections that only specify a single field or
    /// encoding.
    ///
    /// Query widget binding takes the form of Vega's [input element binding
    /// definition](https://vega.github.io/vega/docs/signals/#bind) or can be a mapping between
    /// projected field/encodings and binding definitions.
    ///
    /// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
    ///
    /// When set, a selection is populated by interacting with the corresponding legend. Direct
    /// manipulation interaction is disabled by default; to re-enable it, set the selection's
    /// [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties)
    /// property.
    ///
    /// Legend bindings are restricted to selections that only specify a single field or
    /// encoding.
    ///
    /// Establishes a two-way binding between the interval selection and the scales used within
    /// the same view. This allows a user to interactively pan and zoom the view.
    ///
    /// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bind: Option<BindUnion>,
    /// Clears the selection, emptying it of all values. Can be a [Event
    /// Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable.
    ///
    /// __Default value:__ `dblclick`.
    ///
    /// __See also:__ [`clear`](https://vega.github.io/vega-lite/docs/clear.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clear: Option<ClearUnion>,
    /// By default, `all` data values are considered to lie within an empty selection. When set
    /// to `none`, empty selections contain no data values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub empty: Option<Empty>,
    /// An array of encoding channels. The corresponding data field values must match for a data
    /// tuple to fall within the selection.
    ///
    /// __See also:__ [`encodings`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encodings: Option<Vec<SingleDefUnitChannel>>,
    /// An array of field names whose values must match for a data tuple to fall within the
    /// selection.
    ///
    /// __See also:__ [`fields`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fields: Option<Vec<String>>,
    /// Initialize the selection with a mapping between [projected channels or field
    /// names](https://vega.github.io/vega-lite/docs/project.html) and initial values.
    ///
    /// __See also:__ [`init`](https://vega.github.io/vega-lite/docs/init.html) documentation.
    ///
    /// Initialize the selection with a mapping between [projected channels or field
    /// names](https://vega.github.io/vega-lite/docs/project.html) and an initial value (or array
    /// of values).
    ///
    /// __See also:__ [`init`](https://vega.github.io/vega-lite/docs/init.html) documentation.
    ///
    /// Initialize the selection with a mapping between [projected channels or field
    /// names](https://vega.github.io/vega-lite/docs/project.html) and arrays of initial values.
    ///
    /// __See also:__ [`init`](https://vega.github.io/vega-lite/docs/init.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub init: Option<Init>,
    /// When true, an invisible voronoi diagram is computed to accelerate discrete selection. The
    /// data value _nearest_ the mouse cursor is added to the selection.
    ///
    /// __See also:__ [`nearest`](https://vega.github.io/vega-lite/docs/nearest.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub nearest: Option<bool>,
    /// A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or
    /// selector) that triggers the selection. For interval selections, the event stream must
    /// specify a [start and
    /// end](https://vega.github.io/vega/docs/event-streams/#between-filters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub on: Option<OnUnion>,
    /// With layered and multi-view displays, a strategy that determines how selections' data
    /// queries are resolved when applied in a filter transform, conditional encoding rule, or
    /// scale domain.
    ///
    /// __See also:__ [`resolve`](https://vega.github.io/vega-lite/docs/selection-resolve.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<SelectionResolution>,
    /// Determines the default event processing and data query for the selection. Vega-Lite
    /// currently supports three selection types:
    ///
    /// - `"single"` -- to select a single discrete data value on `click`. - `"multi"` -- to
    /// select multiple discrete data value; the first value is selected on `click` and
    /// additional values toggled on shift-`click`. - `"interval"` -- to select a continuous
    /// range of data values on `drag`.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection_def_type: Option<SelectionDefType>,
    /// Controls whether data values should be toggled or only ever inserted into multi
    /// selections. Can be `true`, `false` (for insertion only), or a [Vega
    /// expression](https://vega.github.io/vega/docs/expressions/).
    ///
    /// __Default value:__ `true`, which corresponds to `event.shiftKey` (i.e., data values are
    /// toggled when a user interacts with the shift-key pressed).
    ///
    /// Setting the value to the Vega expression `"true"` will toggle data values without the
    /// user pressing the shift-key.
    ///
    /// __See also:__ [`toggle`](https://vega.github.io/vega-lite/docs/toggle.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub toggle: Option<Translate>,
    /// An interval selection also adds a rectangle mark to depict the extents of the interval.
    /// The `mark` property can be used to customize the appearance of the mark.
    ///
    /// __See also:__ [`mark`](https://vega.github.io/vega-lite/docs/selection-mark.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<BrushConfig>,
    /// When truthy, allows a user to interactively move an interval selection back-and-forth.
    /// Can be `true`, `false` (to disable panning), or a [Vega event stream
    /// definition](https://vega.github.io/vega/docs/event-streams/) which must include a start
    /// and end event to trigger continuous panning.
    ///
    /// __Default value:__ `true`, which corresponds to `[mousedown, window:mouseup] >
    /// window:mousemove!` which corresponds to clicks and dragging within an interval selection
    /// to reposition it.
    ///
    /// __See also:__ [`translate`](https://vega.github.io/vega-lite/docs/translate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub translate: Option<Translate>,
    /// When truthy, allows a user to interactively resize an interval selection. Can be `true`,
    /// `false` (to disable zooming), or a [Vega event stream
    /// definition](https://vega.github.io/vega/docs/event-streams/). Currently, only `wheel`
    /// events are supported.
    ///
    /// __Default value:__ `true`, which corresponds to `wheel!`.
    ///
    /// __See also:__ [`zoom`](https://vega.github.io/vega-lite/docs/zoom.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zoom: Option<Translate>,
}

/// Binds the parameter to an external input element such as a slider, selection list or
/// radio button group.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct PurpleBinding {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub debounce: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub element: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub input: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub binding_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub options: Option<Vec<Option<serde_json::Value>>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub autocomplete: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub placeholder: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub between: Option<Vec<Stream>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub consume: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filter: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub markname: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub marktype: Option<MarkType>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub source: Option<Source>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub throttle: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stream: Option<Stream>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub merge: Option<Vec<Stream>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Stream {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub between: Option<Vec<Stream>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub consume: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub debounce: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filter: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub markname: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub marktype: Option<MarkType>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub source: Option<Source>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub throttle: Option<f64>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stream_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stream: Option<Box<Stream>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub merge: Option<Vec<Stream>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ClearDerivedStream {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub between: Option<Vec<Stream>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub consume: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub debounce: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filter: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub markname: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub marktype: Option<MarkType>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub source: Option<Source>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub throttle: Option<f64>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ed_stream_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stream: Option<Stream>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub merge: Option<Vec<Stream>>,
}

/// An interval selection also adds a rectangle mark to depict the extents of the interval.
/// The `mark` property can be used to customize the appearance of the mark.
///
/// __See also:__ [`mark`](https://vega.github.io/vega-lite/docs/selection-mark.html)
/// documentation.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BrushConfig {
    /// The mouse cursor used over the interval mark. Any valid [CSS cursor
    /// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<Cursor>,
    /// The fill color of the interval mark.
    ///
    /// __Default value:__ `"#333333"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<String>,
    /// The fill opacity of the interval mark (a value between `0` and `1`).
    ///
    /// __Default value:__ `0.125`
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<f64>,
    /// The stroke color of the interval mark.
    ///
    /// __Default value:__ `"#ffffff"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<String>,
    /// An array of alternating stroke and space lengths, for creating dashed or dotted lines.
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<Vec<f64>>,
    /// The offset (in pixels) with which to begin drawing the stroke dash array.
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<f64>,
    /// The stroke opacity of the interval mark (a value between `0` and `1`).
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<f64>,
    /// The stroke width of the interval mark.
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct OnDerivedStream {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub between: Option<Vec<Stream>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub consume: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub debounce: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filter: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub markname: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub marktype: Option<MarkType>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub source: Option<Source>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub throttle: Option<f64>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ed_stream_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stream: Option<Stream>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub merge: Option<Vec<Stream>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TitleParams {
    /// Horizontal text alignment for title text. One of `"left"`, `"center"`, or `"right"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<Align>,
    /// The anchor position for placing the title. 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.
    ///
    /// __Default value:__ `"middle"` for
    /// [single](https://vega.github.io/vega-lite/docs/spec.html) and
    /// [layered](https://vega.github.io/vega-lite/docs/layer.html) views. `"start"` for other
    /// composite views.
    ///
    /// __Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only
    /// customizable only for [single](https://vega.github.io/vega-lite/docs/spec.html) and
    /// [layered](https://vega.github.io/vega-lite/docs/layer.html) views. For other composite
    /// views, `anchor` is always `"start"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub anchor: Option<TitleAnchorEnum>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    /// Vertical text baseline for title and subtitle text. One of `"alphabetic"` (default),
    /// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
    /// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
    /// relative to the *lineHeight* rather than *fontSize* alone.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<Baseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub frame: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<FontSize>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<TitleParamsOrient>,
    /// A [mark style property](https://vega.github.io/vega-lite/docs/config.html#style) to apply
    /// to the title text mark.
    ///
    /// __Default value:__ `"group-title"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
    /// The subtitle Text.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle: Option<LegendText>,
    #[serde(rename = "subtitleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_color: Option<Color>,
    #[serde(rename = "subtitleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font: Option<Color>,
    #[serde(rename = "subtitleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font_size: Option<FontSize>,
    #[serde(rename = "subtitleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font_style: Option<Color>,
    #[serde(rename = "subtitleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "subtitleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "subtitlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_padding: Option<CornerRadiusUnion>,
    /// The title text.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalValueDefTextExprRefText>,
    /// The integer z-index indicating the layering of the title group relative to other axis,
    /// mark and legend groups.
    ///
    /// __Default value:__ `0`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Transform {
    /// Array of objects that define fields to aggregate.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Vec<AggregatedFieldDef>>,
    /// The data fields to group by. If not specified, a single group containing all data objects
    /// will be used.
    ///
    /// An optional array of fields by which to group the values. Imputation will then be
    /// performed on a per-group basis.
    ///
    /// The data fields for partitioning the data objects into separate groups. If unspecified,
    /// all data points will be in a single group.
    ///
    /// The data fields to group by.
    ///
    /// The data fields for partitioning the data objects into separate windows. If unspecified,
    /// all data points will be in a single window.
    ///
    /// The optional data fields to group by. If not specified, a single group containing all
    /// data objects will be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub groupby: Option<Vec<String>>,
    /// The output fields at which to write the start and end bin values. This can be either a
    /// string or an array of strings with two elements denoting the name for the fields for bin
    /// start and bin end respectively. If a single string (e.g., `"val"`) is provided, the end
    /// field will be `"val_end"`.
    ///
    /// The field for storing the computed formula value.
    ///
    /// The output fields for the sample value and corresponding density estimate.
    ///
    /// __Default value:__ `["value", "density"]`
    ///
    /// The output field names for extracted array values.
    ///
    /// __Default value:__ The field name of the corresponding array field
    ///
    /// The output field names for the key and value properties produced by the fold transform.
    /// __Default value:__ `["key", "value"]`
    ///
    /// The output field names for the smoothed points generated by the loess transform.
    ///
    /// __Default value:__ The field names of the input x and y values.
    ///
    /// The output fields on which to store the looked up data values.
    ///
    /// For data lookups, this property may be left blank if `from.fields` has been specified
    /// (those field names will be used); if `from.fields` has not been specified, `as` must be a
    /// string.
    ///
    /// For selection lookups, this property is optional: if unspecified, looked up values will
    /// be stored under a property named for the selection; and if specified, it must correspond
    /// to `from.fields`.
    ///
    /// The output field names for the probability and quantile values.
    ///
    /// __Default value:__ `["prob", "value"]`
    ///
    /// The output field names for the smoothed points generated by the regression transform.
    ///
    /// __Default value:__ The field names of the input x and y values.
    ///
    /// The output field to write the timeUnit value.
    ///
    /// Output field names. This can be either a string or an array of strings with two elements
    /// denoting the name for the fields for stack start and stack end respectively. If a single
    /// string(e.g., `"val"`) is provided, the end field will be `"val_end"`.
    #[serde(rename = "as")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform_as: Option<LegendText>,
    /// An object indicating bin properties, or simply `true` for using default bin parameters.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// The data field to bin.
    ///
    /// The data field to apply time unit.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// A [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string. Use
    /// the variable `datum` to refer to the current data object.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub calculate: Option<String>,
    /// The bandwidth (standard deviation) of the Gaussian kernel. If unspecified or set to zero,
    /// the bandwidth value is automatically estimated from the input data using Scott’s rule.
    ///
    /// A bandwidth parameter in the range `[0, 1]` that determines the amount of smoothing.
    ///
    /// __Default value:__ `0.3`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bandwidth: Option<f64>,
    /// A boolean flag indicating if the output values should be probability estimates (false) or
    /// smoothed counts (true).
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub counts: Option<bool>,
    /// A boolean flag indicating whether to produce density estimates (false) or cumulative
    /// density estimates (true).
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cumulative: Option<bool>,
    /// The data field for which to perform density estimation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub density: Option<String>,
    /// A [min, max] domain from which to sample the distribution. If unspecified, the extent
    /// will be determined by the observed minimum and maximum values of the density value
    /// field.
    ///
    /// A [min, max] domain over the independent (x) field for the starting and ending points of
    /// the generated trend line.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<Vec<f64>>,
    /// The maximum number of samples to take along the extent domain for plotting the density.
    ///
    /// __Default value:__ `200`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub maxsteps: Option<f64>,
    /// The minimum number of samples to take along the extent domain for plotting the density.
    ///
    /// __Default value:__ `25`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub minsteps: Option<f64>,
    /// The exact number of samples to take along the extent domain for plotting the density. If
    /// specified, overrides both minsteps and maxsteps to set an exact number of uniform
    /// samples. Potentially useful in conjunction with a fixed extent to ensure consistent
    /// sample points for stacked densities.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub steps: Option<f64>,
    /// The `filter` property must be a predication definition, which can take one of the
    /// following forms:
    ///
    /// 1) an [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string,
    /// where `datum` can be used to refer to the current data object. For example, `{filter:
    /// "datum.b2 > 60"}` would make the output data includes only items that have values in the
    /// field `b2` over 60.
    ///
    /// 2) one of the [field
    /// predicates](https://vega.github.io/vega-lite/docs/predicate.html#field-predicate):
    /// [`equal`](https://vega.github.io/vega-lite/docs/predicate.html#field-equal-predicate),
    /// [`lt`](https://vega.github.io/vega-lite/docs/predicate.html#lt-predicate),
    /// [`lte`](https://vega.github.io/vega-lite/docs/predicate.html#lte-predicate),
    /// [`gt`](https://vega.github.io/vega-lite/docs/predicate.html#gt-predicate),
    /// [`gte`](https://vega.github.io/vega-lite/docs/predicate.html#gte-predicate),
    /// [`range`](https://vega.github.io/vega-lite/docs/predicate.html#range-predicate),
    /// [`oneOf`](https://vega.github.io/vega-lite/docs/predicate.html#one-of-predicate), or
    /// [`valid`](https://vega.github.io/vega-lite/docs/predicate.html#valid-predicate),
    ///
    /// 3) a [selection
    /// predicate](https://vega.github.io/vega-lite/docs/predicate.html#selection-predicate),
    /// which define the names of a selection that the data point should belong to (or a logical
    /// composition of selections).
    ///
    /// 4) a [logical
    /// composition](https://vega.github.io/vega-lite/docs/predicate.html#composition) of (1),
    /// (2), or (3).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filter: Option<ConditionalValueDefNumberExprRefPredicateComposition>,
    /// An array of one or more data fields containing arrays to flatten. If multiple fields are
    /// specified, their array values should have a parallel structure, ideally with the same
    /// length. If the lengths of parallel arrays do not match, the longest array will be used
    /// with `null` values added for missing entries.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub flatten: Option<Vec<String>>,
    /// An array of data fields indicating the properties to fold.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fold: Option<Vec<String>>,
    /// A frame specification as a two-element array used to control the window over which the
    /// specified method is applied. The array entries should either be a number indicating the
    /// offset from the current data object, or null to indicate unbounded rows preceding or
    /// following the current data object. For example, the value `[-5, 5]` indicates that the
    /// window should include five objects preceding and five objects following the current
    /// object.
    ///
    /// __Default value:__:  `[null, null]` indicating that the window includes all objects.
    ///
    /// A frame specification as a two-element array indicating how the sliding window should
    /// proceed. The array entries should either be a number indicating the offset from the
    /// current data object, or null to indicate unbounded rows preceding or following the
    /// current data object. The default value is `[null, 0]`, indicating that the sliding window
    /// includes the current object and all preceding objects. The value `[-5, 5]` indicates that
    /// the window should include five objects preceding and five objects following the current
    /// object. Finally, `[null, null]` indicates that the window frame should always include all
    /// data objects. If you this frame and want to assign the same value to add objects, you can
    /// use the simpler [join aggregate
    /// transform](https://vega.github.io/vega-lite/docs/joinaggregate.html). The only operators
    /// affected are the aggregation operations and the `first_value`, `last_value`, and
    /// `nth_value` window operations. The other window operations are not affected by this.
    ///
    /// __Default value:__:  `[null, 0]` (includes the current object and all preceding objects)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub frame: Option<Vec<Option<f64>>>,
    /// The data field for which the missing values should be imputed.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub impute: Option<String>,
    /// A key field that uniquely identifies data objects within a group. Missing key values
    /// (those occurring in the data but not in the current group) will be imputed.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub key: Option<String>,
    /// Defines the key values that should be considered for imputation. An array of key values
    /// or an object defining a [number
    /// sequence](https://vega.github.io/vega-lite/docs/impute.html#sequence-def).
    ///
    /// If provided, this will be used in addition to the key values observed within the input
    /// data. If not provided, the values will be derived from all unique values of the `key`
    /// field. For `impute` in `encoding`, the key field is the x-field if the y-field is
    /// imputed, or vice versa.
    ///
    /// If there is no impute grouping, this property _must_ be specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub keyvals: Option<Keyvals>,
    /// The imputation method to use for the field value of imputed data objects. One of
    /// `"value"`, `"mean"`, `"median"`, `"max"` or `"min"`.
    ///
    /// __Default value:__  `"value"`
    ///
    /// The functional form of the regression model. One of `"linear"`, `"log"`, `"exp"`,
    /// `"pow"`, `"quad"`, or `"poly"`.
    ///
    /// __Default value:__ `"linear"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub method: Option<TransformMethod>,
    /// The field value to use when the imputation `method` is `"value"`.
    ///
    /// The data field to populate pivoted fields. The aggregate values of this field become the
    /// values of the new pivoted fields.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<serde_json::Value>,
    /// The definition of the fields in the join aggregate, and what calculations to use.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub joinaggregate: Option<Vec<JoinAggregateFieldDef>>,
    /// The data field of the dependent variable to smooth.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub loess: Option<String>,
    /// The data field of the independent variable to use a predictor.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub on: Option<String>,
    /// The default value to use if lookup fails.
    ///
    /// __Default value:__ `null`
    #[serde(rename = "default")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform_default: Option<String>,
    /// Data source or selection for secondary data reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub from: Option<Lookup>,
    /// Key in primary data source.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub lookup: Option<String>,
    /// An array of probabilities in the range (0, 1) for which to compute quantile values. If
    /// not specified, the *step* parameter will be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub probs: Option<Vec<f64>>,
    /// The data field for which to perform quantile estimation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quantile: Option<String>,
    /// A probability step size (default 0.01) for sampling quantile values. All values from
    /// one-half the step size up to 1 (exclusive) will be sampled. This parameter is only used
    /// if the *probs* parameter is not provided.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// The polynomial order (number of coefficients) for the 'poly' method.
    ///
    /// __Default value:__ `3`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<f64>,
    /// A boolean flag indicating if the transform should return the regression model parameters
    /// (one object per group), rather than trend line points. The resulting objects include a
    /// `coef` array of fitted coefficient values (starting with the intercept term and then
    /// including terms of increasing order) and an `rSquared` value (indicating the total
    /// variance explained by the model).
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub params: Option<bool>,
    /// The data field of the dependent variable to predict.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub regression: Option<String>,
    /// The timeUnit.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// The maximum number of data objects to include in the sample.
    ///
    /// __Default value:__ `1000`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sample: Option<f64>,
    /// Mode for stacking marks. One of `"zero"` (default), `"center"`, or `"normalize"`. The
    /// `"zero"` offset will stack starting at `0`. The `"center"` offset will center the stacks.
    /// The `"normalize"` offset will compute percentage values for each stack point, with output
    /// values in the range `[0,1]`.
    ///
    /// __Default value:__ `"zero"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<StackOffset>,
    /// Field that determines the order of leaves in the stacked charts.
    ///
    /// A sort field definition for sorting data objects within a window. If two data objects are
    /// considered equal by the comparator, they are considered "peer" values of equal rank. If
    /// sort is not specified, the order is undefined: data objects are processed in the order
    /// they are observed and none are considered peers (the ignorePeers parameter is ignored and
    /// treated as if set to `true`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sort: Option<Vec<SortField>>,
    /// The field which is stacked.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stack: Option<String>,
    /// Indicates if the sliding window frame should ignore peer values (data that are considered
    /// identical by the sort criteria). The default is false, causing the window frame to expand
    /// to include all peer values. If set to true, the window frame will be defined by offset
    /// values only. This setting only affects those operations that depend on the window frame,
    /// namely aggregation operations and the first_value, last_value, and nth_value window
    /// operations.
    ///
    /// __Default value:__ `false`
    #[serde(rename = "ignorePeers")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ignore_peers: Option<bool>,
    /// The definition of the fields in the window, and what calculations to use.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub window: Option<Vec<WindowFieldDef>>,
    /// An optional parameter indicating the maximum number of pivoted fields to generate. The
    /// default (`0`) applies no limit. The pivoted `pivot` names are sorted in ascending order
    /// prior to enforcing the limit. __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<f64>,
    /// The aggregation operation to apply to grouped `value` field values. __Default value:__
    /// `sum`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<String>,
    /// The data field to pivot on. The unique values of this field become new field names in the
    /// output stream.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pivot: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AggregatedFieldDef {
    /// The output field names to use for each aggregated field.
    #[serde(rename = "as")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregated_field_def_as: Option<String>,
    /// The data field for which to compute aggregate function. This is required for all
    /// aggregation operations except `"count"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// The aggregation operation to apply to the fields (e.g., `"sum"`, `"average"`, or
    /// `"count"`). See the [full list of supported aggregation
    /// operations](https://vega.github.io/vega-lite/docs/aggregate.html#ops) for more
    /// information.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<AggregateOp>,
}

/// Data source or selection for secondary data reference.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Lookup {
    /// Secondary data source to lookup in.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub data: Option<Data>,
    /// Fields in foreign data or selection to lookup. If not specified, the entire object is
    /// queried.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fields: Option<Vec<String>>,
    /// Key in data to lookup.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub key: Option<String>,
    /// Selection name to look up.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<String>,
}

/// Secondary data source to lookup in.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Data {
    /// An object that specifies the format for parsing the data.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<DataFormat>,
    /// Provide a placeholder name and bind data at runtime.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An URL from which to load the data set. Use the `format.type` property to ensure the
    /// loaded data is correctly parsed.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<String>,
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub values: Option<UrlDataInlineDataset>,
    /// Generate a sequence of numbers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sequence: Option<SequenceParams>,
    /// Generate sphere GeoJSON data for the full globe.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub sphere: Option<SphereUnion>,
    /// Generate graticule GeoJSON data for geographic reference lines.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub graticule: Option<Graticule>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct JoinAggregateFieldDef {
    /// The output name for the join aggregate operation.
    #[serde(rename = "as")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub join_aggregate_field_def_as: Option<String>,
    /// The data field for which to compute the aggregate function. This can be omitted for
    /// functions that do not operate over a field such as `"count"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// The aggregation operation to apply (e.g., `"sum"`, `"average"` or `"count"`). See the
    /// list of all supported operations
    /// [here](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<AggregateOp>,
}

/// A sort definition for transform
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SortField {
    /// The name of the field to sort.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// Whether to sort the field in ascending or descending order. One of `"ascending"`
    /// (default), `"descending"`, or `null` (no not sort).
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub order: RemovableValue<SortOrder>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct WindowFieldDef {
    /// The output name for the window operation.
    #[serde(rename = "as")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub window_field_def_as: Option<String>,
    /// The data field for which to compute the aggregate or window function. This can be omitted
    /// for window functions that do not operate over a field such as `"count"`, `"rank"`,
    /// `"dense_rank"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// The window or aggregation operation to apply within a window (e.g., `"rank"`, `"lead"`,
    /// `"sum"`, `"average"` or `"count"`). See the list of all supported operations
    /// [here](https://vega.github.io/vega-lite/docs/window.html#ops).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<Op>,
    /// Parameter values for the window functions. Parameter values can be omitted for operations
    /// that do not accept a parameter.
    ///
    /// See the list of all supported operations and their parameters
    /// [here](https://vega.github.io/vega-lite/docs/transforms/window.html).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub param: Option<f64>,
}

/// An object defining the view background's fill and stroke.
///
/// __Default value:__ none (transparent)
///
/// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ViewBackground {
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    /// The mouse cursor used over the view. Any valid [CSS cursor
    /// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<Cursor>,
    /// The fill color.
    ///
    /// __Default value:__ `undefined`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<Color>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// The stroke color.
    ///
    /// __Default value:__ `"#ddd"`
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub stroke: RemovableValue<Color>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    /// A string or array of strings indicating the name of custom styles to apply to the view
    /// background. A style is a named collection of mark property defaults defined within the
    /// [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If
    /// style is an array, later styles will override earlier styles.
    ///
    /// __Default value:__ `"cell"` __Note:__ Any specified view background properties will
    /// augment the default style.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
}

/// Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If
/// `"repeat"` is an array, the field can be referred to as `{"repeat": "repeat"}`. The
/// repeated views are laid out in a wrapped row. You can set the number of columns to
/// control the wrapping. 2) An object that maps `"row"` and/or `"column"` to the listed
/// fields to be repeated along the particular orientations. The objects `{"repeat": "row"}`
/// and `{"repeat": "column"}` can be used to refer to the repeated field respectively.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RepeatMapping {
    /// An array of fields to be repeated horizontally.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<Vec<String>>,
    /// An array of fields to be repeated vertically.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<Vec<String>>,
    /// An array of fields to be repeated as layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<String>>,
}

/// A specification of the view that gets repeated.
///
/// Any specification in Vega-Lite.
///
/// Unit spec that can have a composite mark and row or column channels (shorthand for a
/// facet spec).
///
/// A full layered plot specification, which may contains `encoding` and `projection`
/// properties that will be applied to underlying unit (single-view) specifications.
///
/// Base interface for a repeat specification.
///
/// Base interface for a facet specification.
///
/// Base interface for a generalized concatenation specification.
///
/// Base interface for a vertical concatenation specification.
///
/// Base interface for a horizontal concatenation specification.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Spec {
    /// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
    /// `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// Alternatively, an object value of the form `{"row": string, "column": string}` can be
    /// used to supply different alignments for rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<VegaliteAlign>,
    /// The bounds calculation method to use for determining the extent of a sub-plot. One of
    /// `full` (the default) or `flush`.
    ///
    /// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
    /// be used. - If set to `flush`, only the specified width and height values for the sub-view
    /// will be used. The `flush` setting can be useful when attempting to place sub-plots
    /// without axes or legends into a uniform grid structure.
    ///
    /// __Default value:__ `"full"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bounds: Option<Bounds>,
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// An object value of the form `{"row": boolean, "column": boolean}` can be used to supply
    /// different centering values for rows and columns.
    ///
    /// __Default value:__ `false`
    ///
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Center>,
    /// An object describing the data source. Set to `null` to ignore the parent's data source.
    /// If no data is set, it is derived from the parent.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub data: RemovableValue<UrlData>,
    /// Description of this mark for commenting purpose.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// A key-value mapping between encoding channels and definition of fields.
    ///
    /// A shared key-value mapping between encoding channels and definition of fields in the
    /// underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<EdEncoding>,
    /// The height of a visualization.
    ///
    /// - For a plot with a continuous y-field, height should be a number. - For a plot with
    /// either a discrete y-field or no y-field, height can be either a number indicating a fixed
    /// height or an object in the form of `{step: number}` defining the height per discrete
    /// step. (No y-field is equivalent to having one discrete step.) - To enable responsive
    /// sizing on height, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous
    /// y-field and `config.view.discreteHeight` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// height of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<HeightUnion>,
    /// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
    /// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
    /// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<AnyMark>,
    /// Name of the visualization for later reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An object defining properties of geographic projection, which will be applied to `shape`
    /// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other
    /// marks.
    ///
    /// An object defining properties of the geographic projection shared by underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// Scale, axis, and legend resolutions for view composition specifications.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<Resolve>,
    /// A key-value mapping between selection names and definitions.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<HashMap<String, SelectionDef>>,
    /// The spacing in pixels between sub-views of the composition operator. An object of the
    /// form `{"row": number, "column": number}` can be used to set different spacing values for
    /// rows and columns.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    ///
    /// The spacing in pixels between sub-views of the concat operator.
    ///
    /// __Default value__: `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<Spacing>,
    /// Title for the plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<TitleUnion>,
    /// An array of data transformations such as filter and new field calculation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform: Option<Vec<Transform>>,
    /// An object defining the view background's fill and stroke.
    ///
    /// __Default value:__ none (transparent)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewBackground>,
    /// The width of a visualization.
    ///
    /// - For a plot with a continuous x-field, width should be a number. - For a plot with
    /// either a discrete x-field or no x-field, width can be either a number indicating a fixed
    /// width or an object in the form of `{step: number}` defining the width per discrete step.
    /// (No x-field is equivalent to having one discrete step.) - To enable responsive sizing on
    /// width, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous
    /// x-field and `config.view.discreteWidth` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// width of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<HeightUnion>,
    /// Layer or single view specifications to be layered.
    ///
    /// __Note__: Specifications inside `layer` cannot use `row` and `column` channels as
    /// layering facet specifications is not allowed. Instead, use the [facet
    /// operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a
    /// facet.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<LayerElement>>,
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If
    /// `"repeat"` is an array, the field can be referred to as `{"repeat": "repeat"}`. The
    /// repeated views are laid out in a wrapped row. You can set the number of columns to
    /// control the wrapping. 2) An object that maps `"row"` and/or `"column"` to the listed
    /// fields to be repeated along the particular orientations. The objects `{"repeat": "row"}`
    /// and `{"repeat": "column"}` can be used to refer to the repeated field respectively.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatUnion>,
    /// A specification of the view that gets repeated.
    ///
    /// A specification of the view that gets faceted.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spec: Option<NormalizedSpecSpec>,
    /// Definition for how to facet the data. One of: 1) [a field definition for faceting the
    /// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
    /// object that maps `row` and `column` channels to their field
    /// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<FacetFieldName>,
    /// A list of views to be concatenated.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub concat: Option<Vec<Spec>>,
    /// A list of views to be concatenated and put into a column.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub vconcat: Option<Vec<Spec>>,
    /// A list of views to be concatenated and put into a row.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hconcat: Option<Vec<Spec>>,
}

/// A specification of the view that gets repeated.
///
/// Any specification in Vega-Lite.
///
/// Unit spec that can have a composite mark and row or column channels (shorthand for a
/// facet spec).
///
/// A full layered plot specification, which may contains `encoding` and `projection`
/// properties that will be applied to underlying unit (single-view) specifications.
///
/// Base interface for a repeat specification.
///
/// Base interface for a facet specification.
///
/// Base interface for a generalized concatenation specification.
///
/// Base interface for a vertical concatenation specification.
///
/// Base interface for a horizontal concatenation specification.
///
/// A unit specification, which can contain either [primitive marks or composite
/// marks](https://vega.github.io/vega-lite/docs/mark.html#types).
///
/// A specification of the view that gets faceted.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct NormalizedSpecSpec {
    /// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
    /// `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// Alternatively, an object value of the form `{"row": string, "column": string}` can be
    /// used to supply different alignments for rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<VegaliteAlign>,
    /// The bounds calculation method to use for determining the extent of a sub-plot. One of
    /// `full` (the default) or `flush`.
    ///
    /// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
    /// be used. - If set to `flush`, only the specified width and height values for the sub-view
    /// will be used. The `flush` setting can be useful when attempting to place sub-plots
    /// without axes or legends into a uniform grid structure.
    ///
    /// __Default value:__ `"full"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bounds: Option<Bounds>,
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// An object value of the form `{"row": boolean, "column": boolean}` can be used to supply
    /// different centering values for rows and columns.
    ///
    /// __Default value:__ `false`
    ///
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Center>,
    /// An object describing the data source. Set to `null` to ignore the parent's data source.
    /// If no data is set, it is derived from the parent.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub data: RemovableValue<UrlData>,
    /// Description of this mark for commenting purpose.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// A key-value mapping between encoding channels and definition of fields.
    ///
    /// A shared key-value mapping between encoding channels and definition of fields in the
    /// underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<SpecEncoding>,
    /// The height of a visualization.
    ///
    /// - For a plot with a continuous y-field, height should be a number. - For a plot with
    /// either a discrete y-field or no y-field, height can be either a number indicating a fixed
    /// height or an object in the form of `{step: number}` defining the height per discrete
    /// step. (No y-field is equivalent to having one discrete step.) - To enable responsive
    /// sizing on height, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous
    /// y-field and `config.view.discreteHeight` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// height of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<HeightUnion>,
    /// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
    /// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
    /// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<AnyMark>,
    /// Name of the visualization for later reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An object defining properties of geographic projection, which will be applied to `shape`
    /// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other
    /// marks.
    ///
    /// An object defining properties of the geographic projection shared by underlying layers.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// Scale, axis, and legend resolutions for view composition specifications.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<Resolve>,
    /// A key-value mapping between selection names and definitions.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<HashMap<String, SelectionDef>>,
    /// The spacing in pixels between sub-views of the composition operator. An object of the
    /// form `{"row": number, "column": number}` can be used to set different spacing values for
    /// rows and columns.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    ///
    /// The spacing in pixels between sub-views of the concat operator.
    ///
    /// __Default value__: `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<Spacing>,
    /// Title for the plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<TitleUnion>,
    /// An array of data transformations such as filter and new field calculation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform: Option<Vec<Transform>>,
    /// An object defining the view background's fill and stroke.
    ///
    /// __Default value:__ none (transparent)
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewBackground>,
    /// The width of a visualization.
    ///
    /// - For a plot with a continuous x-field, width should be a number. - For a plot with
    /// either a discrete x-field or no x-field, width can be either a number indicating a fixed
    /// width or an object in the form of `{step: number}` defining the width per discrete step.
    /// (No x-field is equivalent to having one discrete step.) - To enable responsive sizing on
    /// width, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous
    /// x-field and `config.view.discreteWidth` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// width of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<HeightUnion>,
    /// Layer or single view specifications to be layered.
    ///
    /// __Note__: Specifications inside `layer` cannot use `row` and `column` channels as
    /// layering facet specifications is not allowed. Instead, use the [facet
    /// operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a
    /// facet.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<LayerElement>>,
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If
    /// `"repeat"` is an array, the field can be referred to as `{"repeat": "repeat"}`. The
    /// repeated views are laid out in a wrapped row. You can set the number of columns to
    /// control the wrapping. 2) An object that maps `"row"` and/or `"column"` to the listed
    /// fields to be repeated along the particular orientations. The objects `{"repeat": "row"}`
    /// and `{"repeat": "column"}` can be used to refer to the repeated field respectively.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatUnion>,
    /// A specification of the view that gets repeated.
    ///
    /// A specification of the view that gets faceted.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spec: Option<Box<NormalizedSpecSpec>>,
    /// Definition for how to facet the data. One of: 1) [a field definition for faceting the
    /// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
    /// object that maps `row` and `column` channels to their field
    /// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<FacetFieldName>,
    /// A list of views to be concatenated.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub concat: Option<Vec<Spec>>,
    /// A list of views to be concatenated and put into a column.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub vconcat: Option<Vec<Spec>>,
    /// A list of views to be concatenated and put into a row.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hconcat: Option<Vec<Spec>>,
}

/// Definition for how to facet the data. One of: 1) [a field definition for faceting the
/// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
/// object that maps `row` and `column` channels to their field
/// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
///
/// A field definition for the horizontal facet of trellis plots.
///
/// A field definition for the vertical facet of trellis plots.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FacetFieldName {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// An object defining properties of a facet's header.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<Header>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` is not supported for `row` and `column`.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<FluffySortArray>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet_field_name_type: Option<StandardType>,
    /// A field definition for the horizontal facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<FacetFieldDefFieldName>,
    /// A field definition for the vertical facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<FacetFieldDefFieldName>,
}

/// A field definition for the horizontal facet of trellis plots.
///
/// A field definition for the vertical facet of trellis plots.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FacetFieldDefFieldName {
    /// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
    /// `"max"`, `"count"`).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aggregate: Option<Aggregate>,
    /// For rect-based marks (`rect`, `bar`, and `image`), mark size relative to bandwidth of
    /// [band scales](https://vega.github.io/vega-lite/docs/scale.html#band), bins or time units.
    /// If set to `1`, the mark size is set to the bandwidth, the bin interval, or the time unit
    /// interval. If set to `0.5`, the mark size is half of the bandwidth or the time unit
    /// interval.
    ///
    /// For other marks, relative position on a band of a stacked, binned, time unit or band
    /// scale. If set to `0`, the marks will be positioned at the beginning of the band. If set
    /// to `0.5`, the marks will be positioned in the middle of the band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<f64>,
    /// A flag for binning a `quantitative` field, [an object defining binning
    /// parameters](https://vega.github.io/vega-lite/docs/bin.html#params), or indicating that
    /// the data for `x` or `y` channel are binned before they are imported into Vega-Lite
    /// (`"binned"`).
    ///
    /// - If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html)
    /// will be applied.
    ///
    /// - If `"binned"`, this indicates that the data for the `x` (or `y`) channel are already
    /// binned. You can map the bin-start field to `x` (or `y`) and the bin-end field to `x2` (or
    /// `y2`). The scale and axis will be formatted similar to binning in Vega-Lite.  To adjust
    /// the axis ticks based on the bin step, you can also set the axis's
    /// [`tickMinStep`](https://vega.github.io/vega-lite/docs/axis.html#ticks) property.
    ///
    /// __Default value:__ `false`
    ///
    /// __See also:__ [`bin`](https://vega.github.io/vega-lite/docs/bin.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin: Option<AngleBin>,
    /// __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.
    ///
    /// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
    ///
    /// __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`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// An object defining properties of a facet's header.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<Header>,
    /// Sort order for the encoded field.
    ///
    /// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
    /// `"descending"`.
    ///
    /// For discrete fields, `sort` can be one of the following: - `"ascending"` or
    /// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
    /// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
    /// another field. - [An array specifying the field values in preferred
    /// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
    /// sort order will obey the values in the array, followed by any unspecified values in their
    /// original order. For discrete time field, values in the sort array can be [date-time
    /// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
    /// the values can be the month or day names (case insensitive) or their 3-letter initials
    /// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
    ///
    /// __Default value:__ `"ascending"`
    ///
    /// __Note:__ `null` is not supported for `row` and `column`.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub sort: RemovableValue<FluffySortArray>,
    /// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
    /// temporal field that gets casted as
    /// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
    ///
    /// __Default value:__ `undefined` (None)
    ///
    /// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
    /// documentation.
    #[serde(rename = "timeUnit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit: Option<TimeUnitUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    /// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
    /// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
    /// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
    ///
    /// Vega-Lite automatically infers data types in many cases as discussed below. However, type
    /// is required for a field if: (1) the field is not nominal and the field encoding has no
    /// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
    /// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
    /// or `timeUnit`.
    ///
    /// __Default value:__
    ///
    /// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
    /// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
    /// following criteria: - `"quantitative"` is the default type if (1) the encoded field
    /// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
    /// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
    /// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
    /// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
    /// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
    /// encoded field contains a [custom `sort`
    /// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
    /// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
    /// `order`.
    ///
    /// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
    /// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
    /// object](https://vega.github.io/vega-lite/docs/datetime.html)
    ///
    /// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
    /// data types (number, string, etc.). The same primitive data type can have different types
    /// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
    /// data. - Data values for a temporal field can be either a date-time string (e.g.,
    /// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
    /// (e.g., `1552199579097`). - When using with
    /// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
    /// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
    /// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
    /// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
    /// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
    /// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
    /// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
    /// the `type` property refers to the post-aggregation data type. For example, we can
    /// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
    /// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
    /// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
    /// have exactly the same type as their primary channels (e.g., `x`, `y`).
    ///
    /// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet_field_def_field_name_type: Option<StandardType>,
}

/// A sort definition for sorting a discrete scale in an encoding field definition.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct EncodingSortFieldFieldName {
    /// The data [field](https://vega.github.io/vega-lite/docs/field.html) to sort by.
    ///
    /// __Default value:__ If unspecified, defaults to the field specified in the outer data
    /// reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field: Option<String>,
    /// An [aggregate operation](https://vega.github.io/vega-lite/docs/aggregate.html#ops) to
    /// perform on the field prior to sorting (e.g., `"count"`, `"mean"` and `"median"`). An
    /// aggregation is required when there are multiple values of the sort field for each encoded
    /// data field. The input data objects will be aggregated, grouped by the encoded data
    /// field.
    ///
    /// For a full list of operations, please see the documentation for
    /// [aggregate](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
    ///
    /// __Default value:__ `"sum"` for stacked plots. Otherwise, `"min"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub op: Option<NonArgAggregateOp>,
    /// The sort order. One of `"ascending"` (default), `"descending"`, or `null` (no not sort).
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub order: RemovableValue<SortOrder>,
}

/// A key-value mapping between encoding channels and definition of fields.
///
/// A shared key-value mapping between encoding channels and definition of fields in the
/// underlying layers.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SpecEncoding {
    /// Rotation angle of point and text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<AngleClass>,
    /// Color of the marks – either fill or stroke color based on  the `filled` property of mark
    /// definition. By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,
    /// `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and
    /// `"point"`.
    ///
    /// __Default value:__ If undefined, the default color depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _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).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<ColorClass>,
    /// A field definition for the horizontal facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column: Option<RowColumnEncodingFieldDef>,
    /// A text description of this mark for ARIA accessibility (SVG output only). For SVG output
    /// the `"aria-label"` attribute will be set to this description.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<DescriptionClass>,
    /// Additional levels of detail for grouping data in aggregate views and in line, trail, and
    /// area marks without mapping data to a specific visual channel.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub detail: Option<Detail>,
    /// A field definition for the (flexible) facet of trellis plots.
    ///
    /// If either `row` or `column` is specified, this channel will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<FacetEncodingFieldDef>,
    /// Fill color of the marks. __Default value:__ If undefined, the default color depends on
    /// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _Note:_ The `fill` encoding has higher precedence than `color`, thus may override the
    /// `color` encoding if conflicting encodings are specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<FillClass>,
    /// Fill opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `fillOpacity`
    /// property.
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<FillOpacityClass>,
    /// A URL to load upon mouse click.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<HrefClass>,
    /// A data field to use as a unique key for data binding. When a visualization’s data is
    /// updated, the key value will be used to match data elements to existing mark instances.
    /// Use a key channel to enable object constancy for transitions over dynamic data.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub key: Option<KeyClass>,
    /// Latitude position of geographically projected marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub latitude: Option<LatitudeClass>,
    /// Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and
    /// `"rule"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub latitude2: Option<Latitude2Class>,
    /// Longitude position of geographically projected marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub longitude: Option<LongitudeClass>,
    /// Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`,
    /// and  `"rule"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub longitude2: Option<Longitude2Class>,
    /// Opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `opacity`
    /// property.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<OpacityClass>,
    /// Order of the marks. - For stacked marks, this `order` channel encodes [stack
    /// order](https://vega.github.io/vega-lite/docs/stack.html#order). - For line and trail
    /// marks, this `order` channel encodes order of data points in the lines. This can be useful
    /// for creating [a connected
    /// scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html).
    /// Setting `order` to `{"value": null}` makes the line marks use the original order in the
    /// data sources. - Otherwise, this `order` channel encodes layer order of the marks.
    ///
    /// __Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating
    /// additional aggregation grouping.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<Order>,
    /// The outer radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<RadiusClass>,
    /// The inner radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<Radius2Class>,
    /// A field definition for the vertical facet of trellis plots.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row: Option<RowColumnEncodingFieldDef>,
    /// Shape of the mark.
    ///
    /// 1. For `point` marks the supported values include:    - plotting shapes: `"circle"`,
    /// `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, `"triangle-down"`,
    /// `"triangle-right"`, or `"triangle-left"`.    - the line symbol `"stroke"`    - centered
    /// directional shapes `"arrow"`, `"wedge"`, or `"triangle"`    - a custom [SVG path
    /// string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct
    /// sizing, custom shape paths should be defined within a square bounding box with
    /// coordinates ranging from -1 to 1 along both the x and y dimensions.)
    ///
    /// 2. For `geoshape` marks it should be a field definition of the geojson data
    ///
    /// __Default value:__ If undefined, the default shape depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape`
    /// property. (`"circle"` if unset.)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<MarkPropDefStringNullTypeForShape>,
    /// Size of the mark. - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel
    /// area of the mark. - For `"bar"` and `"tick"` – the bar and tick's size. - For `"text"` –
    /// the text's font size. - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use
    /// `"trail"` instead of line with varying size)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<SizeClass>,
    /// Stroke color of the marks. __Default value:__ If undefined, the default color depends on
    /// [mark config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `color`
    /// property.
    ///
    /// _Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the
    /// `color` encoding if conflicting encodings are specified.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<StrokeClass>,
    /// Stroke dash of the marks.
    ///
    /// __Default value:__ `[1,0]` (No dash).
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<MarkPropDefNumber>,
    /// Stroke opacity of the marks.
    ///
    /// __Default value:__ If undefined, the default opacity depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeOpacity`
    /// property.
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<StrokeOpacityClass>,
    /// Stroke width of the marks.
    ///
    /// __Default value:__ If undefined, the default stroke width depends on [mark
    /// config](https://vega.github.io/vega-lite/docs/config.html#mark-config)'s `strokeWidth`
    /// property.
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<StrokeWidthClass>,
    /// Text of the `text` mark.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<TextDef>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<ThetaClass>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<Theta2Class>,
    /// The tooltip text to show upon mouse hover. Specifying `tooltip` encoding overrides [the
    /// `tooltip` property in the mark
    /// definition](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip in Vega-Lite.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<EncodingTooltip>,
    /// The URL of an image mark.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<UrlClass>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XClass>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<X2Class>,
    /// Error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "xError")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_error: Option<XErrorClass>,
    /// Secondary error value of x coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "xError2")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_error2: Option<XError2Class>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YClass>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<Y2Class>,
    /// Error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "yError")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_error: Option<YErrorClass>,
    /// Secondary error value of y coordinates for error specified `"errorbar"` and `"errorband"`.
    #[serde(rename = "yError2")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y_error2: Option<YError2Class>,
}

/// Vega-Lite configuration object. This property can only be defined at the top-level of a
/// specification.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Config {
    /// Arc-specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub arc: Option<RectConfig>,
    /// Area-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub area: Option<AreaConfig>,
    /// A boolean flag indicating if ARIA default attributes should be included for marks and
    /// guides (SVG output only). If false, the `"aria-hidden"` attribute will be set for all
    /// guides, removing them from the ARIA accessibility tree and Vega-Lite will not generate
    /// default descriptions for marks.
    ///
    /// __Default value:__ `true`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<bool>,
    /// How the visualization size should be determined. If a string, should be one of `"pad"`,
    /// `"fit"` or `"none"`. Object values can additionally specify parameters for content sizing
    /// and automatic resizing.
    ///
    /// __Default value__: `pad`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub autosize: Option<Autosize>,
    /// Axis configuration, which determines default properties for all `x` and `y`
    /// [axes](https://vega.github.io/vega-lite/docs/axis.html). For a full list of axis
    /// configuration options, please see the [corresponding section of the axis
    /// documentation](https://vega.github.io/vega-lite/docs/axis.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis: Option<AxisConfig>,
    /// Config for axes with "band" scales.
    #[serde(rename = "axisBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_band: Option<AxisConfig>,
    /// Config for x-axis along the bottom edge of the chart.
    #[serde(rename = "axisBottom")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_bottom: Option<AxisConfig>,
    /// Config for axes with "point" or "band" scales.
    #[serde(rename = "axisDiscrete")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_discrete: Option<AxisConfig>,
    /// Config for y-axis along the left edge of the chart.
    #[serde(rename = "axisLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_left: Option<AxisConfig>,
    /// Config for axes with "point" scales.
    #[serde(rename = "axisPoint")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_point: Option<AxisConfig>,
    /// Config for quantitative axes.
    #[serde(rename = "axisQuantitative")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_quantitative: Option<AxisConfig>,
    /// Config for y-axis along the right edge of the chart.
    #[serde(rename = "axisRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_right: Option<AxisConfig>,
    /// Config for temporal axes.
    #[serde(rename = "axisTemporal")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_temporal: Option<AxisConfig>,
    /// Config for x-axis along the top edge of the chart.
    #[serde(rename = "axisTop")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_top: Option<AxisConfig>,
    /// X-axis specific config.
    #[serde(rename = "axisX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_x: Option<AxisConfig>,
    /// Config for x-axes with "band" scales.
    #[serde(rename = "axisXBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_x_band: Option<AxisConfig>,
    /// Config for x-axes with "point" or "band" scales.
    #[serde(rename = "axisXDiscrete")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_x_discrete: Option<AxisConfig>,
    /// Config for x-axes with "point" scales.
    #[serde(rename = "axisXPoint")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_x_point: Option<AxisConfig>,
    /// Config for x-quantitative axes.
    #[serde(rename = "axisXQuantitative")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_x_quantitative: Option<AxisConfig>,
    /// Config for x-temporal axes.
    #[serde(rename = "axisXTemporal")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_x_temporal: Option<AxisConfig>,
    /// Y-axis specific config.
    #[serde(rename = "axisY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_y: Option<AxisConfig>,
    /// Config for y-axes with "band" scales.
    #[serde(rename = "axisYBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_y_band: Option<AxisConfig>,
    /// Config for y-axes with "point" or "band" scales.
    #[serde(rename = "axisYDiscrete")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_y_discrete: Option<AxisConfig>,
    /// Config for y-axes with "point" scales.
    #[serde(rename = "axisYPoint")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_y_point: Option<AxisConfig>,
    /// Config for y-quantitative axes.
    #[serde(rename = "axisYQuantitative")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_y_quantitative: Option<AxisConfig>,
    /// Config for y-temporal axes.
    #[serde(rename = "axisYTemporal")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub axis_y_temporal: Option<AxisConfig>,
    /// CSS color property to use as the background of the entire view.
    ///
    /// __Default value:__ `"white"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub background: Option<Color>,
    /// Bar-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bar: Option<BarConfig>,
    /// Box Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub boxplot: Option<BoxPlotConfig>,
    /// Circle-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub circle: Option<MarkConfig>,
    /// Default configuration for all concatenation and repeat view composition operators
    /// (`concat`, `hconcat`, `vconcat`, and `repeat`)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub concat: Option<CompositionConfig>,
    /// Default axis and legend title for count fields.
    ///
    /// __Default value:__ `'Count of Records`.
    #[serde(rename = "countTitle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub count_title: Option<String>,
    /// Allow the `formatType` property for text marks and guides to accept a custom formatter
    /// function [registered as a Vega
    /// expression](https://vega.github.io/vega-lite/usage/compile.html#format-type).
    #[serde(rename = "customFormatTypes")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub custom_format_types: Option<bool>,
    /// ErrorBand Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub errorband: Option<ErrorBandConfig>,
    /// ErrorBar Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub errorbar: Option<ErrorBarConfig>,
    /// Default configuration for the `facet` view composition operator
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<CompositionConfig>,
    /// Defines how Vega-Lite generates title for fields. There are three possible styles: -
    /// `"verbal"` (Default) - displays function in a verbal style (e.g., "Sum of field",
    /// "Year-month of date", "field (binned)"). - `"function"` - displays function using
    /// parentheses and capitalized texts (e.g., "SUM(field)", "YEARMONTH(date)", "BIN(field)").
    /// - `"plain"` - displays only the field name without functions (e.g., "field", "date",
    /// "field").
    #[serde(rename = "fieldTitle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub field_title: Option<FieldTitle>,
    /// Default font for all text marks, titles, and labels.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<String>,
    /// Geoshape-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub geoshape: Option<MarkConfig>,
    /// Header configuration, which determines default properties for all
    /// [headers](https://vega.github.io/vega-lite/docs/header.html).
    ///
    /// For a full list of header configuration options, please see the [corresponding section of
    /// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header: Option<HeaderConfig>,
    /// Header configuration, which determines default properties for column
    /// [headers](https://vega.github.io/vega-lite/docs/header.html).
    ///
    /// For a full list of header configuration options, please see the [corresponding section of
    /// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
    #[serde(rename = "headerColumn")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header_column: Option<HeaderConfig>,
    /// Header configuration, which determines default properties for non-row/column facet
    /// [headers](https://vega.github.io/vega-lite/docs/header.html).
    ///
    /// For a full list of header configuration options, please see the [corresponding section of
    /// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
    #[serde(rename = "headerFacet")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header_facet: Option<HeaderConfig>,
    /// Header configuration, which determines default properties for row
    /// [headers](https://vega.github.io/vega-lite/docs/header.html).
    ///
    /// For a full list of header configuration options, please see the [corresponding section of
    /// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
    #[serde(rename = "headerRow")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub header_row: Option<HeaderConfig>,
    /// Image-specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub image: Option<RectConfig>,
    /// Legend configuration, which determines default properties for all
    /// [legends](https://vega.github.io/vega-lite/docs/legend.html). For a full list of legend
    /// configuration options, please see the [corresponding section of in the legend
    /// documentation](https://vega.github.io/vega-lite/docs/legend.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend: Option<LegendConfig>,
    /// Line-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line: Option<LineConfig>,
    /// A delimiter, such as a newline character, upon which to break text strings into multiple
    /// lines. This property provides a global default for text marks, which is overridden by
    /// mark or style config settings, and by the lineBreak mark encoding channel. If
    /// signal-valued, either string or regular expression (regexp) values are valid.
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    /// Mark Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<MarkConfig>,
    /// D3 Number format for guide labels and text marks. For example `"s"` for SI units. Use
    /// [D3's number format pattern](https://github.com/d3/d3-format#locale_format).
    #[serde(rename = "numberFormat")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub number_format: Option<String>,
    /// The default visualization padding, in pixels, from the edge of the visualization canvas
    /// to the data rectangle. If a number, specifies padding for all sides. If an object, the
    /// value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify
    /// padding for each side of the visualization.
    ///
    /// __Default value__: `5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding: Option<Padding>,
    /// Dynamic variables that parameterize a visualization.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub params: Option<Vec<Parameter>>,
    /// Point-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point: Option<MarkConfig>,
    /// Projection configuration, which determines default properties for all
    /// [projections](https://vega.github.io/vega-lite/docs/projection.html). For a full list of
    /// projection configuration options, please see the [corresponding section of the projection
    /// documentation](https://vega.github.io/vega-lite/docs/projection.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// An object hash that defines default range arrays or schemes for using with scales. For a
    /// full list of scale range configuration options, please see the [corresponding section of
    /// the scale documentation](https://vega.github.io/vega-lite/docs/scale.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub range: Option<HashMap<String, RangeValue>>,
    /// Rect-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rect: Option<RectConfig>,
    /// Rule-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rule: Option<MarkConfig>,
    /// Scale configuration determines default properties for all
    /// [scales](https://vega.github.io/vega-lite/docs/scale.html). For a full list of scale
    /// configuration options, please see the [corresponding section of the scale
    /// documentation](https://vega.github.io/vega-lite/docs/scale.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub scale: Option<ScaleConfig>,
    /// An object hash for defining default properties for each type of selections.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<SelectionConfig>,
    /// Square-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub square: Option<MarkConfig>,
    /// An object hash that defines key-value mappings to determine default properties for marks
    /// with a given [style](https://vega.github.io/vega-lite/docs/mark.html#mark-def). The keys
    /// represent styles names; the values have to be valid [mark configuration
    /// objects](https://vega.github.io/vega-lite/docs/mark.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<HashMap<String, StyleValue>>,
    /// Text-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<MarkConfig>,
    /// Tick-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick: Option<TickConfig>,
    /// Default time format for raw time values (without time units) in text marks, legend labels
    /// and header labels.
    ///
    /// __Default value:__ `"%b %d, %Y"` __Note:__ Axes automatically determine the format for
    /// each label automatically so this config does not affect axes.
    #[serde(rename = "timeFormat")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_format: Option<String>,
    /// Title configuration, which determines default properties for all
    /// [titles](https://vega.github.io/vega-lite/docs/title.html). For a full list of title
    /// configuration options, please see the [corresponding section of the title
    /// documentation](https://vega.github.io/vega-lite/docs/title.html#config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<BaseTitleNoValueRefs>,
    /// Trail-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub trail: Option<LineConfig>,
    /// Default properties for [single view
    /// plots](https://vega.github.io/vega-lite/docs/spec.html#single).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewConfig>,
}

/// Arc-specific Config
///
/// Image-specific Config
///
/// Rect-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RectConfig {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    /// Offset between bars for binned field. The ideal value for this is either 0 (preferred by
    /// statisticians) or 1 (Vega-Lite default, D3 example style).
    ///
    /// __Default value:__ `1`
    #[serde(rename = "binSpacing")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin_spacing: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    /// The default size of the bars on continuous scales.
    ///
    /// __Default value:__ `5`
    #[serde(rename = "continuousBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_band_size: Option<f64>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    /// The default size of the bars with discrete dimensions. If unspecified, the default size
    /// is  `step-2`, which provides 2 pixel offset between bars.
    #[serde(rename = "discreteBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub discrete_band_size: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

/// Area-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AreaConfig {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    /// A flag for overlaying line on top of area marks, or an object defining the properties of
    /// the overlayed lines.
    ///
    /// - If this value is an empty object (`{}`) or `true`, lines with default properties will
    /// be used.
    ///
    /// - If this value is `false`, no lines would be automatically added to area marks.
    ///
    /// __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line: Option<Line>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// A flag for overlaying points on top of line or area marks, or an object defining the
    /// properties of the overlayed points.
    ///
    /// - If this property is `"transparent"`, transparent points will be used (for enhancing
    /// tooltips and selections).
    ///
    /// - If this property is an empty object (`{}`) or `true`, filled points with default
    /// properties will be used.
    ///
    /// - If this property is `false`, no points would be automatically added to line or area
    /// marks.
    ///
    /// __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point: Option<PointUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

/// Axis configuration, which determines default properties for all `x` and `y`
/// [axes](https://vega.github.io/vega-lite/docs/axis.html). For a full list of axis
/// configuration options, please see the [corresponding section of the axis
/// documentation](https://vega.github.io/vega-lite/docs/axis.html#config).
///
/// Config for axes with "band" scales.
///
/// Config for x-axis along the bottom edge of the chart.
///
/// Config for axes with "point" or "band" scales.
///
/// Config for y-axis along the left edge of the chart.
///
/// Config for axes with "point" scales.
///
/// Config for quantitative axes.
///
/// Config for y-axis along the right edge of the chart.
///
/// Config for temporal axes.
///
/// Config for x-axis along the top edge of the chart.
///
/// X-axis specific config.
///
/// Config for x-axes with "band" scales.
///
/// Config for x-axes with "point" or "band" scales.
///
/// Config for x-axes with "point" scales.
///
/// Config for x-quantitative axes.
///
/// Config for x-temporal axes.
///
/// Y-axis specific config.
///
/// Config for y-axes with "band" scales.
///
/// Config for y-axes with "point" or "band" scales.
///
/// Config for y-axes with "point" scales.
///
/// Config for y-quantitative axes.
///
/// Config for y-temporal axes.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AxisConfig {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "bandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_position: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    /// Disable axis by default.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub disable: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain: Option<Aria>,
    #[serde(rename = "domainCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_cap: Option<Cap>,
    #[serde(rename = "domainColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_color: Option<Color>,
    #[serde(rename = "domainDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_dash: Option<StrokeDashUnion>,
    #[serde(rename = "domainDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "domainOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "domainWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_width: Option<CornerRadiusUnion>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// A boolean flag indicating if grid lines should be included as part of the axis
    ///
    /// __Default value:__ `true` for [continuous
    /// scales](https://vega.github.io/vega-lite/docs/scale.html#continuous) that are not binned;
    /// otherwise, `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid: Option<bool>,
    #[serde(rename = "gridCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_cap: Option<Cap>,
    #[serde(rename = "gridColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_color: Option<GridColorUnion>,
    #[serde(rename = "gridDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_dash: Option<AxisBandGridDash>,
    #[serde(rename = "gridDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_dash_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "gridOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_opacity: Option<GridOpacityUnion>,
    #[serde(rename = "gridWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_width: Option<GridWidthUnion>,
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<ConditionalAxisPropertyAlignNull>,
    #[serde(rename = "labelAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_angle: Option<LabelAngle>,
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<PurpleTextBaseline>,
    #[serde(rename = "labelBound")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_bound: Option<Label>,
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<GridColorUnion>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels
    /// text.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Indicates if the first and last axis labels should be aligned flush with the scale range.
    /// Flush alignment for a horizontal axis will left-align the first label and right-align the
    /// last label. For vertical axes, bottom and top text baselines are applied instead. If this
    /// property is a number, it also indicates the number of pixels by which to offset the first
    /// and last labels; for example, a value of 2 will flush-align the first and last labels and
    /// also push them 2 pixels outward from the center of the axis. The additional adjustment
    /// can sometimes help the labels better visually group with corresponding axis ticks.
    ///
    /// __Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`.
    #[serde(rename = "labelFlush")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_flush: Option<LabelFlush>,
    #[serde(rename = "labelFlushOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_flush_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<ConditionalAxisPropertyStringNull>,
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<GridWidthUnion>,
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<ConditionalAxisPropertyFontStyleNull>,
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeight>,
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "labelLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "labelOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_opacity: Option<GridDashOffsetUnion>,
    /// The strategy to use for resolving overlap of axis labels. If `false` (the default), no
    /// overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing
    /// every other label is used (this works well for standard linear axes). If set to
    /// `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps
    /// with the last visible label (this often works better for log-scaled axes).
    ///
    /// __Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log
    /// scales; otherwise `false`.
    #[serde(rename = "labelOverlap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_overlap: Option<LabelOverlapUnion>,
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<GridDashOffsetUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<Aria>,
    #[serde(rename = "labelSeparation")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_separation: Option<CornerRadiusUnion>,
    #[serde(rename = "maxExtent")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_extent: Option<CornerRadiusUnion>,
    #[serde(rename = "minExtent")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_extent: Option<CornerRadiusUnion>,
    /// The offset, in pixels, by which to displace the axis from the edge of the enclosing group
    /// or data rectangle.
    ///
    /// __Default value:__ derived from the [axis
    /// config](https://vega.github.io/vega-lite/docs/config.html#facet-scale-config)'s `offset`
    /// (`0` by default)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<f64>,
    /// 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
    /// towards the right edge of the chart).
    ///
    /// __Default value:__ `"bottom"` for x-axes and `"left"` for y-axes.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<TitleOrientUnion>,
    /// The anchor position of the axis in pixels. For x-axes with top or bottom orientation,
    /// this sets the axis group x coordinate. For y-axes with left or right orientation, this
    /// sets the axis group y coordinate.
    ///
    /// __Default value__: `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position: Option<CornerRadiusUnion>,
    /// A string or array of strings indicating the name of custom styles to apply to the axis. A
    /// style is a named collection of axis property defined within the [style
    /// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
    /// an array, later styles will override earlier styles.
    ///
    /// __Default value:__ (none) __Note:__ Any specified style will augment the default style.
    /// For example, an x-axis mark with `"style": "foo"` will use `config.axisX` and
    /// `config.style.foo` (the specified style `"foo"` has higher precedence).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
    #[serde(rename = "tickBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_band: Option<TickBandUnion>,
    #[serde(rename = "tickCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_cap: Option<Cap>,
    #[serde(rename = "tickColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_color: Option<GridColorUnion>,
    /// 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.
    ///
    /// For scales of type `"time"` or `"utc"`, the tick count can instead be a time interval
    /// specifier. Legal string values are `"millisecond"`, `"second"`, `"minute"`, `"hour"`,
    /// `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, an object-valued interval
    /// specifier of the form `{"interval": "month", "step": 3}` includes a desired number of
    /// interval steps. Here, ticks are generated for each quarter (Jan, Apr, Jul, Oct)
    /// boundary.
    ///
    /// __Default value__: Determine using a formula `ceil(width/40)` for x and `ceil(height/40)`
    /// for y.
    #[serde(rename = "tickCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_count: Option<TickCount>,
    #[serde(rename = "tickDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_dash: Option<AxisBandTickDash>,
    #[serde(rename = "tickDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_dash_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "tickExtra")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_extra: Option<Aria>,
    /// 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.
    #[serde(rename = "tickMinStep")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_min_step: Option<CornerRadiusUnion>,
    #[serde(rename = "tickOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "tickOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_opacity: Option<GridDashOffsetUnion>,
    #[serde(rename = "tickRound")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_round: Option<Aria>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ticks: Option<Aria>,
    #[serde(rename = "tickSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_size: Option<GridWidthUnion>,
    #[serde(rename = "tickWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_width: Option<GridWidthUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorUnion>,
    #[serde(rename = "titleAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_angle: Option<CornerRadiusUnion>,
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<FontSize>,
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<FontSize>,
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "titleX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_x: Option<CornerRadiusUnion>,
    #[serde(rename = "titleY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_y: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub translate: Option<CornerRadiusUnion>,
    /// Explicitly set the visible axis tick values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub values: Option<Values>,
    /// A non-negative integer indicating the z-index of the axis. If zindex is 0, axes should be
    /// drawn behind all chart elements. To put them in front, set `zindex` to `1` or more.
    ///
    /// __Default value:__ `0` (behind the marks).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct AmbitiousExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<TentacledConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Vec<f64>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct CunningExprRef {
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub condition: Option<TentacledConditionalPredicateValueDefNumberNullExprRef>,
    /// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
    /// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
    /// between `0` to `1` for opacity).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<Vec<f64>>,
}

/// Bar-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BarConfig {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    /// Offset between bars for binned field. The ideal value for this is either 0 (preferred by
    /// statisticians) or 1 (Vega-Lite default, D3 example style).
    ///
    /// __Default value:__ `1`
    #[serde(rename = "binSpacing")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin_spacing: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    /// The default size of the bars on continuous scales.
    ///
    /// __Default value:__ `5`
    #[serde(rename = "continuousBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_band_size: Option<f64>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    /// - For vertical bars, top-left and top-right corner radius. - For horizontal bars,
    /// top-right and bottom-right corner radius.
    #[serde(rename = "cornerRadiusEnd")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_end: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    /// The default size of the bars with discrete dimensions. If unspecified, the default size
    /// is  `step-2`, which provides 2 pixel offset between bars.
    #[serde(rename = "discreteBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub discrete_band_size: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

/// Box Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BoxPlotConfig {
    #[serde(rename = "box")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub box_plot_config_box: Option<DefBox>,
    /// The extent of the whiskers. Available options include: - `"min-max"`: min and max are the
    /// lower and upper whiskers respectively. - A number representing multiple of the
    /// interquartile range. This number will be multiplied by the IQR to determine whisker
    /// boundary, which spans from the smallest data to the largest data within the range _[Q1 -
    /// k * IQR, Q3 + k * IQR]_ where _Q1_ and _Q3_ are the first and third quartiles while _IQR_
    /// is the interquartile range (_Q3-Q1_).
    ///
    /// __Default value:__ `1.5`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<BoxplotExtent>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub median: Option<DefBox>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outliers: Option<DefBox>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rule: Option<DefBox>,
    /// Size of the box and median tick of a box plot
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ticks: Option<DefBox>,
}

/// Circle-Specific Config
///
/// Geoshape-Specific Config
///
/// Mark Config
///
/// Point-Specific Config
///
/// Rule-Specific Config
///
/// Square-Specific Config
///
/// Default style for chart subtitles
///
/// Default style for chart titles
///
/// Default style for axis, legend, and header labels.
///
/// Default style for axis, legend, and header titles.
///
/// Text-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct MarkConfig {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

/// Default configuration for all concatenation and repeat view composition operators
/// (`concat`, `hconcat`, `vconcat`, and `repeat`)
///
/// Default configuration for the `facet` view composition operator
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct CompositionConfig {
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// The default spacing in pixels between composed sub-views.
    ///
    /// __Default value__: `20`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<f64>,
}

/// ErrorBand Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ErrorBandConfig {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band: Option<DefBox>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub borders: Option<DefBox>,
    /// The extent of the band. Available options include: - `"ci"`: Extend the band to the
    /// confidence interval of the mean. - `"stderr"`: The size of band are set to the value of
    /// standard error, extending from the mean. - `"stdev"`: The size of band are set to the
    /// value of standard deviation, extending from the mean. - `"iqr"`: Extend the band to the
    /// q1 and q3.
    ///
    /// __Default value:__ `"stderr"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<ErrorbandExtent>,
    /// The line interpolation method for the error band. One of the following: - `"linear"`:
    /// piecewise linear segments, as in a polyline. - `"linear-closed"`: close the linear
    /// segments to form a polygon. - `"step"`: a piecewise constant function (a step function)
    /// consisting of alternating horizontal and vertical lines. The y-value changes at the
    /// midpoint of each pair of adjacent x-values. - `"step-before"`: a piecewise constant
    /// function (a step function) consisting of alternating horizontal and vertical lines. The
    /// y-value changes before the x-value. - `"step-after"`: a piecewise constant function (a
    /// step function) consisting of alternating horizontal and vertical lines. The y-value
    /// changes after the x-value. - `"basis"`: a B-spline, with control point duplication on the
    /// ends. - `"basis-open"`: an open B-spline; may not intersect the start or end. -
    /// `"basis-closed"`: a closed B-spline, as in a loop. - `"cardinal"`: a Cardinal spline,
    /// with control point duplication on the ends. - `"cardinal-open"`: an open Cardinal spline;
    /// may not intersect the start or end, but will intersect other control points. -
    /// `"cardinal-closed"`: a closed Cardinal spline, as in a loop. - `"bundle"`: equivalent to
    /// basis, except the tension parameter is used to straighten the spline. - `"monotone"`:
    /// cubic interpolation that preserves monotonicity in y.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<Interpolate>,
    /// The tension parameter for the interpolation type of the error band.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<f64>,
}

/// ErrorBar Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ErrorBarConfig {
    /// The extent of the rule. Available options include: - `"ci"`: Extend the rule to the
    /// confidence interval of the mean. - `"stderr"`: The size of rule are set to the value of
    /// standard error, extending from the mean. - `"stdev"`: The size of rule are set to the
    /// value of standard deviation, extending from the mean. - `"iqr"`: Extend the rule to the
    /// q1 and q3.
    ///
    /// __Default value:__ `"stderr"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<ErrorbandExtent>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rule: Option<DefBox>,
    /// Size of the ticks of an error bar
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<f64>,
    /// Thickness of the ticks and the bar of an error bar
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub thickness: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ticks: Option<DefBox>,
}

/// Header configuration, which determines default properties for all
/// [headers](https://vega.github.io/vega-lite/docs/header.html).
///
/// For a full list of header configuration options, please see the [corresponding section of
/// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
///
/// Header configuration, which determines default properties for column
/// [headers](https://vega.github.io/vega-lite/docs/header.html).
///
/// For a full list of header configuration options, please see the [corresponding section of
/// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
///
/// Header configuration, which determines default properties for non-row/column facet
/// [headers](https://vega.github.io/vega-lite/docs/header.html).
///
/// For a full list of header configuration options, please see the [corresponding section of
/// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
///
/// Header configuration, which determines default properties for row
/// [headers](https://vega.github.io/vega-lite/docs/header.html).
///
/// For a full list of header configuration options, please see the [corresponding section of
/// in the header documentation](https://vega.github.io/vega-lite/docs/header.html#config).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct HeaderConfig {
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// Horizontal text alignment of header labels. One of `"left"`, `"center"`, or `"right"`.
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<TitleAlignUnion>,
    /// The anchor position for placing the labels. One of `"start"`, `"middle"`, or `"end"`. For
    /// example, with a label orientation of top these anchor positions map to a left-, center-,
    /// or right-aligned label.
    #[serde(rename = "labelAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_anchor: Option<TitleAnchorEnum>,
    /// The rotation angle of the header labels.
    ///
    /// __Default value:__ `0` for column header, `-90` for row header.
    #[serde(rename = "labelAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_angle: Option<f64>,
    /// The vertical text baseline for the header labels. One of `"alphabetic"` (default),
    /// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
    /// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
    /// relative to the `titleLineHeight` rather than `titleFontSize` alone.
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<TextBaseline>,
    /// The color of the header label, can be in hex color code or regular color name.
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<Color>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the header's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// The font of the header label.
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<Color>,
    /// The font size of the header label, in pixels.
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<CornerRadiusUnion>,
    /// The font style of the header label.
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<Color>,
    /// The font weight of the header label.
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeightUnion>,
    /// The maximum length of the header label in pixels. The text value will be automatically
    /// truncated if the rendered size exceeds the limit.
    ///
    /// __Default value:__ `0`, indicating no limit
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    /// Line height in pixels for multi-line header labels or title text with `"line-top"` or
    /// `"line-bottom"` baseline.
    #[serde(rename = "labelLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_line_height: Option<CornerRadiusUnion>,
    /// The orientation of the header label. One of `"top"`, `"bottom"`, `"left"` or `"right"`.
    #[serde(rename = "labelOrient")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_orient: Option<Orient>,
    /// The padding, in pixel, between facet header's label and the plot.
    ///
    /// __Default value:__ `10`
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<CornerRadiusUnion>,
    /// A boolean flag indicating if labels should be included as part of the header.
    ///
    /// __Default value:__ `true`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<bool>,
    /// Shortcut for setting both labelOrient and titleOrient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orient>,
    /// Set to null to disable title for the axis, legend, or header.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<serde_json::Value>,
    /// Horizontal text alignment (to the anchor) of header titles.
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    /// The anchor position for placing the title. 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.
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorEnum>,
    /// The rotation angle of the header title.
    ///
    /// __Default value:__ `0`.
    #[serde(rename = "titleAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_angle: Option<f64>,
    /// The vertical text baseline for the header title. One of `"alphabetic"` (default),
    /// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
    /// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
    /// relative to the `titleLineHeight` rather than `titleFontSize` alone.
    ///
    /// __Default value:__ `"middle"`
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    /// Color of the header title, can be in hex color code or regular color name.
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    /// Font of the header title. (e.g., `"Helvetica Neue"`).
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    /// Font size of the header title.
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<CornerRadiusUnion>,
    /// The font style of the header title.
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    /// Font weight of the header title. This can be either a string (e.g `"bold"`, `"normal"`)
    /// or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` =
    /// `700`).
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    /// The maximum length of the header title in pixels. The text value will be automatically
    /// truncated if the rendered size exceeds the limit.
    ///
    /// __Default value:__ `0`, indicating no limit
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<CornerRadiusUnion>,
    /// Line height in pixels for multi-line header title text or title text with `"line-top"` or
    /// `"line-bottom"` baseline.
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    /// The orientation of the header title. One of `"top"`, `"bottom"`, `"left"` or `"right"`.
    #[serde(rename = "titleOrient")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_orient: Option<Orient>,
    /// The padding, in pixel, between facet header's title and the label.
    ///
    /// __Default value:__ `10`
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
}

/// Legend configuration, which determines default properties for all
/// [legends](https://vega.github.io/vega-lite/docs/legend.html). For a full list of legend
/// configuration options, please see the [corresponding section of in the legend
/// documentation](https://vega.github.io/vega-lite/docs/legend.html#config).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LegendConfig {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "clipHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clip_height: Option<CornerRadiusUnion>,
    #[serde(rename = "columnPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub column_padding: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    /// The direction of the legend, one of `"vertical"` or `"horizontal"`.
    ///
    /// __Default value:__ - For top-/bottom-`orient`ed legends, `"horizontal"` - For
    /// left-/right-`orient`ed legends, `"vertical"` - For top/bottom-left/right-`orient`ed
    /// legends, `"horizontal"` for gradient legends and `"vertical"` for symbol legends.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub direction: Option<Orientation>,
    /// Disable legend by default
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub disable: Option<bool>,
    #[serde(rename = "fillColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_color: Option<Color>,
    #[serde(rename = "gradientDirection")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_direction: Option<Direction>,
    /// Max legend length for a horizontal gradient when `config.legend.gradientLength` is
    /// undefined.
    ///
    /// __Default value:__ `200`
    #[serde(rename = "gradientHorizontalMaxLength")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_horizontal_max_length: Option<f64>,
    /// Min legend length for a horizontal gradient when `config.legend.gradientLength` is
    /// undefined.
    ///
    /// __Default value:__ `100`
    #[serde(rename = "gradientHorizontalMinLength")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_horizontal_min_length: Option<f64>,
    #[serde(rename = "gradientLabelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_label_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "gradientLabelOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_label_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "gradientLength")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_length: Option<FontSize>,
    #[serde(rename = "gradientOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "gradientStrokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_stroke_color: Option<Color>,
    #[serde(rename = "gradientStrokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_stroke_width: Option<FontSize>,
    #[serde(rename = "gradientThickness")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_thickness: Option<FontSize>,
    /// Max legend length for a vertical gradient when `config.legend.gradientLength` is
    /// undefined.
    ///
    /// __Default value:__ `200`
    #[serde(rename = "gradientVerticalMaxLength")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_vertical_max_length: Option<f64>,
    /// Min legend length for a vertical gradient when `config.legend.gradientLength` is
    /// undefined.
    ///
    /// __Default value:__ `100`
    #[serde(rename = "gradientVerticalMinLength")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient_vertical_min_length: Option<f64>,
    #[serde(rename = "gridAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_align: Option<GridAlign>,
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<TitleAlignUnion>,
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<TextBaseline>,
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<Color>,
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<Color>,
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<FontSize>,
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<Color>,
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_opacity: Option<CornerRadiusUnion>,
    /// The strategy to use for resolving overlap of labels in gradient legends. If `false`, no
    /// overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing
    /// every other label is used. If set to `"greedy"`, a linear scan of the labels is
    /// performed, removing any label that overlaps with the last visible label (this often works
    /// better for log-scaled axes).
    ///
    /// __Default value:__ `"greedy"` for `log scales otherwise `true`.
    #[serde(rename = "labelOverlap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_overlap: Option<LabelOverlapUnion>,
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "labelSeparation")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_separation: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layout: Option<BackgroundExprRef>,
    #[serde(rename = "legendX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend_x: Option<CornerRadiusUnion>,
    #[serde(rename = "legendY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend_y: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<CornerRadiusUnion>,
    /// The orientation of the legend, which determines how the legend is positioned within the
    /// scene. One of `"left"`, `"right"`, `"top"`, `"bottom"`, `"top-left"`, `"top-right"`,
    /// `"bottom-left"`, `"bottom-right"`, `"none"`.
    ///
    /// __Default value:__ `"right"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<LegendOrient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub padding: Option<CornerRadiusUnion>,
    #[serde(rename = "rowPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub row_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_color: Option<Color>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolBaseFillColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_base_fill_color: Option<Color>,
    #[serde(rename = "symbolBaseStrokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_base_stroke_color: Option<Color>,
    #[serde(rename = "symbolDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_dash: Option<StrokeDashUnion>,
    #[serde(rename = "symbolDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolDirection")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_direction: Option<Direction>,
    #[serde(rename = "symbolFillColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_fill_color: Option<Color>,
    #[serde(rename = "symbolLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "symbolSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_size: Option<FontSize>,
    #[serde(rename = "symbolStrokeColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_stroke_color: Option<Color>,
    #[serde(rename = "symbolStrokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_stroke_width: Option<FontSize>,
    #[serde(rename = "symbolType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub symbol_type: Option<Color>,
    #[serde(rename = "tickCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_count: Option<TickCount>,
    /// Set to null to disable title for the axis, legend, or header.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<serde_json::Value>,
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorUnion>,
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<CornerRadiusUnion>,
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<FontSize>,
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOrient")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_orient: Option<TitleOrientUnion>,
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
    /// The opacity of unselected legend entries.
    ///
    /// __Default value:__ 0.35.
    #[serde(rename = "unselectedOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub unselected_opacity: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<FontSize>,
}

/// Line-Specific Config
///
/// Trail-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LineConfig {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// A flag for overlaying points on top of line or area marks, or an object defining the
    /// properties of the overlayed points.
    ///
    /// - If this property is `"transparent"`, transparent points will be used (for enhancing
    /// tooltips and selections).
    ///
    /// - If this property is an empty object (`{}`) or `true`, filled points with default
    /// properties will be used.
    ///
    /// - If this property is `false`, no points would be automatically added to line or area
    /// marks.
    ///
    /// __Default value:__ `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point: Option<PointUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct MagentaExprRef {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bottom: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub left: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub right: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub top: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Parameter {
    /// Binds the parameter to an external input element such as a slider, selection list or
    /// radio button group.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bind: Option<Binding>,
    /// A text description of the parameter, useful for inline documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// 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.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
    /// Required. A unique name for the 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", "event", "item", and "parent".
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// The initial value of the parameter.
    ///
    /// __Default value:__ `undefined`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub value: Option<serde_json::Value>,
}

/// Binds the parameter to an external input element such as a slider, selection list or
/// radio button group.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct Binding {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub debounce: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub element: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub input: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub binding_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub options: Option<Vec<Option<serde_json::Value>>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub autocomplete: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub placeholder: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct RangeRange {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub count: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub extent: Option<Vec<f64>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub scheme: Option<RangeText>,
}

/// Scale configuration determines default properties for all
/// [scales](https://vega.github.io/vega-lite/docs/scale.html). For a full list of scale
/// configuration options, please see the [corresponding section of the scale
/// documentation](https://vega.github.io/vega-lite/docs/scale.html#config).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ScaleConfig {
    /// Default inner padding for `x` and `y` band-ordinal scales.
    ///
    /// __Default value:__ - `barBandPaddingInner` for bar marks (`0.1` by default) -
    /// `rectBandPaddingInner` for rect and other marks (`0` by default)
    #[serde(rename = "bandPaddingInner")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_padding_inner: Option<CornerRadiusUnion>,
    /// Default outer padding for `x` and `y` band-ordinal scales.
    ///
    /// __Default value:__ `paddingInner/2` (which makes _width/height = number of unique values
    /// * step_)
    #[serde(rename = "bandPaddingOuter")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_padding_outer: Option<CornerRadiusUnion>,
    /// Default inner padding for `x` and `y` band-ordinal scales of `"bar"` marks.
    ///
    /// __Default value:__ `0.1`
    #[serde(rename = "barBandPaddingInner")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bar_band_padding_inner: Option<CornerRadiusUnion>,
    /// If true, values that exceed the data domain are clamped to either the minimum or maximum
    /// range value
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clamp: Option<Aria>,
    /// Default padding for continuous scales.
    ///
    /// __Default:__ `5` for continuous x-scale of a vertical bar and continuous y-scale of a
    /// horizontal bar.; `0` otherwise.
    #[serde(rename = "continuousPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_padding: Option<CornerRadiusUnion>,
    /// The default max value for mapping quantitative fields to bar's size/bandSize.
    ///
    /// If undefined (default), we will use the axis's size (width or height) - 1.
    #[serde(rename = "maxBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_band_size: Option<f64>,
    /// The default max value for mapping quantitative fields to text's size/fontSize.
    ///
    /// __Default value:__ `40`
    #[serde(rename = "maxFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_font_size: Option<f64>,
    /// Default max opacity for mapping a field to opacity.
    ///
    /// __Default value:__ `0.8`
    #[serde(rename = "maxOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_opacity: Option<f64>,
    /// Default max value for point size scale.
    #[serde(rename = "maxSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_size: Option<f64>,
    /// Default max strokeWidth for the scale of strokeWidth for rule and line marks and of size
    /// for trail marks.
    ///
    /// __Default value:__ `4`
    #[serde(rename = "maxStrokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_stroke_width: Option<f64>,
    /// The default min value for mapping quantitative fields to bar and tick's size/bandSize
    /// scale with zero=false.
    ///
    /// __Default value:__ `2`
    #[serde(rename = "minBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_band_size: Option<f64>,
    /// The default min value for mapping quantitative fields to tick's size/fontSize scale with
    /// zero=false
    ///
    /// __Default value:__ `8`
    #[serde(rename = "minFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_font_size: Option<f64>,
    /// Default minimum opacity for mapping a field to opacity.
    ///
    /// __Default value:__ `0.3`
    #[serde(rename = "minOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_opacity: Option<f64>,
    /// Default minimum value for point size scale with zero=false.
    ///
    /// __Default value:__ `9`
    #[serde(rename = "minSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_size: Option<f64>,
    /// Default minimum strokeWidth for the scale of strokeWidth for rule and line marks and of
    /// size for trail marks with zero=false.
    ///
    /// __Default value:__ `1`
    #[serde(rename = "minStrokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_stroke_width: Option<f64>,
    /// Default outer padding for `x` and `y` point-ordinal scales.
    ///
    /// __Default value:__ `0.5` (which makes _width/height = number of unique values * step_)
    #[serde(rename = "pointPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point_padding: Option<CornerRadiusUnion>,
    /// Default range cardinality for
    /// [`quantile`](https://vega.github.io/vega-lite/docs/scale.html#quantile) scale.
    ///
    /// __Default value:__ `4`
    #[serde(rename = "quantileCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quantile_count: Option<f64>,
    /// Default range cardinality for
    /// [`quantize`](https://vega.github.io/vega-lite/docs/scale.html#quantize) scale.
    ///
    /// __Default value:__ `4`
    #[serde(rename = "quantizeCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub quantize_count: Option<f64>,
    /// Default inner padding for `x` and `y` band-ordinal scales of `"rect"` marks.
    ///
    /// __Default value:__ `0`
    #[serde(rename = "rectBandPaddingInner")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub rect_band_padding_inner: Option<CornerRadiusUnion>,
    /// If true, rounds numeric output values to integers. This can be helpful for snapping to
    /// the pixel grid. (Only available for `x`, `y`, and `size` scales.)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub round: Option<Aria>,
    /// Use the source data range before aggregation as scale domain instead of aggregated data
    /// for aggregate axis.
    ///
    /// This is equivalent to setting `domain` to `"unaggregate"` for aggregated _quantitative_
    /// fields by default.
    ///
    /// This property only works with aggregate functions that produce values within the raw data
    /// domain (`"mean"`, `"average"`, `"median"`, `"q1"`, `"q3"`, `"min"`, `"max"`). For other
    /// aggregations that produce values outside of the raw data domain (e.g. `"count"`,
    /// `"sum"`), this property is ignored.
    ///
    /// __Default value:__ `false`
    #[serde(rename = "useUnaggregatedDomain")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub use_unaggregated_domain: Option<bool>,
    /// Reverse x-scale by default (useful for right-to-left charts).
    #[serde(rename = "xReverse")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x_reverse: Option<Aria>,
}

/// An object hash for defining default properties for each type of selections.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SelectionConfig {
    /// The default definition for an
    /// [`interval`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All
    /// properties and transformations for an interval selection definition (except `type`) may
    /// be specified here.
    ///
    /// For instance, setting `interval` to `{"translate": false}` disables the ability to move
    /// interval selections by default.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interval: Option<IntervalSelectionConfig>,
    /// The default definition for a
    /// [`multi`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All
    /// properties and transformations for a multi selection definition (except `type`) may be
    /// specified here.
    ///
    /// For instance, setting `multi` to `{"toggle": "event.altKey"}` adds additional values to
    /// multi selections when clicking with the alt-key pressed by default.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub multi: Option<MultiSelectionConfig>,
    /// The default definition for a
    /// [`single`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All
    /// properties and transformations   for a single selection definition (except `type`) may be
    /// specified here.
    ///
    /// For instance, setting `single` to `{"on": "dblclick"}` populates single selections on
    /// double-click by default.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub single: Option<SingleSelectionConfig>,
}

/// The default definition for an
/// [`interval`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All
/// properties and transformations for an interval selection definition (except `type`) may
/// be specified here.
///
/// For instance, setting `interval` to `{"translate": false}` disables the ability to move
/// interval selections by default.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct IntervalSelectionConfig {
    /// Establishes a two-way binding between the interval selection and the scales used within
    /// the same view. This allows a user to interactively pan and zoom the view.
    ///
    /// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bind: Option<Bind>,
    /// Clears the selection, emptying it of all values. Can be a [Event
    /// Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable.
    ///
    /// __Default value:__ `dblclick`.
    ///
    /// __See also:__ [`clear`](https://vega.github.io/vega-lite/docs/clear.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clear: Option<ClearUnion>,
    /// By default, `all` data values are considered to lie within an empty selection. When set
    /// to `none`, empty selections contain no data values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub empty: Option<Empty>,
    /// An array of encoding channels. The corresponding data field values must match for a data
    /// tuple to fall within the selection.
    ///
    /// __See also:__ [`encodings`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encodings: Option<Vec<SingleDefUnitChannel>>,
    /// An array of field names whose values must match for a data tuple to fall within the
    /// selection.
    ///
    /// __See also:__ [`fields`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fields: Option<Vec<String>>,
    /// Initialize the selection with a mapping between [projected channels or field
    /// names](https://vega.github.io/vega-lite/docs/project.html) and arrays of initial values.
    ///
    /// __See also:__ [`init`](https://vega.github.io/vega-lite/docs/init.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub init: Option<HashMap<String, Vec<SelectionInitInterval>>>,
    /// An interval selection also adds a rectangle mark to depict the extents of the interval.
    /// The `mark` property can be used to customize the appearance of the mark.
    ///
    /// __See also:__ [`mark`](https://vega.github.io/vega-lite/docs/selection-mark.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<BrushConfig>,
    /// A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or
    /// selector) that triggers the selection. For interval selections, the event stream must
    /// specify a [start and
    /// end](https://vega.github.io/vega/docs/event-streams/#between-filters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub on: Option<OnUnion>,
    /// With layered and multi-view displays, a strategy that determines how selections' data
    /// queries are resolved when applied in a filter transform, conditional encoding rule, or
    /// scale domain.
    ///
    /// __See also:__ [`resolve`](https://vega.github.io/vega-lite/docs/selection-resolve.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<SelectionResolution>,
    /// When truthy, allows a user to interactively move an interval selection back-and-forth.
    /// Can be `true`, `false` (to disable panning), or a [Vega event stream
    /// definition](https://vega.github.io/vega/docs/event-streams/) which must include a start
    /// and end event to trigger continuous panning.
    ///
    /// __Default value:__ `true`, which corresponds to `[mousedown, window:mouseup] >
    /// window:mousemove!` which corresponds to clicks and dragging within an interval selection
    /// to reposition it.
    ///
    /// __See also:__ [`translate`](https://vega.github.io/vega-lite/docs/translate.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub translate: Option<Translate>,
    /// When truthy, allows a user to interactively resize an interval selection. Can be `true`,
    /// `false` (to disable zooming), or a [Vega event stream
    /// definition](https://vega.github.io/vega/docs/event-streams/). Currently, only `wheel`
    /// events are supported.
    ///
    /// __Default value:__ `true`, which corresponds to `wheel!`.
    ///
    /// __See also:__ [`zoom`](https://vega.github.io/vega-lite/docs/zoom.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zoom: Option<Translate>,
}

/// The default definition for a
/// [`multi`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All
/// properties and transformations for a multi selection definition (except `type`) may be
/// specified here.
///
/// For instance, setting `multi` to `{"toggle": "event.altKey"}` adds additional values to
/// multi selections when clicking with the alt-key pressed by default.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct MultiSelectionConfig {
    /// When set, a selection is populated by interacting with the corresponding legend. Direct
    /// manipulation interaction is disabled by default; to re-enable it, set the selection's
    /// [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties)
    /// property.
    ///
    /// Legend bindings are restricted to selections that only specify a single field or encoding.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bind: Option<LegendBinding>,
    /// Clears the selection, emptying it of all values. Can be a [Event
    /// Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable.
    ///
    /// __Default value:__ `dblclick`.
    ///
    /// __See also:__ [`clear`](https://vega.github.io/vega-lite/docs/clear.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clear: Option<ClearUnion>,
    /// By default, `all` data values are considered to lie within an empty selection. When set
    /// to `none`, empty selections contain no data values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub empty: Option<Empty>,
    /// An array of encoding channels. The corresponding data field values must match for a data
    /// tuple to fall within the selection.
    ///
    /// __See also:__ [`encodings`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encodings: Option<Vec<SingleDefUnitChannel>>,
    /// An array of field names whose values must match for a data tuple to fall within the
    /// selection.
    ///
    /// __See also:__ [`fields`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fields: Option<Vec<String>>,
    /// Initialize the selection with a mapping between [projected channels or field
    /// names](https://vega.github.io/vega-lite/docs/project.html) and an initial value (or array
    /// of values).
    ///
    /// __See also:__ [`init`](https://vega.github.io/vega-lite/docs/init.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub init: Option<Vec<HashMap<String, Option<SelectionInit>>>>,
    /// When true, an invisible voronoi diagram is computed to accelerate discrete selection. The
    /// data value _nearest_ the mouse cursor is added to the selection.
    ///
    /// __See also:__ [`nearest`](https://vega.github.io/vega-lite/docs/nearest.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub nearest: Option<bool>,
    /// A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or
    /// selector) that triggers the selection. For interval selections, the event stream must
    /// specify a [start and
    /// end](https://vega.github.io/vega/docs/event-streams/#between-filters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub on: Option<OnUnion>,
    /// With layered and multi-view displays, a strategy that determines how selections' data
    /// queries are resolved when applied in a filter transform, conditional encoding rule, or
    /// scale domain.
    ///
    /// __See also:__ [`resolve`](https://vega.github.io/vega-lite/docs/selection-resolve.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<SelectionResolution>,
    /// Controls whether data values should be toggled or only ever inserted into multi
    /// selections. Can be `true`, `false` (for insertion only), or a [Vega
    /// expression](https://vega.github.io/vega/docs/expressions/).
    ///
    /// __Default value:__ `true`, which corresponds to `event.shiftKey` (i.e., data values are
    /// toggled when a user interacts with the shift-key pressed).
    ///
    /// Setting the value to the Vega expression `"true"` will toggle data values without the
    /// user pressing the shift-key.
    ///
    /// __See also:__ [`toggle`](https://vega.github.io/vega-lite/docs/toggle.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub toggle: Option<Translate>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct LegendStreamBinding {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub legend: Option<LegendUnion>,
}

/// The default definition for a
/// [`single`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All
/// properties and transformations   for a single selection definition (except `type`) may be
/// specified here.
///
/// For instance, setting `single` to `{"on": "dblclick"}` populates single selections on
/// double-click by default.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct SingleSelectionConfig {
    /// When set, a selection is populated by input elements (also known as dynamic query
    /// widgets) or by interacting with the corresponding legend. Direct manipulation interaction
    /// is disabled by default; to re-enable it, set the selection's
    /// [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties)
    /// property.
    ///
    /// Legend bindings are restricted to selections that only specify a single field or
    /// encoding.
    ///
    /// Query widget binding takes the form of Vega's [input element binding
    /// definition](https://vega.github.io/vega/docs/signals/#bind) or can be a mapping between
    /// projected field/encodings and binding definitions.
    ///
    /// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bind: Option<SingleBind>,
    /// Clears the selection, emptying it of all values. Can be a [Event
    /// Stream](https://vega.github.io/vega/docs/event-streams/) or `false` to disable.
    ///
    /// __Default value:__ `dblclick`.
    ///
    /// __See also:__ [`clear`](https://vega.github.io/vega-lite/docs/clear.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clear: Option<ClearUnion>,
    /// By default, `all` data values are considered to lie within an empty selection. When set
    /// to `none`, empty selections contain no data values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub empty: Option<Empty>,
    /// An array of encoding channels. The corresponding data field values must match for a data
    /// tuple to fall within the selection.
    ///
    /// __See also:__ [`encodings`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encodings: Option<Vec<SingleDefUnitChannel>>,
    /// An array of field names whose values must match for a data tuple to fall within the
    /// selection.
    ///
    /// __See also:__ [`fields`](https://vega.github.io/vega-lite/docs/project.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fields: Option<Vec<String>>,
    /// Initialize the selection with a mapping between [projected channels or field
    /// names](https://vega.github.io/vega-lite/docs/project.html) and initial values.
    ///
    /// __See also:__ [`init`](https://vega.github.io/vega-lite/docs/init.html) documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub init: Option<HashMap<String, Option<SelectionInit>>>,
    /// When true, an invisible voronoi diagram is computed to accelerate discrete selection. The
    /// data value _nearest_ the mouse cursor is added to the selection.
    ///
    /// __See also:__ [`nearest`](https://vega.github.io/vega-lite/docs/nearest.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub nearest: Option<bool>,
    /// A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or
    /// selector) that triggers the selection. For interval selections, the event stream must
    /// specify a [start and
    /// end](https://vega.github.io/vega/docs/event-streams/#between-filters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub on: Option<OnUnion>,
    /// With layered and multi-view displays, a strategy that determines how selections' data
    /// queries are resolved when applied in a filter transform, conditional encoding rule, or
    /// scale domain.
    ///
    /// __See also:__ [`resolve`](https://vega.github.io/vega-lite/docs/selection-resolve.html)
    /// documentation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<SelectionResolution>,
}

/// Binds the parameter to an external input element such as a slider, selection list or
/// radio button group.
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyBinding {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub debounce: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub element: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub input: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub binding_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub options: Option<Vec<Option<serde_json::Value>>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub autocomplete: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub placeholder: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub between: Option<Vec<Stream>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub consume: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filter: Option<LegendText>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub markname: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub marktype: Option<MarkType>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub source: Option<Source>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub throttle: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stream: Option<Stream>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub merge: Option<Vec<Stream>>,
}

/// Arc-specific Config
///
/// Image-specific Config
///
/// Rect-Specific Config
///
/// Area-Specific Config
///
/// Bar-Specific Config
///
/// Circle-Specific Config
///
/// Geoshape-Specific Config
///
/// Mark Config
///
/// Point-Specific Config
///
/// Rule-Specific Config
///
/// Square-Specific Config
///
/// Default style for chart subtitles
///
/// Default style for chart titles
///
/// Default style for axis, legend, and header labels.
///
/// Default style for axis, legend, and header titles.
///
/// Text-Specific Config
///
/// Line-Specific Config
///
/// Trail-Specific Config
///
/// Tick-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StyleValue {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    /// The rotation angle of the text, in degrees.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    /// A boolean flag indicating if [ARIA
    /// attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) should be
    /// included (SVG output only). If `false`, the "aria-hidden" attribute will be set on the
    /// output SVG element, removing the mark item from the ARIA accessibility tree.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    /// Sets the type of user interface element of the mark item for [ARIA
    /// accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG
    /// output only). If specified, this property determines the "role" attribute. Warning: this
    /// property is experimental and may be changed in the future.
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    /// A human-readable, author-localized description for the role of the mark item for [ARIA
    /// accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG
    /// output only). If specified, this property determines the "aria-roledescription"
    /// attribute. Warning: this property is experimental and may be changed in the future.
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    /// Whether to keep aspect ratio of image marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    /// Offset between bars for binned field. The ideal value for this is either 0 (preferred by
    /// statisticians) or 1 (Vega-Lite default, D3 example style).
    ///
    /// __Default value:__ `1`
    #[serde(rename = "binSpacing")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bin_spacing: Option<f64>,
    /// The color blend mode for drawing an item on its current background. Any valid [CSS
    /// mix-blend-mode](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) value
    /// can be used.
    ///
    /// __Default value: `"source-over"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<StyleColor>,
    /// The default size of the bars on continuous scales.
    ///
    /// __Default value:__ `5`
    #[serde(rename = "continuousBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_band_size: Option<f64>,
    /// The radius in pixels of rounded rectangles or arcs' corners.
    ///
    /// __Default value:__ `0`
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    /// The radius in pixels of rounded rectangles' bottom left corner.
    ///
    /// __Default value:__ `0`
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    /// The radius in pixels of rounded rectangles' bottom right corner.
    ///
    /// __Default value:__ `0`
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    /// The radius in pixels of rounded rectangles' top right corner.
    ///
    /// __Default value:__ `0`
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    /// The radius in pixels of rounded rectangles' top left corner.
    ///
    /// __Default value:__ `0`
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    /// The mouse cursor used over the mark. Any valid [CSS cursor
    /// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    /// A text description of the mark item for [ARIA
    /// accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) (SVG
    /// output only). If specified, this property determines the ["aria-label"
    /// attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    /// The direction of the text. One of `"ltr"` (left-to-right) or `"rtl"` (right-to-left).
    /// This property determines on which side is truncated in response to the limit parameter.
    ///
    /// __Default value:__ `"ltr"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    /// The default size of the bars with discrete dimensions. If unspecified, the default size
    /// is  `step-2`, which provides 2 pixel offset between bars.
    #[serde(rename = "discreteBandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub discrete_band_size: Option<f64>,
    /// The horizontal offset, in pixels, between the text label and its anchor point. The offset
    /// is applied after rotation by the _angle_ property.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    /// The vertical offset, in pixels, between the text label and its anchor point. The offset
    /// is applied after rotation by the _angle_ property.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    /// The ellipsis string for text truncated in response to the limit parameter.
    ///
    /// __Default value:__ `"…"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    /// The end angle in radians for arc marks. A value of `0` indicates up (north), increasing
    /// values proceed clockwise.
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<StyleFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    /// The fill opacity (value between [0,1]).
    ///
    /// __Default value:__ `1`
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    /// The typeface to set the text in (e.g., `"Helvetica Neue"`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    /// The font size, in pixels.
    ///
    /// __Default value:__ `11`
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    /// The font style (e.g., `"italic"`).
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    /// The font weight. This can be either a string (e.g `"bold"`, `"normal"`) or a number
    /// (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` = `700`).
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    /// Height of the marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    /// A URL to load upon mouse click. If defined, the mark acts as a hyperlink.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    /// The line interpolation method to use for line and area marks. One of the following: -
    /// `"linear"`: piecewise linear segments, as in a polyline. - `"linear-closed"`: close the
    /// linear segments to form a polygon. - `"step"`: alternate between horizontal and vertical
    /// segments, as in a step function. - `"step-before"`: alternate between vertical and
    /// horizontal segments, as in a step function. - `"step-after"`: alternate between
    /// horizontal and vertical segments, as in a step function. - `"basis"`: a B-spline, with
    /// control point duplication on the ends. - `"basis-open"`: an open B-spline; may not
    /// intersect the start or end. - `"basis-closed"`: a closed B-spline, as in a loop. -
    /// `"cardinal"`: a Cardinal spline, with control point duplication on the ends. -
    /// `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will
    /// intersect other control points. - `"cardinal-closed"`: a closed Cardinal spline, as in a
    /// loop. - `"bundle"`: equivalent to basis, except the tension parameter is used to
    /// straighten the spline. - `"monotone"`: cubic interpolation that preserves monotonicity in
    /// y.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    /// The maximum length of the text mark in pixels. The text value will be automatically
    /// truncated if the rendered size exceeds the limit.
    ///
    /// __Default value:__ `0` -- indicating no limit
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    /// A delimiter, such as a newline character, upon which to break text strings into multiple
    /// lines. This property is ignored if the text is array-valued.
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    /// The line height in pixels (the spacing between subsequent lines of text) for multi-line
    /// text marks.
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<Opacity>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    ///
    /// 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
    /// towards the right edge of the chart).
    ///
    /// __Default value:__ `"bottom"` for x-axes and `"left"` for y-axes.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<StyleOrient>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    /// The angular padding applied to sides of the arc, in radians.
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    /// Shape of the point marks. Supported values include: - plotting shapes: `"circle"`,
    /// `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, `"triangle-down"`,
    /// `"triangle-right"`, or `"triangle-left"`. - the line symbol `"stroke"` - centered
    /// directional shapes `"arrow"`, `"wedge"`, or `"triangle"` - a custom [SVG path
    /// string](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths) (For correct
    /// sizing, custom shape paths should be defined within a square bounding box with
    /// coordinates ranging from -1 to 1 along both the x and y dimensions.)
    ///
    /// __Default value:__ `"circle"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<FontSize>,
    /// A boolean flag (default true) indicating if the image should be smoothed when resized. If
    /// false, individual pixels should be scaled directly rather than interpolated with
    /// smoothing. For SVG rendering, this option may not work in some browsers due to lack of
    /// standardization.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    /// The start angle in radians for arc marks. A value of `0` indicates up (north), increasing
    /// values proceed clockwise.
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<StyleFill>,
    /// The stroke cap for line ending style. One of `"butt"`, `"round"`, or `"square"`.
    ///
    /// __Default value:__ `"butt"`
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    /// An array of alternating stroke, space lengths for creating dashed or dotted lines.
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    /// The offset (in pixels) into which to begin drawing with the stroke dash array.
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    /// The stroke line join method. One of `"miter"`, `"round"` or `"bevel"`.
    ///
    /// __Default value:__ `"miter"`
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    /// The miter limit at which to bevel a line join.
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    /// The offset in pixels at which to draw the group stroke and fill. If unspecified, the
    /// default behavior is to dynamically offset stroked groups such that 1 pixel stroke widths
    /// align with the pixel grid.
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    /// The stroke opacity (value between [0,1]).
    ///
    /// __Default value:__ `1`
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    /// The stroke width, in pixels.
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    /// Depending on the interpolation type, sets the tension parameter (for line and area marks).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    /// Text-Specific Config
    ///
    /// Placeholder text if the `text` channel is not specified
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<Angle>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<StyleTooltip>,
    /// The URL of the image file for image marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    /// Width of the marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
    /// A flag for overlaying line on top of area marks, or an object defining the properties of
    /// the overlayed lines.
    ///
    /// - If this value is an empty object (`{}`) or `true`, lines with default properties will
    /// be used.
    ///
    /// - If this value is `false`, no lines would be automatically added to area marks.
    ///
    /// __Default value:__ `false`.
    ///
    /// Line-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line: Option<Line>,
    /// A flag for overlaying points on top of line or area marks, or an object defining the
    /// properties of the overlayed points.
    ///
    /// - If this property is `"transparent"`, transparent points will be used (for enhancing
    /// tooltips and selections).
    ///
    /// - If this property is an empty object (`{}`) or `true`, filled points with default
    /// properties will be used.
    ///
    /// - If this property is `false`, no points would be automatically added to line or area
    /// marks.
    ///
    /// __Default value:__ `false`.
    ///
    /// Point-Specific Config
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub point: Option<PointUnion>,
    /// - For vertical bars, top-left and top-right corner radius. - For horizontal bars,
    /// top-right and bottom-right corner radius.
    #[serde(rename = "cornerRadiusEnd")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_end: Option<CornerRadiusUnion>,
    /// The width of the ticks.
    ///
    /// __Default value:__  3/4 of step (width step for horizontal ticks and height step for
    /// vertical ticks).
    #[serde(rename = "bandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_size: Option<f64>,
    /// Thickness of the tick mark.
    ///
    /// __Default value:__  `1`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub thickness: Option<f64>,
    #[serde(rename = "bandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_position: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain: Option<Aria>,
    #[serde(rename = "domainCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_cap: Option<Cap>,
    #[serde(rename = "domainColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_color: Option<Color>,
    #[serde(rename = "domainDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_dash: Option<StrokeDashUnion>,
    #[serde(rename = "domainDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "domainOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "domainWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub domain_width: Option<CornerRadiusUnion>,
    /// When used with the default `"number"` and `"time"` format type, the text formatting
    /// pattern for labels of guides (axes, legends, headers) and text marks.
    ///
    /// - 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). - If the format type is
    /// `"time"` (e.g., for temporal fields), this is D3's [time format
    /// pattern](https://github.com/d3/d3-time-format#locale_format).
    ///
    /// See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for
    /// more examples.
    ///
    /// When used with a [custom
    /// `formatType`](https://vega.github.io/vega-lite/docs/config.html#custom-format-type), this
    /// value will be passed as `format` alongside `datum.value` to the registered function.
    ///
    /// __Default value:__  Derived from
    /// [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for
    /// number format and from
    /// [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for time
    /// format.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format: Option<Format>,
    /// The format type for labels. One of `"number"`, `"time"`, or a [registered custom format
    /// type](https://vega.github.io/vega-lite/docs/config.html#custom-format-type).
    ///
    /// __Default value:__ - `"time"` for temporal fields and ordinal and nominal fields with
    /// `timeUnit`. - `"number"` for quantitative fields as well as ordinal and nominal fields
    /// without `timeUnit`.
    #[serde(rename = "formatType")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub format_type: Option<String>,
    /// A boolean flag indicating if grid lines should be included as part of the axis
    ///
    /// __Default value:__ `true` for [continuous
    /// scales](https://vega.github.io/vega-lite/docs/scale.html#continuous) that are not binned;
    /// otherwise, `false`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid: Option<bool>,
    #[serde(rename = "gridCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_cap: Option<Cap>,
    #[serde(rename = "gridColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_color: Option<GridColorUnion>,
    #[serde(rename = "gridDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_dash: Option<AxisGridDash>,
    #[serde(rename = "gridDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_dash_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "gridOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_opacity: Option<GridOpacityUnion>,
    #[serde(rename = "gridWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub grid_width: Option<GridWidthUnion>,
    #[serde(rename = "labelAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_align: Option<ConditionalAxisPropertyAlignNull>,
    #[serde(rename = "labelAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_angle: Option<LabelAngle>,
    #[serde(rename = "labelBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_baseline: Option<PurpleTextBaseline>,
    #[serde(rename = "labelBound")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_bound: Option<Label>,
    #[serde(rename = "labelColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_color: Option<GridColorUnion>,
    /// [Vega expression](https://vega.github.io/vega/docs/expressions/) for customizing labels.
    ///
    /// __Note:__ The label text and value can be assessed via the `label` and `value` properties
    /// of the axis's backing `datum` object.
    #[serde(rename = "labelExpr")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_expr: Option<String>,
    /// Indicates if the first and last axis labels should be aligned flush with the scale range.
    /// Flush alignment for a horizontal axis will left-align the first label and right-align the
    /// last label. For vertical axes, bottom and top text baselines are applied instead. If this
    /// property is a number, it also indicates the number of pixels by which to offset the first
    /// and last labels; for example, a value of 2 will flush-align the first and last labels and
    /// also push them 2 pixels outward from the center of the axis. The additional adjustment
    /// can sometimes help the labels better visually group with corresponding axis ticks.
    ///
    /// __Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`.
    #[serde(rename = "labelFlush")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_flush: Option<LabelFlush>,
    #[serde(rename = "labelFlushOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_flush_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "labelFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font: Option<ConditionalAxisPropertyStringNull>,
    #[serde(rename = "labelFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_size: Option<GridWidthUnion>,
    #[serde(rename = "labelFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_style: Option<ConditionalAxisPropertyFontStyleNull>,
    #[serde(rename = "labelFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_font_weight: Option<FontWeight>,
    #[serde(rename = "labelLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "labelLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "labelOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "labelOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_opacity: Option<GridDashOffsetUnion>,
    /// The strategy to use for resolving overlap of axis labels. If `false` (the default), no
    /// overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing
    /// every other label is used (this works well for standard linear axes). If set to
    /// `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps
    /// with the last visible label (this often works better for log-scaled axes).
    ///
    /// __Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log
    /// scales; otherwise `false`.
    #[serde(rename = "labelOverlap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_overlap: Option<LabelOverlapUnion>,
    #[serde(rename = "labelPadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_padding: Option<GridDashOffsetUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub labels: Option<Aria>,
    #[serde(rename = "labelSeparation")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub label_separation: Option<CornerRadiusUnion>,
    #[serde(rename = "maxExtent")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub max_extent: Option<CornerRadiusUnion>,
    #[serde(rename = "minExtent")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub min_extent: Option<CornerRadiusUnion>,
    /// The offset, in pixels, by which to displace the axis from the edge of the enclosing group
    /// or data rectangle.
    ///
    /// __Default value:__ derived from the [axis
    /// config](https://vega.github.io/vega-lite/docs/config.html#facet-scale-config)'s `offset`
    /// (`0` by default)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<f64>,
    /// The anchor position of the axis in pixels. For x-axes with top or bottom orientation,
    /// this sets the axis group x coordinate. For y-axes with left or right orientation, this
    /// sets the axis group y coordinate.
    ///
    /// __Default value__: `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub position: Option<CornerRadiusUnion>,
    /// A string or array of strings indicating the name of custom styles to apply to the axis. A
    /// style is a named collection of axis property defined within the [style
    /// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
    /// an array, later styles will override earlier styles.
    ///
    /// __Default value:__ (none) __Note:__ Any specified style will augment the default style.
    /// For example, an x-axis mark with `"style": "foo"` will use `config.axisX` and
    /// `config.style.foo` (the specified style `"foo"` has higher precedence).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub style: Option<LegendText>,
    #[serde(rename = "tickBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_band: Option<TickBandUnion>,
    #[serde(rename = "tickCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_cap: Option<Cap>,
    #[serde(rename = "tickColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_color: Option<GridColorUnion>,
    /// 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.
    ///
    /// For scales of type `"time"` or `"utc"`, the tick count can instead be a time interval
    /// specifier. Legal string values are `"millisecond"`, `"second"`, `"minute"`, `"hour"`,
    /// `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, an object-valued interval
    /// specifier of the form `{"interval": "month", "step": 3}` includes a desired number of
    /// interval steps. Here, ticks are generated for each quarter (Jan, Apr, Jul, Oct)
    /// boundary.
    ///
    /// __Default value__: Determine using a formula `ceil(width/40)` for x and `ceil(height/40)`
    /// for y.
    #[serde(rename = "tickCount")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_count: Option<TickCount>,
    #[serde(rename = "tickDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_dash: Option<AxisTickDash>,
    #[serde(rename = "tickDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_dash_offset: Option<GridDashOffsetUnion>,
    #[serde(rename = "tickExtra")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_extra: Option<Aria>,
    /// 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.
    #[serde(rename = "tickMinStep")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_min_step: Option<CornerRadiusUnion>,
    #[serde(rename = "tickOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "tickOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_opacity: Option<GridDashOffsetUnion>,
    #[serde(rename = "tickRound")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_round: Option<Aria>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ticks: Option<Aria>,
    #[serde(rename = "tickSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_size: Option<GridWidthUnion>,
    #[serde(rename = "tickWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tick_width: Option<GridWidthUnion>,
    /// A title for the field. If `null`, the title will be removed.
    ///
    /// __Default value:__  derived from the field's name and transformation function
    /// (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function
    /// is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or
    /// has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit
    /// (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field
    /// name.
    ///
    /// __Notes__:
    ///
    /// 1) You can customize the default field title format by providing the
    /// [`fieldTitle`](https://vega.github.io/vega-lite/docs/config.html#top-level-config)
    /// property in the [config](https://vega.github.io/vega-lite/docs/config.html) or
    /// [`fieldTitle` function via the `compile` function's
    /// options](https://vega.github.io/vega-lite/docs/compile.html#field-title).
    ///
    /// 2) If both field definition's `title` and axis, header, or legend `title` are defined,
    /// axis/header/legend title will be used.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub title: RemovableValue<LegendText>,
    #[serde(rename = "titleAlign")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_align: Option<TitleAlignUnion>,
    #[serde(rename = "titleAnchor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_anchor: Option<TitleAnchorUnion>,
    #[serde(rename = "titleAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_angle: Option<CornerRadiusUnion>,
    #[serde(rename = "titleBaseline")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_baseline: Option<TextBaseline>,
    #[serde(rename = "titleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_color: Option<Color>,
    #[serde(rename = "titleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font: Option<Color>,
    #[serde(rename = "titleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_size: Option<FontSize>,
    #[serde(rename = "titleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_style: Option<Color>,
    #[serde(rename = "titleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "titleLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_limit: Option<FontSize>,
    #[serde(rename = "titleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "titleOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_opacity: Option<CornerRadiusUnion>,
    #[serde(rename = "titlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_padding: Option<CornerRadiusUnion>,
    #[serde(rename = "titleX")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_x: Option<CornerRadiusUnion>,
    #[serde(rename = "titleY")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title_y: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub translate: Option<CornerRadiusUnion>,
    /// Explicitly set the visible axis tick values.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub values: Option<Values>,
    /// A non-negative integer indicating the z-index of the axis. If zindex is 0, axes should be
    /// drawn behind all chart elements. To put them in front, set `zindex` to `1` or more.
    ///
    /// __Default value:__ `0` (behind the marks).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TentacledLinearGradient {
    /// The type of gradient. Use `"linear"` for a linear gradient.
    ///
    /// The type of gradient. Use `"radial"` for a radial gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient: Option<Gradient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub id: Option<String>,
    /// An array of gradient stops defining the gradient color sequence.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stops: Option<Vec<GradientStop>>,
    /// The starting x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x1: Option<f64>,
    /// The ending x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `1`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<f64>,
    /// The starting y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y1: Option<f64>,
    /// The ending y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the inner circle for the
    /// gradient.
    ///
    /// __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r1: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the outer circle for the
    /// gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r2: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct StickyLinearGradient {
    /// The type of gradient. Use `"linear"` for a linear gradient.
    ///
    /// The type of gradient. Use `"radial"` for a radial gradient.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub gradient: Option<Gradient>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub id: Option<String>,
    /// An array of gradient stops defining the gradient color sequence.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stops: Option<Vec<GradientStop>>,
    /// The starting x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x1: Option<f64>,
    /// The ending x-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `1`
    ///
    /// The x-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<f64>,
    /// The starting y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the inner circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y1: Option<f64>,
    /// The ending y-coordinate, in normalized [0, 1] coordinates, of the linear gradient.
    ///
    /// __Default value:__ `0`
    ///
    /// The y-coordinate, in normalized [0, 1] coordinates, for the center of the outer circle
    /// for the gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the inner circle for the
    /// gradient.
    ///
    /// __Default value:__ `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r1: Option<f64>,
    /// The radius length, in normalized [0, 1] coordinates, of the outer circle for the
    /// gradient.
    ///
    /// __Default value:__ `0.5`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub r2: Option<f64>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct FluffyTooltipContent {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub content: Option<Content>,
    /// Vega expression (which can refer to Vega-Lite parameters).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub expr: Option<String>,
}

/// Tick-Specific Config
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct TickConfig {
    /// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
    /// of `"left"`, `"right"`, `"center"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<TitleAlignUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<Angle>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    #[serde(rename = "ariaRole")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role: Option<Color>,
    #[serde(rename = "ariaRoleDescription")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria_role_description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aspect: Option<Aria>,
    /// The width of the ticks.
    ///
    /// __Default value:__  3/4 of step (width step for horizontal ticks and height step for
    /// vertical ticks).
    #[serde(rename = "bandSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub band_size: Option<f64>,
    /// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
    /// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
    /// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
    /// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
    /// rather than `fontSize` alone.
    ///
    /// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
    /// `"bottom"`.
    ///
    /// __Note:__ Expression reference is *not* supported for range marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<TextBaseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub blend: Option<BlendUnion>,
    /// Default color.
    ///
    /// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
    ///
    /// __Note:__ - This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
    /// `stroke` properties have higher precedence than `color` and will override `color`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<MarkConfigExprOrSignalRefColor>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusBottomRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_bottom_right: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopLeft")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_left: Option<CornerRadiusUnion>,
    #[serde(rename = "cornerRadiusTopRight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius_top_right: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<CursorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dir: Option<Dir>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub ellipsis: Option<Color>,
    #[serde(rename = "endAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub end_angle: Option<CornerRadiusUnion>,
    /// Default fill color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove fill.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<MarkConfigExprOrSignalRefFill>,
    /// Whether the mark's color should be used as fill color instead of stroke color.
    ///
    /// __Default value:__ `false` for all `point`, `line`, and `rule` marks as well as
    /// `geoshape` marks for
    /// [`graticule`](https://vega.github.io/vega-lite/docs/data.html#graticule) data sources;
    /// otherwise, `true`.
    ///
    /// __Note:__ This property cannot be used in a [style
    /// config](https://vega.github.io/vega-lite/docs/mark.html#style-config).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub filled: Option<bool>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub href: Option<Color>,
    /// The inner radius in pixels of arc marks. `innerRadius` is an alias for `radius2`.
    #[serde(rename = "innerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub inner_radius: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub interpolate: Option<MarkConfigExprOrSignalRefInterpolate>,
    /// Defines how Vega-Lite should handle marks for invalid values (`null` and `NaN`). - If set
    /// to `"filter"` (default), all data items with null values will be skipped (for line,
    /// trail, and area marks) or filtered (for other marks). - If `null`, all data items are
    /// included. In this case, invalid values will be interpreted as zeroes.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub invalid: RemovableValue<Invalid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<CornerRadiusUnion>,
    #[serde(rename = "lineBreak")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_break: Option<Color>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// For line and trail marks, this `order` property can be set to `null` or `false` to make
    /// the lines use the original order in the data sources.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub order: Option<bool>,
    /// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
    /// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
    /// size of the bar and tick should be applied to x or y dimension. - For area, this property
    /// determines the orient property of the Vega output. - For line and trail marks, this
    /// property determines the sort order of the points in the line if `config.sortLineBy` is
    /// not specified. For stacked charts, this is always determined by the orientation of the
    /// stack; therefore explicitly specified value will be ignored.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<Orientation>,
    /// The outer radius in pixels of arc marks. `outerRadius` is an alias for `radius`.
    #[serde(rename = "outerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub outer_radius: Option<CornerRadiusUnion>,
    #[serde(rename = "padAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub pad_angle: Option<CornerRadiusUnion>,
    /// For arc mark, the primary (outer) radius in pixels.
    ///
    /// For text marks, polar coordinate radial offset, in pixels, of the text from the origin
    /// determined by the `x` and `y` properties.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius: Option<CornerRadiusUnion>,
    /// The secondary (inner) radius in pixels of arc marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub radius2: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub shape: Option<Color>,
    /// Default size for marks. - For `point`/`circle`/`square`, this represents the pixel area
    /// of the marks. Note that this value sets the area of the symbol; the side lengths will
    /// increase with the square root of this value. - For `bar`, this represents the band size
    /// of the bar, in pixels. - For `text`, this represents the font size, in pixels.
    ///
    /// __Default value:__ - `30` for point, circle, square marks; width/height's `step` - `2`
    /// for bar marks with discrete dimensions; - `5` for bar marks with continuous dimensions; -
    /// `11` for text marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub size: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub smooth: Option<Aria>,
    #[serde(rename = "startAngle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub start_angle: Option<CornerRadiusUnion>,
    /// Default stroke color. This property has higher precedence than `config.color`. Set to
    /// `null` to remove stroke.
    ///
    /// __Default value:__ (None)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke: Option<MarkConfigExprOrSignalRefFill>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tension: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub text: Option<ConditionalPredicateValueDefTextExprRefText>,
    /// - For arc marks, the arc length in radians if theta2 is not specified, otherwise the
    /// start arc angle. (A value of 0 indicates up or “north”, increasing values proceed
    /// clockwise.)
    ///
    /// - For text marks, polar coordinate angle in radians.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta: Option<CornerRadiusUnion>,
    /// The end angle of arc marks in radians. A value of 0 indicates up or “north”, increasing
    /// values proceed clockwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub theta2: Option<CornerRadiusUnion>,
    /// Thickness of the tick mark.
    ///
    /// __Default value:__  `1`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub thickness: Option<f64>,
    /// Default relative band size for a time unit. If set to `1`, the bandwidth of the marks
    /// will be equal to the time unit band step. If set to `0.5`, bandwidth of the marks will be
    /// half of the time unit band step.
    #[serde(rename = "timeUnitBand")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band: Option<f64>,
    /// Default relative band position for a time unit. If set to `0`, the marks will be
    /// positioned at the beginning of the time unit band step. If set to `0.5`, the marks will
    /// be positioned in the middle of the time unit band step.
    #[serde(rename = "timeUnitBandPosition")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub time_unit_band_position: Option<f64>,
    /// The tooltip text string to show upon mouse hover or an object defining which fields
    /// should the tooltip be derived from.
    ///
    /// - If `tooltip` is `true` or `{"content": "encoding"}`, then all fields from `encoding`
    /// will be used. - If `tooltip` is `{"content": "data"}`, then all fields that appear in the
    /// highlighted data point will be used. - If set to `null` or `false`, then no tooltip will
    /// be used.
    ///
    /// See the [`tooltip`](https://vega.github.io/vega-lite/docs/tooltip.html) documentation for
    /// a detailed discussion about tooltip  in Vega-Lite.
    ///
    /// __Default value:__ `null`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub tooltip: Option<MarkConfigExprOrSignalRefTooltip>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub url: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<CornerRadiusUnion>,
    /// X coordinates of the marks, or width of horizontal `"bar"` and `"area"` without specified
    /// `x2` or `width`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x: Option<XUnion>,
    /// X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"width"` for the width of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub x2: Option<XUnion>,
    /// Y coordinates of the marks, or height of vertical `"bar"` and `"area"` without specified
    /// `y2` or `height`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y: Option<YUnion>,
    /// Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and  `"rule"`.
    ///
    /// The `value` of this channel can be a number or a string `"height"` for the height of the
    /// plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub y2: Option<YUnion>,
}

/// Title configuration, which determines default properties for all
/// [titles](https://vega.github.io/vega-lite/docs/title.html). For a full list of title
/// configuration options, please see the [corresponding section of the title
/// documentation](https://vega.github.io/vega-lite/docs/title.html#config).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct BaseTitleNoValueRefs {
    /// Horizontal text alignment for title text. One of `"left"`, `"center"`, or `"right"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<Align>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub anchor: Option<TitleAnchorUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub angle: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub aria: Option<Aria>,
    /// Vertical text baseline for title and subtitle text. One of `"alphabetic"` (default),
    /// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
    /// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
    /// relative to the *lineHeight* rather than *fontSize* alone.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub baseline: Option<Baseline>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub color: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dx: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub dy: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font: Option<Color>,
    #[serde(rename = "fontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_size: Option<FontSize>,
    #[serde(rename = "fontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_style: Option<Color>,
    #[serde(rename = "fontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub font_weight: Option<FontWeightUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub frame: Option<Color>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub limit: Option<FontSize>,
    #[serde(rename = "lineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub line_height: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub offset: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub orient: Option<TitleParamsOrient>,
    #[serde(rename = "subtitleColor")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_color: Option<Color>,
    #[serde(rename = "subtitleFont")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font: Option<Color>,
    #[serde(rename = "subtitleFontSize")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font_size: Option<FontSize>,
    #[serde(rename = "subtitleFontStyle")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font_style: Option<Color>,
    #[serde(rename = "subtitleFontWeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_font_weight: Option<FontWeightUnion>,
    #[serde(rename = "subtitleLineHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_line_height: Option<CornerRadiusUnion>,
    #[serde(rename = "subtitlePadding")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub subtitle_padding: Option<CornerRadiusUnion>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub zindex: Option<FontSize>,
}

/// Default properties for [single view
/// plots](https://vega.github.io/vega-lite/docs/spec.html#single).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct ViewConfig {
    /// Whether the view should be clipped.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub clip: Option<bool>,
    /// The default height when the plot has a continuous y-field for x or latitude, or has arc
    /// marks.
    ///
    /// __Default value:__ `200`
    #[serde(rename = "continuousHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_height: Option<f64>,
    /// The default width when the plot has a continuous field for x or longitude, or has arc
    /// marks.
    ///
    /// __Default value:__ `200`
    #[serde(rename = "continuousWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub continuous_width: Option<f64>,
    #[serde(rename = "cornerRadius")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub corner_radius: Option<CornerRadiusUnion>,
    /// The mouse cursor used over the view. Any valid [CSS cursor
    /// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub cursor: Option<Cursor>,
    /// The default height when the plot has non arc marks and either a discrete y-field or no
    /// y-field. The height can be either a number indicating a fixed height or an object in the
    /// form of `{step: number}` defining the height per discrete step.
    ///
    /// __Default value:__ a step size based on `config.view.step`.
    #[serde(rename = "discreteHeight")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub discrete_height: Option<DiscreteHeightUnion>,
    /// The default width when the plot has non-arc marks and either a discrete x-field or no
    /// x-field. The width can be either a number indicating a fixed width or an object in the
    /// form of `{step: number}` defining the width per discrete step.
    ///
    /// __Default value:__ a step size based on `config.view.step`.
    #[serde(rename = "discreteWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub discrete_width: Option<DiscreteWidthUnion>,
    /// The fill color.
    ///
    /// __Default value:__ `undefined`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill: Option<Color>,
    #[serde(rename = "fillOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub fill_opacity: Option<Opacity>,
    /// Default height
    ///
    /// __Deprecated:__ Since Vega-Lite 4.0. Please use continuousHeight and discreteHeight
    /// instead.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<f64>,
    /// The overall opacity (value between [0,1]).
    ///
    /// __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or
    /// `square` marks or layered `bar` charts and `1` otherwise.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub opacity: Option<CornerRadiusUnion>,
    /// Default step size for x-/y- discrete fields.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
    /// The stroke color.
    ///
    /// __Default value:__ `"#ddd"`
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub stroke: RemovableValue<Color>,
    #[serde(rename = "strokeCap")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_cap: Option<Cap>,
    #[serde(rename = "strokeDash")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash: Option<StrokeDashUnion>,
    #[serde(rename = "strokeDashOffset")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_dash_offset: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeJoin")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_join: Option<StrokeJoinUnion>,
    #[serde(rename = "strokeMiterLimit")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_miter_limit: Option<CornerRadiusUnion>,
    #[serde(rename = "strokeOpacity")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_opacity: Option<Opacity>,
    #[serde(rename = "strokeWidth")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub stroke_width: Option<FontSize>,
    /// Default width
    ///
    /// __Deprecated:__ Since Vega-Lite 4.0. Please use continuousWidth and discreteWidth instead.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DiscreteHeightClass {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct DiscreteWidthClass {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub step: Option<f64>,
}

/// A specification of the view that gets faceted.
///
/// A full layered plot specification, which may contains `encoding` and `projection`
/// properties that will be applied to underlying unit (single-view) specifications.
///
/// A specification of the view that gets repeated.
///
/// Any specification in Vega-Lite.
///
/// Unit spec that can have a composite mark and row or column channels (shorthand for a
/// facet spec).
///
/// Base interface for a repeat specification.
///
/// Base interface for a facet specification.
///
/// Base interface for a generalized concatenation specification.
///
/// Base interface for a vertical concatenation specification.
///
/// Base interface for a horizontal concatenation specification.
///
/// A unit specification, which can contain either [primitive marks or composite
/// marks](https://vega.github.io/vega-lite/docs/mark.html#types).
#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder)]
#[builder(setter(into, strip_option))]
pub struct VegaliteSpec {
    /// An object describing the data source. Set to `null` to ignore the parent's data source.
    /// If no data is set, it is derived from the parent.
    #[serde(default, skip_serializing_if = "RemovableValue::is_default")]
    #[builder(default)]
    pub data: RemovableValue<UrlData>,
    /// Description of this mark for commenting purpose.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub description: Option<String>,
    /// A shared key-value mapping between encoding channels and definition of fields in the
    /// underlying layers.
    ///
    /// A key-value mapping between encoding channels and definition of fields.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub encoding: Option<SpecEncoding>,
    /// The height of a visualization.
    ///
    /// - For a plot with a continuous y-field, height should be a number. - For a plot with
    /// either a discrete y-field or no y-field, height can be either a number indicating a fixed
    /// height or an object in the form of `{step: number}` defining the height per discrete
    /// step. (No y-field is equivalent to having one discrete step.) - To enable responsive
    /// sizing on height, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousHeight` for a plot with a continuous
    /// y-field and `config.view.discreteHeight` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// height of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`height`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub height: Option<HeightUnion>,
    /// Layer or single view specifications to be layered.
    ///
    /// __Note__: Specifications inside `layer` cannot use `row` and `column` channels as
    /// layering facet specifications is not allowed. Instead, use the [facet
    /// operator](https://vega.github.io/vega-lite/docs/facet.html) and place a layer inside a
    /// facet.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub layer: Option<Vec<LayerElement>>,
    /// Name of the visualization for later reference.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub name: Option<String>,
    /// An object defining properties of the geographic projection shared by underlying layers.
    ///
    /// An object defining properties of geographic projection, which will be applied to `shape`
    /// path for `"geoshape"` marks and to `latitude` and `"longitude"` channels for other marks.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub projection: Option<Projection>,
    /// Scale, axis, and legend resolutions for view composition specifications.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub resolve: Option<Resolve>,
    /// Title for the plot.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub title: Option<TitleUnion>,
    /// An array of data transformations such as filter and new field calculation.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub transform: Option<Vec<Transform>>,
    /// An object defining the view background's fill and stroke.
    ///
    /// __Default value:__ none (transparent)
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub view: Option<ViewBackground>,
    /// The width of a visualization.
    ///
    /// - For a plot with a continuous x-field, width should be a number. - For a plot with
    /// either a discrete x-field or no x-field, width can be either a number indicating a fixed
    /// width or an object in the form of `{step: number}` defining the width per discrete step.
    /// (No x-field is equivalent to having one discrete step.) - To enable responsive sizing on
    /// width, it should be set to `"container"`.
    ///
    /// __Default value:__ Based on `config.view.continuousWidth` for a plot with a continuous
    /// x-field and `config.view.discreteWidth` otherwise.
    ///
    /// __Note:__ For plots with [`row` and `column`
    /// channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the
    /// width of a single view and the `"container"` option cannot be used.
    ///
    /// __See also:__ [`width`](https://vega.github.io/vega-lite/docs/size.html) documentation.
    ///
    /// __Deprecated:__ Please avoid using width in a unit spec that's a part of a layer spec.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub width: Option<HeightUnion>,
    /// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
    /// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
    /// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub mark: Option<AnyMark>,
    /// A key-value mapping between selection names and definitions.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub selection: Option<HashMap<String, SelectionDef>>,
    /// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
    /// `"each"`, and `"none"`.
    ///
    /// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
    /// one after the other. - For `"each"`, subviews will be aligned into a clean grid
    /// structure, but each row or column may be of variable size. - For `"all"`, subviews will
    /// be aligned and each row or column will be sized identically based on the maximum observed
    /// size. String values for this property will be applied to both grid rows and columns.
    ///
    /// Alternatively, an object value of the form `{"row": string, "column": string}` can be
    /// used to supply different alignments for rows and columns.
    ///
    /// __Default value:__ `"all"`.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub align: Option<VegaliteAlign>,
    /// The bounds calculation method to use for determining the extent of a sub-plot. One of
    /// `full` (the default) or `flush`.
    ///
    /// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
    /// be used. - If set to `flush`, only the specified width and height values for the sub-view
    /// will be used. The `flush` setting can be useful when attempting to place sub-plots
    /// without axes or legends into a uniform grid structure.
    ///
    /// __Default value:__ `"full"`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub bounds: Option<Bounds>,
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// An object value of the form `{"row": boolean, "column": boolean}` can be used to supply
    /// different centering values for rows and columns.
    ///
    /// __Default value:__ `false`
    ///
    /// Boolean flag indicating if subviews should be centered relative to their respective rows
    /// or columns.
    ///
    /// __Default value:__ `false`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub center: Option<Center>,
    /// The spacing in pixels between sub-views of the composition operator. An object of the
    /// form `{"row": number, "column": number}` can be used to set different spacing values for
    /// rows and columns.
    ///
    /// __Default value__: Depends on `"spacing"` property of [the view composition
    /// configuration](https://vega.github.io/vega-lite/docs/config.html#view-config) (`20` by
    /// default)
    ///
    /// The spacing in pixels between sub-views of the concat operator.
    ///
    /// __Default value__: `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spacing: Option<Spacing>,
    /// The number of columns to include in the view composition layout.
    ///
    /// __Default value__: `undefined` -- An infinite number of columns (a single row) will be
    /// assumed. This is equivalent to `hconcat` (for `concat`) and to using the `column` channel
    /// (for `facet` and `repeat`).
    ///
    /// __Note__:
    ///
    /// 1) This property is only for: - the general (wrappable) `concat` operator (not
    /// `hconcat`/`vconcat`) - the `facet` and `repeat` operator with one field/repetition
    /// definition (without row/column nesting)
    ///
    /// 2) Setting the `columns` to `1` is equivalent to `vconcat` (for `concat`) and to using
    /// the `row` channel (for `facet` and `repeat`).
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub columns: Option<f64>,
    /// Definition for fields to be repeated. One of: 1) An array of fields to be repeated. If
    /// `"repeat"` is an array, the field can be referred to as `{"repeat": "repeat"}`. The
    /// repeated views are laid out in a wrapped row. You can set the number of columns to
    /// control the wrapping. 2) An object that maps `"row"` and/or `"column"` to the listed
    /// fields to be repeated along the particular orientations. The objects `{"repeat": "row"}`
    /// and `{"repeat": "column"}` can be used to refer to the repeated field respectively.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub repeat: Option<RepeatUnion>,
    /// A specification of the view that gets repeated.
    ///
    /// A specification of the view that gets faceted.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub spec: Option<NormalizedSpecSpec>,
    /// Definition for how to facet the data. One of: 1) [a field definition for faceting the
    /// plot by one field](https://vega.github.io/vega-lite/docs/facet.html#field-def) 2) [An
    /// object that maps `row` and `column` channels to their field
    /// definitions](https://vega.github.io/vega-lite/docs/facet.html#mapping)
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub facet: Option<FacetFieldName>,
    /// A list of views to be concatenated.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub concat: Option<Vec<Spec>>,
    /// A list of views to be concatenated and put into a column.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub vconcat: Option<Vec<Spec>>,
    /// A list of views to be concatenated and put into a row.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(default)]
    pub hconcat: Option<Vec<Spec>>,
}

/// The alignment to apply to grid rows and columns. The supported string values are `"all"`,
/// `"each"`, and `"none"`.
///
/// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
/// one after the other. - For `"each"`, subviews will be aligned into a clean grid
/// structure, but each row or column may be of variable size. - For `"all"`, subviews will
/// be aligned and each row or column will be sized identically based on the maximum observed
/// size. String values for this property will be applied to both grid rows and columns.
///
/// Alternatively, an object value of the form `{"row": string, "column": string}` can be
/// used to supply different alignments for rows and columns.
///
/// __Default value:__ `"all"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum VegaliteAlign {
    Enum(LayoutAlign),
    RowColLayoutAlign(RowColLayoutAlign),
}

/// How the visualization size should be determined. If a string, should be one of `"pad"`,
/// `"fit"` or `"none"`. Object values can additionally specify parameters for content sizing
/// and automatic resizing.
///
/// __Default value__: `pad`
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Autosize {
    AutoSizeParams(AutoSizeParams),
    Enum(AutosizeType),
}

/// CSS color property to use as the background of the entire view.
///
/// __Default value:__ `"white"`
///
/// The color of the header label, can be in hex color code or regular color name.
///
/// Color of the header title, can be in hex color code or regular color name.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Color {
    BackgroundExprRef(BackgroundExprRef),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Center {
    Bool(bool),
    RowColBoolean(RowColBoolean),
}

/// Generate graticule GeoJSON data for geographic reference lines.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Graticule {
    Bool(bool),
    GraticuleParams(GraticuleParams),
}

/// Generate sphere GeoJSON data for the full globe.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum SphereUnion {
    Bool(bool),
    SphereClass(SphereClass),
}

/// 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.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum UrlDataInlineDataset {
    AnythingMap(HashMap<String, Option<serde_json::Value>>),
    String(String),
    UnionArray(Vec<serde_json::value::Value>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
#[allow(unused)]
enum UnusedInlineDataset {
    AnythingMap(HashMap<String, Option<serde_json::Value>>),
    Bool(bool),
    Double(f64),
    String(String),
}

/// Aggregation function for the field (e.g., `"mean"`, `"sum"`, `"median"`, `"min"`,
/// `"max"`, `"count"`).
///
/// __Default value:__ `undefined` (None)
///
/// __See also:__ [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html)
/// documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Aggregate {
    ArgmDef(ArgmDef),
    Enum(NonArgAggregateOp),
}

/// An object indicating bin properties, or simply `true` for using default bin parameters.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AngleBin {
    BinParams(BinParams),
    Bool(bool),
}

/// A two-element (`[min, max]`) array indicating the range of desired bin values.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum BinExtent {
    BinExtentClass(BinExtentClass),
    DoubleArray(Vec<f64>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AngleCondition {
    ConditionalPredicateValueDefNumberExprRefClass(ConditionalPredicateValueDefNumberExprRefClass),
    ConditionalValueDefNumberExprRefArray(Vec<ConditionalValueDefNumberExprRef>),
}

/// Filter using a selection name or a logical composition of selection names.
///
/// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
/// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum SelectionCompositionElement {
    Selection(Selection),
    String(String),
}

/// Filter using a selection name or a logical composition of selection names.
///
/// A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of
/// [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalValueDefNumberExprRefSelectionComposition {
    Selection(Selection),
    String(String),
}

/// Predicate for triggering the condition
///
/// The `filter` property must be a predication definition, which can take one of the
/// following forms:
///
/// 1) an [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string,
/// where `datum` can be used to refer to the current data object. For example, `{filter:
/// "datum.b2 > 60"}` would make the output data includes only items that have values in the
/// field `b2` over 60.
///
/// 2) one of the [field
/// predicates](https://vega.github.io/vega-lite/docs/predicate.html#field-predicate):
/// [`equal`](https://vega.github.io/vega-lite/docs/predicate.html#field-equal-predicate),
/// [`lt`](https://vega.github.io/vega-lite/docs/predicate.html#lt-predicate),
/// [`lte`](https://vega.github.io/vega-lite/docs/predicate.html#lte-predicate),
/// [`gt`](https://vega.github.io/vega-lite/docs/predicate.html#gt-predicate),
/// [`gte`](https://vega.github.io/vega-lite/docs/predicate.html#gte-predicate),
/// [`range`](https://vega.github.io/vega-lite/docs/predicate.html#range-predicate),
/// [`oneOf`](https://vega.github.io/vega-lite/docs/predicate.html#one-of-predicate), or
/// [`valid`](https://vega.github.io/vega-lite/docs/predicate.html#valid-predicate),
///
/// 3) a [selection
/// predicate](https://vega.github.io/vega-lite/docs/predicate.html#selection-predicate),
/// which define the names of a selection that the data point should belong to (or a logical
/// composition of selections).
///
/// 4) a [logical
/// composition](https://vega.github.io/vega-lite/docs/predicate.html#composition) of (1),
/// (2), or (3).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PredicateCompositionElement {
    Predicate(Box<Predicate>),
    String(String),
}

/// Predicate for triggering the condition
///
/// The `filter` property must be a predication definition, which can take one of the
/// following forms:
///
/// 1) an [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string,
/// where `datum` can be used to refer to the current data object. For example, `{filter:
/// "datum.b2 > 60"}` would make the output data includes only items that have values in the
/// field `b2` over 60.
///
/// 2) one of the [field
/// predicates](https://vega.github.io/vega-lite/docs/predicate.html#field-predicate):
/// [`equal`](https://vega.github.io/vega-lite/docs/predicate.html#field-equal-predicate),
/// [`lt`](https://vega.github.io/vega-lite/docs/predicate.html#lt-predicate),
/// [`lte`](https://vega.github.io/vega-lite/docs/predicate.html#lte-predicate),
/// [`gt`](https://vega.github.io/vega-lite/docs/predicate.html#gt-predicate),
/// [`gte`](https://vega.github.io/vega-lite/docs/predicate.html#gte-predicate),
/// [`range`](https://vega.github.io/vega-lite/docs/predicate.html#range-predicate),
/// [`oneOf`](https://vega.github.io/vega-lite/docs/predicate.html#one-of-predicate), or
/// [`valid`](https://vega.github.io/vega-lite/docs/predicate.html#valid-predicate),
///
/// 3) a [selection
/// predicate](https://vega.github.io/vega-lite/docs/predicate.html#selection-predicate),
/// which define the names of a selection that the data point should belong to (or a logical
/// composition of selections).
///
/// 4) a [logical
/// composition](https://vega.github.io/vega-lite/docs/predicate.html#composition) of (1),
/// (2), or (3).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalValueDefNumberExprRefPredicateComposition {
    Predicate(Box<Predicate>),
    String(String),
}

/// The value that the field should be equal to.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Equal {
    Bool(bool),
    Double(f64),
    EqualDateTime(EqualDateTime),
    String(String),
}

/// Value representing the day of a week. This can be one of: (1) integer value -- `1`
/// represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3)
/// case-insensitive, 3-character short day name (e.g., `"Mon"`).
///
/// **Warning:** A DateTime definition object with `day`** should not be combined with
/// `year`, `quarter`, `month`, or `date`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Day {
    Double(f64),
    String(String),
}

/// One of: (1) integer value representing the month from `1`-`12`. `1` represents January;
/// (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character
/// short month name (e.g., `"Jan"`).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Month {
    Double(f64),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Lt {
    Double(f64),
    GtDateTime(GtDateTime),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum SelectionInitInterval {
    Bool(bool),
    DateTime(DateTime),
    Double(f64),
    String(String),
}

/// An array of inclusive minimum and maximum values for a field value of a data item to be
/// included in the filtered data.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LogicalNotPredicateRange {
    BackgroundExprRef(BackgroundExprRef),
    UnionArray(Vec<Option<PurpleRange>>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PurpleRange {
    Double(f64),
    RangeDateTime(RangeDateTime),
}

/// Time unit for the field to be tested.
///
/// Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. or [a
/// temporal field that gets casted as
/// ordinal](https://vega.github.io/vega-lite/docs/type.html#cast).
///
/// __Default value:__ `undefined` (None)
///
/// __See also:__ [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html)
/// documentation.
///
/// The timeUnit.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TimeUnitUnion {
    Enum(TimeUnit),
    TimeUnitParams(TimeUnitParams),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalValueDefNumberExprRefValue {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
}

/// A constant value in data domain.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PrimitiveValue {
    Bool(bool),
    Double(f64),
    RepeatRefClass(RepeatRefClass),
    String(String),
}

/// __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.
///
/// __See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.
///
/// __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`.
///
/// The data [field](https://vega.github.io/vega-lite/docs/field.html) to sort by.
///
/// __Default value:__ If unspecified, defaults to the field specified in the outer data
/// reference.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Field {
    RepeatRef(RepeatRef),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Aria {
    BackgroundExprRef(BackgroundExprRef),
    Bool(bool),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum CornerRadiusUnion {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Format {
    AnythingMap(HashMap<String, Option<serde_json::Value>>),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FontSize {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum GridAlign {
    BackgroundExprRef(BackgroundExprRef),
    Enum(LayoutAlign),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TitleAlignUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(Align),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TextBaseline {
    BackgroundExprRef(BackgroundExprRef),
    Enum(Baseline),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FontWeightUnion {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
    Enum(FontWeightEnum),
}

/// The strategy to use for resolving overlap of axis labels. If `false` (the default), no
/// overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing
/// every other label is used (this works well for standard linear axes). If set to
/// `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps
/// with the last visible label (this often works better for log-scaled axes).
///
/// __Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log
/// scales; otherwise `false`.
///
/// The strategy to use for resolving overlap of labels in gradient legends. If `false`, no
/// overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing
/// every other label is used. If set to `"greedy"`, a linear scan of the labels is
/// performed, removing any label that overlaps with the last visible label (this often works
/// better for log-scaled axes).
///
/// __Default value:__ `"greedy"` for `log scales otherwise `true`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LabelOverlapUnion {
    BackgroundExprRef(BackgroundExprRef),
    Bool(bool),
    Enum(LabelOverlapEnum),
}

/// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
/// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
/// between `0` to `1` for opacity).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StrokeDashUnion {
    BackgroundExprRef(BackgroundExprRef),
    DoubleArray(Vec<f64>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TickCount {
    Double(f64),
    Enum(TimeInterval),
    TickCountTimeIntervalStep(TickCountTimeIntervalStep),
}

/// A string or array of strings indicating the name of custom styles to apply to the mark. A
/// style is a named collection of mark property defaults defined within the [style
/// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
/// an array, later styles will override earlier styles. Any [mark
/// properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly
/// defined within the `encoding` will override a style default.
///
/// __Default value:__ The mark's name. For example, a bar mark will have style `"bar"` by
/// default. __Note:__ Any specified style will augment the default style. For example, a bar
/// mark with `"style": "foo"` will receive from `config.style.bar` and `config.style.foo`
/// (the specified style `"foo"` has higher precedence).
///
/// A string or array of strings indicating the name of custom styles to apply to the axis. A
/// style is a named collection of axis property defined within the [style
/// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
/// an array, later styles will override earlier styles.
///
/// __Default value:__ (none) __Note:__ Any specified style will augment the default style.
/// For example, an x-axis mark with `"style": "foo"` will use `config.axisX` and
/// `config.style.foo` (the specified style `"foo"` has higher precedence).
///
/// Placeholder text if the `text` channel is not specified
///
/// The subtitle Text.
///
/// A [mark style property](https://vega.github.io/vega-lite/docs/config.html#style) to apply
/// to the title text mark.
///
/// __Default value:__ `"group-title"`.
///
/// Output field names. This can be either a string or an array of strings with two elements
/// denoting the name for the fields for stack start and stack end respectively. If a single
/// string(e.g., `"val"`) is provided, the end field will be `"val_end"`.
///
/// A string or array of strings indicating the name of custom styles to apply to the view
/// background. A style is a named collection of mark property defaults defined within the
/// [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If
/// style is an array, later styles will override earlier styles.
///
/// __Default value:__ `"cell"` __Note:__ Any specified view background properties will
/// augment the default style.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LegendText {
    String(String),
    StringArray(Vec<String>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TitleAnchorUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(TitleAnchorEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TitleOrientUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(Orient),
}

/// Explicitly set the visible axis tick values.
///
/// Explicitly set the visible legend values.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Values {
    BackgroundExprRef(BackgroundExprRef),
    UnionArray(Vec<SelectionInitInterval>),
}

/// Bin boundaries can be provided to scales as either an explicit array of bin boundaries or
/// as a bin specification object. The legal values are: - An [array](../types/#Array)
/// literal of bin boundary values. For example, `[0, 5, 10, 15, 20]`. The array must include
/// both starting and ending boundaries. The previous example uses five values to indicate a
/// total of four bin intervals: [0-5), [5-10), [10-15), [15-20]. Array literals may include
/// signal references as elements. - A [bin specification
/// object](https://vega.github.io/vega-lite/docs/scale.html#bins) that indicates the bin
/// _step_ size, and optionally the _start_ and _stop_ boundaries. - 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.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ScaleBins {
    DoubleArray(Vec<f64>),
    ScaleBinParams(ScaleBinParams),
}

/// Customized domain values in the form of constant values or dynamic values driven by a
/// selection.
///
/// 1) Constant `domain` for _quantitative_ fields can take one of the following forms:
///
/// - A two-element array with minimum and maximum values. To create a diverging scale, this
/// two-element array can be combined with the `domainMid` property. - An array with more
/// than two entries, for [Piecewise quantitative
/// scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). - A string value
/// `"unaggregated"`, if the input field is aggregated, to indicate that the domain should
/// include the raw data values prior to the aggregation.
///
/// 2) Constant `domain` for _temporal_ fields can be a two-element array with 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).
///
/// 3) Constant `domain` for _ordinal_ and _nominal_ fields can be an array that lists valid
/// input values.
///
/// 4) To combine (union) specified constant domain with the field's values, `domain` can be
/// an object with a `unionWith` property that specify constant domain to be combined. For
/// example, `domain: {unionWith: [0, 100]}` for a quantitative scale means that the scale
/// domain always includes `[0, 100]`, but will include other values in the fields beyond
/// `[0, 100]`.
///
/// 5) Domain can also takes an object defining a field or encoding of a selection that
/// [interactively
/// determines](https://vega.github.io/vega-lite/docs/selection.html#scale-domains) the scale
/// domain.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DomainUnion {
    DomainUnionWith(DomainUnionWith),
    Enum(DomainEnum),
    UnionArray(Vec<Option<DomainElement>>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DomainElement {
    Bool(bool),
    DomainDateTime(DomainDateTime),
    Double(f64),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DomainM {
    DomainMaxDateTime(DomainMaxDateTime),
    Double(f64),
}

/// 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).
///
/// * __Default value:__ `hcl`
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ScaleInterpolate {
    Enum(ScaleInterpolateEnum),
    ExprRef(ExprRef),
}

/// 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]_.
///
/// For 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.
///
/// For temporal fields with time and utc scales, the `nice` value can be a string indicating
/// the desired time interval. Legal values are `"millisecond"`, `"second"`, `"minute"`,
/// `"hour"`, `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, `time` and `utc`
/// scales can accept an object-valued interval specifier of the form `{"interval": "month",
/// "step": 3}`, which includes a desired number of interval steps. Here, the domain would
/// snap to quarter (Jan, Apr, Jul, Oct) boundaries.
///
/// __Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Nice {
    Bool(bool),
    Double(f64),
    Enum(TimeInterval),
    NiceTimeIntervalStep(NiceTimeIntervalStep),
}

/// The range of the scale. One of:
///
/// - 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"`).
///
/// - 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).
///
/// - 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 or an object with a `field` property representing the
/// range values.  For example, if a field `color` contains CSS color names, we can set
/// `range` to `{field: "color"}`.
///
/// __Notes:__
///
/// 1) For color scales you can also specify a color
/// [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.
///
/// 2) 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`).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ScaleRange {
    Enum(RangeEnum),
    RangeClass(RangeClass),
    UnionArray(Vec<FluffyRange>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FluffyRange {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
    DoubleArray(Vec<f64>),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum RangeM {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
    String(String),
}

/// 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).
///
/// Discrete 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.
///
/// For the full list of supported schemes, please refer to the [Vega
/// Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Scheme {
    SchemeParams(SchemeParams),
    String(String),
}

/// Sort order for the encoded field.
///
/// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
/// `"descending"`.
///
/// For discrete fields, `sort` can be one of the following: - `"ascending"` or
/// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A string
/// indicating an encoding channel name to sort
/// by](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding) (e.g., `"x"` or
/// `"y"`) with an optional minus prefix for descending sort (e.g., `"-x"` to sort by
/// x-field, descending). This channel string is short-form of [a sort-by-encoding
/// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-by-encoding). For
/// example, `"sort": "-x"` is equivalent to `"sort": {"encoding": "x", "order":
/// "descending"}`. - [A sort field
/// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
/// another field. - [An array specifying the field values in preferred
/// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
/// sort order will obey the values in the array, followed by any unspecified values in their
/// original order. For discrete time field, values in the sort array can be [date-time
/// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
/// the values can be the month or day names (case insensitive) or their 3-letter initials
/// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
///
/// __Default value:__ `"ascending"`
///
/// __Note:__ `null` and sorting by another channel is not supported for `row` and `column`.
///
/// __See also:__ [`sort`](https://vega.github.io/vega-lite/docs/sort.html) documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum SortUnion {
    EncodingSortField(EncodingSortField),
    Enum(Sort),
    UnionArray(Vec<SelectionInitInterval>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ColorCondition {
    ConditionalPredicateValueDefGradientStringNullExprRefClass(
        ConditionalPredicateValueDefGradientStringNullExprRefClass,
    ),
    ConditionalValueDefGradientStringNullExprRefArray(
        Vec<ConditionalValueDefGradientStringNullExprRef>,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalValueDefGradientStringNullExprRefValue {
    String(String),
    ValueLinearGradient(ValueLinearGradient),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PurpleSortArray {
    Enum(SortOrder),
    SortEncodingSortField(SortEncodingSortField),
    UnionArray(Vec<SelectionInitInterval>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DescriptionBin {
    BinParams(BinParams),
    Bool(bool),
    Enum(BinEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DescriptionCondition {
    PurpleConditionalExprRef(PurpleConditionalExprRef),
    PurpleConditionalValueDefStringExprRefArray(Vec<PurpleConditionalValueDefStringExprRef>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Detail {
    TypedFieldDef(TypedFieldDef),
    TypedFieldDefArray(Vec<TypedFieldDef>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Spacing {
    Double(f64),
    RowColNumber(RowColNumber),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Latitude2Value {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
    Enum(ValueEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Order {
    OrderDef(OrderDef),
    OrderFieldDefArray(Vec<OrderFieldDef>),
}

/// One or more value definition(s) with [a selection or a test
/// predicate](https://vega.github.io/vega-lite/docs/condition.html).
///
/// __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.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum OrderFieldDefCondition {
    ConditionalPredicateValueDefNumberClass(ConditionalPredicateValueDefNumberClass),
    ConditionalValueDefNumberArray(Vec<ConditionalValueDefNumber>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Stack {
    Bool(bool),
    Enum(StackOffset),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ShapeCondition {
    ConditionalPredicateValueDefStringNullExprRefClass(
        ConditionalPredicateValueDefStringNullExprRefClass,
    ),
    ConditionalValueDefStringNullExprRefArray(Vec<ConditionalValueDefStringNullExprRef>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StrokeDashCondition {
    ConditionalSelectionValueDefNumberExprRefClass(ConditionalSelectionValueDefNumberExprRefClass),
    ConditionalValueDefNumberExprRefElementArray(Vec<ConditionalValueDefNumberExprRefElement>),
}

/// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
/// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
/// between `0` to `1` for opacity).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalValueDefNumberExprRefValueUnion {
    BackgroundExprRef(BackgroundExprRef),
    DoubleArray(Vec<f64>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TextCondition {
    Conditional(Conditional),
    ConditionalValueDefTextExprRefArray(Vec<ConditionalValueDefTextExprRef>),
}

/// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
/// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
/// between `0` to `1` for opacity).
///
/// The title text.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalValueDefTextExprRefText {
    BackgroundExprRef(BackgroundExprRef),
    String(String),
    StringArray(Vec<String>),
}

/// A constant value in visual domain (e.g., `"red"` / `"#0099ff"` / [gradient
/// definition](https://vega.github.io/vega-lite/docs/types.html#gradient) for color, values
/// between `0` to `1` for opacity).
///
/// The title text.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalPredicateValueDefTextExprRefText {
    BackgroundExprRef(BackgroundExprRef),
    String(String),
    StringArray(Vec<String>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum EncodingTooltip {
    FieldOrDatumDefWithConditionStringFieldDefString(
        FieldOrDatumDefWithConditionStringFieldDefString,
    ),
    StringFieldDefArray(Vec<StringFieldDef>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FieldOrDatumDefWithConditionStringFieldDefStringCondition {
    FluffyConditionalExprRef(FluffyConditionalExprRef),
    FluffyConditionalValueDefStringExprRefArray(Vec<FluffyConditionalValueDefStringExprRef>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Cap {
    BackgroundExprRef(BackgroundExprRef),
    Enum(StrokeCap),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum GridColorUnion {
    GridColorExprRef(GridColorExprRef),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionUnion {
    ConditionClass(ConditionClass),
    ConditionalPredicateValueDefColorNullExprRefArray(
        Vec<ConditionalPredicateValueDefColorNullExprRef>,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AxisGridDash {
    DoubleArray(Vec<f64>),
    PurpleExprRef(PurpleExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TentacledConditionalPredicateValueDefNumberNullExprRef {
    ConditionalPredicateValueDefNumberNullExprRefArray(
        Vec<ConditionalPredicateValueDefNumberNullExprRef>,
    ),
    PurpleConditionalPredicateValueDefNumberNullExprRef(
        PurpleConditionalPredicateValueDefNumberNullExprRef,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum GridDashOffsetUnion {
    Double(f64),
    GridDashOffsetExprRef(GridDashOffsetExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StickyConditionalPredicateValueDefNumberNullExprRef {
    ConditionalPredicateValueDefNumberNullExprRefElementArray(
        Vec<ConditionalPredicateValueDefNumberNullExprRefElement>,
    ),
    FluffyConditionalPredicateValueDefNumberNullExprRef(
        FluffyConditionalPredicateValueDefNumberNullExprRef,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum GridOpacityUnion {
    Double(f64),
    GridOpacityExprRef(GridOpacityExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum GridWidthUnion {
    Double(f64),
    GridWidthExprRef(GridWidthExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalAxisPropertyAlignNull {
    Enum(Align),
    FluffyExprRef(FluffyExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ExprRefCondition {
    ConditionCondition(ConditionCondition),
    ConditionalPredicateValueDefAlignNullExprRefArray(
        Vec<ConditionalPredicateValueDefAlignNullExprRef>,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LabelAngle {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PurpleTextBaseline {
    Enum(Baseline),
    TentacledExprRef(TentacledExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ExprRefConditionUnion {
    ConditionConditionClass(ConditionConditionClass),
    ConditionalPredicateValueDefTextBaselineNullExprRefArray(
        Vec<ConditionalPredicateValueDefTextBaselineNullExprRef>,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Label {
    BackgroundExprRef(BackgroundExprRef),
    Bool(bool),
    Double(f64),
}

/// Indicates if labels should be hidden if they exceed the axis range. If `false` (the
/// default) no bounds overlap analysis is performed. If `true`, labels will be hidden if
/// they exceed the axis range by more than 1 pixel. If this property is a number, it
/// specifies the pixel tolerance: the maximum amount by which a label bounding box may
/// exceed the axis range.
///
/// __Default value:__ `false`.
///
/// Indicates if the first and last axis labels should be aligned flush with the scale range.
/// Flush alignment for a horizontal axis will left-align the first label and right-align the
/// last label. For vertical axes, bottom and top text baselines are applied instead. If this
/// property is a number, it also indicates the number of pixels by which to offset the first
/// and last labels; for example, a value of 2 will flush-align the first and last labels and
/// also push them 2 pixels outward from the center of the axis. The additional adjustment
/// can sometimes help the labels better visually group with corresponding axis ticks.
///
/// __Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LabelFlush {
    Bool(bool),
    Double(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalAxisPropertyStringNull {
    StickyExprRef(StickyExprRef),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FluffyConditionalPredicateValueDefStringNullExprRef {
    ConditionalPredicateValueDefStringNullExprRefArray(
        Vec<ConditionalPredicateValueDefStringNullExprRef>,
    ),
    PurpleConditionalPredicateValueDefStringNullExprRef(
        PurpleConditionalPredicateValueDefStringNullExprRef,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ConditionalAxisPropertyFontStyleNull {
    IndigoExprRef(IndigoExprRef),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FluffyConditionalPredicateValueDefFontStyleNullExprRef {
    ConditionalPredicateValueDefFontStyleNullExprRefArray(
        Vec<ConditionalPredicateValueDefFontStyleNullExprRef>,
    ),
    PurpleConditionalPredicateValueDefFontStyleNullExprRef(
        PurpleConditionalPredicateValueDefFontStyleNullExprRef,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FontWeight {
    Double(f64),
    Enum(FontWeightEnum),
    IndecentExprRef(IndecentExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FluffyConditionalPredicateValueDefFontWeightNullExprRef {
    ConditionalPredicateValueDefFontWeightNullExprRefArray(
        Vec<ConditionalPredicateValueDefFontWeightNullExprRef>,
    ),
    PurpleConditionalPredicateValueDefFontWeightNullExprRef(
        PurpleConditionalPredicateValueDefFontWeightNullExprRef,
    ),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ValueUnion {
    Double(f64),
    Enum(FontWeightEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TickBandUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(TickBandEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AxisTickDash {
    DoubleArray(Vec<f64>),
    HilariousExprRef(HilariousExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Keyvals {
    AnythingArray(Vec<Option<serde_json::Value>>),
    ImputeSequence(ImputeSequence),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum HeightUnion {
    Double(f64),
    Enum(HeightEnum),
    Step(Step),
}

/// A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`,
/// `"line"`, `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark
/// definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AnyMark {
    Def(Def),
    Enum(Mark),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Angle {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DefBox {
    Bool(bool),
    MarkConfigExprOrSignalRef(MarkConfigExprOrSignalRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum BlendUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(BlendEnum),
}

/// Default color.
///
/// __Default value:__ <span style="color: #4682b4;">&#9632;</span> `"#4682b4"`
///
/// __Note:__ - This property cannot be used in a [style
/// config](https://vega.github.io/vega-lite/docs/mark.html#style-config). - The `fill` and
/// `stroke` properties have higher precedence than `color` and will override `color`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum MarkConfigExprOrSignalRefColor {
    PurpleLinearGradient(PurpleLinearGradient),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum CursorUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(Cursor),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Dir {
    BackgroundExprRef(BackgroundExprRef),
    Enum(TextDirection),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum MarkConfigExprOrSignalRefFill {
    FluffyLinearGradient(FluffyLinearGradient),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Opacity {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum MarkConfigExprOrSignalRefInterpolate {
    BackgroundExprRef(BackgroundExprRef),
    Enum(Interpolate),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StrokeJoinUnion {
    BackgroundExprRef(BackgroundExprRef),
    Enum(StrokeJoin),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum MarkConfigExprOrSignalRefTooltip {
    Bool(bool),
    Double(f64),
    PurpleTooltipContent(PurpleTooltipContent),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum XUnion {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
    Enum(XEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum YUnion {
    BackgroundExprRef(BackgroundExprRef),
    Double(f64),
    Enum(YEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum MarkDefExtent {
    Double(f64),
    Enum(ExtentExtent),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Line {
    Bool(bool),
    OverlayMarkDef(OverlayMarkDef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PointUnion {
    Bool(bool),
    Enum(PointEnum),
    OverlayMarkDef(OverlayMarkDef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum BindUnion {
    Enum(PurpleLegendBinding),
    UnionMap(HashMap<String, PurpleStream>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum PurpleStream {
    AnythingArray(Vec<Option<serde_json::Value>>),
    Double(f64),
    PurpleBinding(PurpleBinding),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum ClearUnion {
    Bool(bool),
    ClearDerivedStream(ClearDerivedStream),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Init {
    UnionMap(HashMap<String, Option<InitValue>>),
    UnionMapArray(Vec<HashMap<String, Option<SelectionInit>>>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum SelectionInit {
    Bool(bool),
    DateTime(DateTime),
    Double(f64),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum InitValue {
    Bool(bool),
    DateTime(DateTime),
    Double(f64),
    String(String),
    UnionArray(Vec<SelectionInitInterval>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum OnUnion {
    OnDerivedStream(OnDerivedStream),
    String(String),
}

/// When truthy, allows a user to interactively move an interval selection back-and-forth.
/// Can be `true`, `false` (to disable panning), or a [Vega event stream
/// definition](https://vega.github.io/vega/docs/event-streams/) which must include a start
/// and end event to trigger continuous panning.
///
/// __Default value:__ `true`, which corresponds to `[mousedown, window:mouseup] >
/// window:mousemove!` which corresponds to clicks and dragging within an interval selection
/// to reposition it.
///
/// __See also:__ [`translate`](https://vega.github.io/vega-lite/docs/translate.html)
/// documentation.
///
/// When truthy, allows a user to interactively resize an interval selection. Can be `true`,
/// `false` (to disable zooming), or a [Vega event stream
/// definition](https://vega.github.io/vega/docs/event-streams/). Currently, only `wheel`
/// events are supported.
///
/// __Default value:__ `true`, which corresponds to `wheel!`.
///
/// __See also:__ [`zoom`](https://vega.github.io/vega-lite/docs/zoom.html) documentation.
///
/// Controls whether data values should be toggled or only ever inserted into multi
/// selections. Can be `true`, `false` (for insertion only), or a [Vega
/// expression](https://vega.github.io/vega/docs/expressions/).
///
/// __Default value:__ `true`, which corresponds to `event.shiftKey` (i.e., data values are
/// toggled when a user interacts with the shift-key pressed).
///
/// Setting the value to the Vega expression `"true"` will toggle data values without the
/// user pressing the shift-key.
///
/// __See also:__ [`toggle`](https://vega.github.io/vega-lite/docs/toggle.html) documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Translate {
    Bool(bool),
    String(String),
}

/// Title for the plot.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TitleUnion {
    String(String),
    StringArray(Vec<String>),
    TitleParams(TitleParams),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum TitleParamsOrient {
    BackgroundExprRef(BackgroundExprRef),
    Enum(TitleOrient),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum RepeatUnion {
    RepeatMapping(RepeatMapping),
    StringArray(Vec<String>),
}

/// Sort order for the encoded field.
///
/// For continuous fields (quantitative or temporal), `sort` can be either `"ascending"` or
/// `"descending"`.
///
/// For discrete fields, `sort` can be one of the following: - `"ascending"` or
/// `"descending"` -- for sorting by the values' natural order in JavaScript. - [A sort field
/// definition](https://vega.github.io/vega-lite/docs/sort.html#sort-field) for sorting by
/// another field. - [An array specifying the field values in preferred
/// order](https://vega.github.io/vega-lite/docs/sort.html#sort-array). In this case, the
/// sort order will obey the values in the array, followed by any unspecified values in their
/// original order. For discrete time field, values in the sort array can be [date-time
/// definition objects](struct.DateTime.html). In addition, for time units `"month"` and `"day"`,
/// the values can be the month or day names (case insensitive) or their 3-letter initials
/// (e.g., `"Mon"`, `"Tue"`). - `null` indicating no sort.
///
/// __Default value:__ `"ascending"`
///
/// __Note:__ `null` is not supported for `row` and `column`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FluffySortArray {
    EncodingSortFieldFieldName(EncodingSortFieldFieldName),
    Enum(SortOrder),
    UnionArray(Vec<SelectionInitInterval>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AxisBandGridDash {
    AmbitiousExprRef(AmbitiousExprRef),
    DoubleArray(Vec<f64>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum AxisBandTickDash {
    CunningExprRef(CunningExprRef),
    DoubleArray(Vec<f64>),
}

/// The extent of the whiskers. Available options include: - `"min-max"`: min and max are the
/// lower and upper whiskers respectively. - A number representing multiple of the
/// interquartile range. This number will be multiplied by the IQR to determine whisker
/// boundary, which spans from the smallest data to the largest data within the range _[Q1 -
/// k * IQR, Q3 + k * IQR]_ where _Q1_ and _Q3_ are the first and third quartiles while _IQR_
/// is the interquartile range (_Q3-Q1_).
///
/// __Default value:__ `1.5`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum BoxplotExtent {
    Double(f64),
    Enum(ExtentEnum),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Direction {
    BackgroundExprRef(BackgroundExprRef),
    Enum(Orientation),
}

/// The default visualization padding, in pixels, from the edge of the visualization canvas
/// to the data rectangle. If a number, specifies padding for all sides. If an object, the
/// value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify
/// padding for each side of the visualization.
///
/// __Default value__: `5`
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum Padding {
    Double(f64),
    MagentaExprRef(MagentaExprRef),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum RangeValue {
    AnythingArray(Vec<Option<serde_json::Value>>),
    Enum(RangeEnum),
    RangeRange(RangeRange),
}

/// A string or array of strings indicating the name of custom styles to apply to the mark. A
/// style is a named collection of mark property defaults defined within the [style
/// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
/// an array, later styles will override earlier styles. Any [mark
/// properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly
/// defined within the `encoding` will override a style default.
///
/// __Default value:__ The mark's name. For example, a bar mark will have style `"bar"` by
/// default. __Note:__ Any specified style will augment the default style. For example, a bar
/// mark with `"style": "foo"` will receive from `config.style.bar` and `config.style.foo`
/// (the specified style `"foo"` has higher precedence).
///
/// A string or array of strings indicating the name of custom styles to apply to the axis. A
/// style is a named collection of axis property defined within the [style
/// configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is
/// an array, later styles will override earlier styles.
///
/// __Default value:__ (none) __Note:__ Any specified style will augment the default style.
/// For example, an x-axis mark with `"style": "foo"` will use `config.axisX` and
/// `config.style.foo` (the specified style `"foo"` has higher precedence).
///
/// Placeholder text if the `text` channel is not specified
///
/// The subtitle Text.
///
/// A [mark style property](https://vega.github.io/vega-lite/docs/config.html#style) to apply
/// to the title text mark.
///
/// __Default value:__ `"group-title"`.
///
/// Output field names. This can be either a string or an array of strings with two elements
/// denoting the name for the fields for stack start and stack end respectively. If a single
/// string(e.g., `"val"`) is provided, the end field will be `"val_end"`.
///
/// A string or array of strings indicating the name of custom styles to apply to the view
/// background. A style is a named collection of mark property defaults defined within the
/// [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If
/// style is an array, later styles will override earlier styles.
///
/// __Default value:__ `"cell"` __Note:__ Any specified view background properties will
/// augment the default style.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum RangeText {
    String(String),
    StringArray(Vec<String>),
}

/// When set, a selection is populated by interacting with the corresponding legend. Direct
/// manipulation interaction is disabled by default; to re-enable it, set the selection's
/// [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties)
/// property.
///
/// Legend bindings are restricted to selections that only specify a single field or encoding.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LegendBinding {
    Enum(LegendBindingEnum),
    LegendStreamBinding(LegendStreamBinding),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum LegendUnion {
    OnDerivedStream(OnDerivedStream),
    String(String),
}

/// When set, a selection is populated by input elements (also known as dynamic query
/// widgets) or by interacting with the corresponding legend. Direct manipulation interaction
/// is disabled by default; to re-enable it, set the selection's
/// [`on`](https://vega.github.io/vega-lite/docs/selection.html#common-selection-properties)
/// property.
///
/// Legend bindings are restricted to selections that only specify a single field or
/// encoding.
///
/// Query widget binding takes the form of Vega's [input element binding
/// definition](https://vega.github.io/vega/docs/signals/#bind) or can be a mapping between
/// projected field/encodings and binding definitions.
///
/// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum SingleBind {
    Enum(LegendBindingEnum),
    UnionMap(HashMap<String, FluffyStream>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum FluffyStream {
    AnythingArray(Vec<Option<serde_json::Value>>),
    Double(f64),
    FluffyBinding(FluffyBinding),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StyleColor {
    String(String),
    TentacledLinearGradient(TentacledLinearGradient),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StyleFill {
    StickyLinearGradient(StickyLinearGradient),
    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StyleOrient {
    BackgroundExprRef(BackgroundExprRef),
    Enum(AxisOrient),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum StyleTooltip {
    Bool(bool),
    Double(f64),
    FluffyTooltipContent(FluffyTooltipContent),
    String(String),
}

/// The default height when the plot has non arc marks and either a discrete y-field or no
/// y-field. The height can be either a number indicating a fixed height or an object in the
/// form of `{step: number}` defining the height per discrete step.
///
/// __Default value:__ a step size based on `config.view.step`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DiscreteHeightUnion {
    DiscreteHeightClass(DiscreteHeightClass),
    Double(f64),
}

/// The default width when the plot has non-arc marks and either a discrete x-field or no
/// x-field. The width can be either a number indicating a fixed width or an object in the
/// form of `{step: number}` defining the width per discrete step.
///
/// __Default value:__ a step size based on `config.view.step`.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum DiscreteWidthUnion {
    DiscreteWidthClass(DiscreteWidthClass),
    Double(f64),
}

/// 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.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(From)]
pub enum InlineDatasetValue {
    AnythingMap(HashMap<String, Option<serde_json::Value>>),
    String(String),
    UnionArray(Vec<serde_json::value::Value>),
}

/// The alignment to apply to symbol legends rows and columns. The supported string values
/// are `"all"`, `"each"` (the default), and `none`. For more information, see the [grid
/// layout documentation](https://vega.github.io/vega/docs/layout).
///
/// __Default value:__ `"each"`.
///
/// The alignment to apply to row/column facet's subplot. The supported string values are
/// `"all"`, `"each"`, and `"none"`.
///
/// - For `"none"`, a flow layout will be used, in which adjacent subviews are simply placed
/// one after the other. - For `"each"`, subviews will be aligned into a clean grid
/// structure, but each row or column may be of variable size. - For `"all"`, subviews will
/// be aligned and each row or column will be sized identically based on the maximum observed
/// size. String values for this property will be applied to both grid rows and columns.
///
/// __Default value:__ `"all"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LayoutAlign {
    #[serde(rename = "all")]
    All,
    #[serde(rename = "each")]
    Each,
    #[serde(rename = "none")]
    None,
}

/// The sizing format type. One of `"pad"`, `"fit"`, `"fit-x"`, `"fit-y"`,  or `"none"`. See
/// the [autosize type](https://vega.github.io/vega-lite/docs/size.html#autosize)
/// documentation for descriptions of each.
///
/// __Default value__: `"pad"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AutosizeType {
    #[serde(rename = "fit")]
    Fit,
    #[serde(rename = "fit-x")]
    FitX,
    #[serde(rename = "fit-y")]
    FitY,
    #[serde(rename = "none")]
    None,
    #[serde(rename = "pad")]
    Pad,
}

/// Determines how size calculation should be performed, one of `"content"` or `"padding"`.
/// The default setting (`"content"`) interprets the width and height settings as the data
/// rectangle (plotting) dimensions, to which padding is then added. In contrast, the
/// `"padding"` setting includes the padding within the view size calculations, such that the
/// width and height settings indicate the **total** intended size of the view.
///
/// __Default value__: `"content"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Contains {
    #[serde(rename = "content")]
    Content,
    #[serde(rename = "padding")]
    Padding,
}

/// The bounds calculation method to use for determining the extent of a sub-plot. One of
/// `full` (the default) or `flush`.
///
/// - If set to `full`, the entire calculated bounds (including axes, title, and legend) will
/// be used. - If set to `flush`, only the specified width and height values for the sub-view
/// will be used. The `flush` setting can be useful when attempting to place sub-plots
/// without axes or legends into a uniform grid structure.
///
/// __Default value:__ `"full"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Bounds {
    #[serde(rename = "flush")]
    Flush,
    #[serde(rename = "full")]
    Full,
}

/// Type of input data: `"json"`, `"csv"`, `"tsv"`, `"dsv"`.
///
/// __Default value:__  The default format type is determined by the extension of the file
/// URL. If no extension is detected, `"json"` will be used by default.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DataFormatType {
    #[serde(rename = "csv")]
    Csv,
    #[serde(rename = "dsv")]
    Dsv,
    #[serde(rename = "json")]
    Json,
    #[serde(rename = "topojson")]
    Topojson,
    #[serde(rename = "tsv")]
    Tsv,
}

/// An [aggregate operation](https://vega.github.io/vega-lite/docs/aggregate.html#ops) to
/// perform on the field prior to sorting (e.g., `"count"`, `"mean"` and `"median"`). An
/// aggregation is required when there are multiple values of the sort field for each encoded
/// data field. The input data objects will be aggregated, grouped by the encoded data
/// field.
///
/// For a full list of operations, please see the documentation for
/// [aggregate](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
///
/// __Default value:__ `"sum"` for stacked plots. Otherwise, `"min"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NonArgAggregateOp {
    #[serde(rename = "average")]
    Average,
    #[serde(rename = "ci0")]
    Ci0,
    #[serde(rename = "ci1")]
    Ci1,
    #[serde(rename = "count")]
    Count,
    #[serde(rename = "distinct")]
    Distinct,
    #[serde(rename = "max")]
    Max,
    #[serde(rename = "mean")]
    Mean,
    #[serde(rename = "median")]
    Median,
    #[serde(rename = "min")]
    Min,
    #[serde(rename = "missing")]
    Missing,
    #[serde(rename = "product")]
    Product,
    #[serde(rename = "q1")]
    Q1,
    #[serde(rename = "q3")]
    Q3,
    #[serde(rename = "stderr")]
    Stderr,
    #[serde(rename = "stdev")]
    Stdev,
    #[serde(rename = "stdevp")]
    Stdevp,
    #[serde(rename = "sum")]
    Sum,
    #[serde(rename = "valid")]
    Valid,
    #[serde(rename = "values")]
    Values,
    #[serde(rename = "variance")]
    Variance,
    #[serde(rename = "variancep")]
    Variancep,
}

/// The encoding channel to extract selected values for, when a selection is
/// [projected](https://vega.github.io/vega-lite/docs/project.html) over multiple fields or
/// encodings.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SingleDefUnitChannel {
    #[serde(rename = "angle")]
    Angle,
    #[serde(rename = "color")]
    Color,
    #[serde(rename = "description")]
    Description,
    #[serde(rename = "fill")]
    Fill,
    #[serde(rename = "fillOpacity")]
    FillOpacity,
    #[serde(rename = "href")]
    Href,
    #[serde(rename = "key")]
    Key,
    #[serde(rename = "latitude")]
    Latitude,
    #[serde(rename = "latitude2")]
    Latitude2,
    #[serde(rename = "longitude")]
    Longitude,
    #[serde(rename = "longitude2")]
    Longitude2,
    #[serde(rename = "opacity")]
    Opacity,
    #[serde(rename = "radius")]
    Radius,
    #[serde(rename = "radius2")]
    Radius2,
    #[serde(rename = "shape")]
    Shape,
    #[serde(rename = "size")]
    Size,
    #[serde(rename = "stroke")]
    Stroke,
    #[serde(rename = "strokeDash")]
    StrokeDash,
    #[serde(rename = "strokeOpacity")]
    StrokeOpacity,
    #[serde(rename = "strokeWidth")]
    StrokeWidth,
    #[serde(rename = "text")]
    Text,
    #[serde(rename = "theta")]
    Theta,
    #[serde(rename = "theta2")]
    Theta2,
    #[serde(rename = "url")]
    Url,
    #[serde(rename = "x")]
    X,
    #[serde(rename = "x2")]
    X2,
    #[serde(rename = "y")]
    Y,
    #[serde(rename = "y2")]
    Y2,
}

/// Defines how date-time values should be binned.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TimeUnit {
    #[serde(rename = "date")]
    Date,
    #[serde(rename = "day")]
    Day,
    #[serde(rename = "dayhours")]
    Dayhours,
    #[serde(rename = "dayhoursminutes")]
    Dayhoursminutes,
    #[serde(rename = "dayhoursminutesseconds")]
    Dayhoursminutesseconds,
    #[serde(rename = "dayofyear")]
    Dayofyear,
    #[serde(rename = "hours")]
    Hours,
    #[serde(rename = "hoursminutes")]
    Hoursminutes,
    #[serde(rename = "hoursminutesseconds")]
    Hoursminutesseconds,
    #[serde(rename = "milliseconds")]
    Milliseconds,
    #[serde(rename = "minutes")]
    Minutes,
    #[serde(rename = "minutesseconds")]
    Minutesseconds,
    #[serde(rename = "month")]
    Month,
    #[serde(rename = "monthdate")]
    Monthdate,
    #[serde(rename = "monthdatehours")]
    Monthdatehours,
    #[serde(rename = "monthdatehoursminutes")]
    Monthdatehoursminutes,
    #[serde(rename = "monthdatehoursminutesseconds")]
    Monthdatehoursminutesseconds,
    #[serde(rename = "quarter")]
    Quarter,
    #[serde(rename = "quartermonth")]
    Quartermonth,
    #[serde(rename = "seconds")]
    Seconds,
    #[serde(rename = "secondsmilliseconds")]
    Secondsmilliseconds,
    #[serde(rename = "utcdate")]
    Utcdate,
    #[serde(rename = "utcday")]
    Utcday,
    #[serde(rename = "utcdayhours")]
    Utcdayhours,
    #[serde(rename = "utcdayhoursminutes")]
    Utcdayhoursminutes,
    #[serde(rename = "utcdayhoursminutesseconds")]
    Utcdayhoursminutesseconds,
    #[serde(rename = "utcdayofyear")]
    Utcdayofyear,
    #[serde(rename = "utchours")]
    Utchours,
    #[serde(rename = "utchoursminutes")]
    Utchoursminutes,
    #[serde(rename = "utchoursminutesseconds")]
    Utchoursminutesseconds,
    #[serde(rename = "utcmilliseconds")]
    Utcmilliseconds,
    #[serde(rename = "utcminutes")]
    Utcminutes,
    #[serde(rename = "utcminutesseconds")]
    Utcminutesseconds,
    #[serde(rename = "utcmonth")]
    Utcmonth,
    #[serde(rename = "utcmonthdate")]
    Utcmonthdate,
    #[serde(rename = "utcmonthdatehours")]
    Utcmonthdatehours,
    #[serde(rename = "utcmonthdatehoursminutes")]
    Utcmonthdatehoursminutes,
    #[serde(rename = "utcmonthdatehoursminutesseconds")]
    Utcmonthdatehoursminutesseconds,
    #[serde(rename = "utcquarter")]
    Utcquarter,
    #[serde(rename = "utcquartermonth")]
    Utcquartermonth,
    #[serde(rename = "utcseconds")]
    Utcseconds,
    #[serde(rename = "utcsecondsmilliseconds")]
    Utcsecondsmilliseconds,
    #[serde(rename = "utcweek")]
    Utcweek,
    #[serde(rename = "utcweekday")]
    Utcweekday,
    #[serde(rename = "utcweekdayhoursminutes")]
    Utcweekdayhoursminutes,
    #[serde(rename = "utcweekdayhoursminutesseconds")]
    Utcweekdayhoursminutesseconds,
    #[serde(rename = "utcweeksdayhours")]
    Utcweeksdayhours,
    #[serde(rename = "utcyear")]
    Utcyear,
    #[serde(rename = "utcyeardayofyear")]
    Utcyeardayofyear,
    #[serde(rename = "utcyearmonth")]
    Utcyearmonth,
    #[serde(rename = "utcyearmonthdate")]
    Utcyearmonthdate,
    #[serde(rename = "utcyearmonthdatehours")]
    Utcyearmonthdatehours,
    #[serde(rename = "utcyearmonthdatehoursminutes")]
    Utcyearmonthdatehoursminutes,
    #[serde(rename = "utcyearmonthdatehoursminutesseconds")]
    Utcyearmonthdatehoursminutesseconds,
    #[serde(rename = "utcyearquarter")]
    Utcyearquarter,
    #[serde(rename = "utcyearquartermonth")]
    Utcyearquartermonth,
    #[serde(rename = "utcyearweek")]
    Utcyearweek,
    #[serde(rename = "utcyearweekday")]
    Utcyearweekday,
    #[serde(rename = "utcyearweekdayhours")]
    Utcyearweekdayhours,
    #[serde(rename = "utcyearweekdayhoursminutes")]
    Utcyearweekdayhoursminutes,
    #[serde(rename = "utcyearweekdayhoursminutesseconds")]
    Utcyearweekdayhoursminutesseconds,
    #[serde(rename = "week")]
    Week,
    #[serde(rename = "weekday")]
    Weekday,
    #[serde(rename = "weekdayhoursminutes")]
    Weekdayhoursminutes,
    #[serde(rename = "weekdayhoursminutesseconds")]
    Weekdayhoursminutesseconds,
    #[serde(rename = "weeksdayhours")]
    Weeksdayhours,
    #[serde(rename = "year")]
    Year,
    #[serde(rename = "yeardayofyear")]
    Yeardayofyear,
    #[serde(rename = "yearmonth")]
    Yearmonth,
    #[serde(rename = "yearmonthdate")]
    Yearmonthdate,
    #[serde(rename = "yearmonthdatehours")]
    Yearmonthdatehours,
    #[serde(rename = "yearmonthdatehoursminutes")]
    Yearmonthdatehoursminutes,
    #[serde(rename = "yearmonthdatehoursminutesseconds")]
    Yearmonthdatehoursminutesseconds,
    #[serde(rename = "yearquarter")]
    Yearquarter,
    #[serde(rename = "yearquartermonth")]
    Yearquartermonth,
    #[serde(rename = "yearweek")]
    Yearweek,
    #[serde(rename = "yearweekday")]
    Yearweekday,
    #[serde(rename = "yearweekdayhours")]
    Yearweekdayhours,
    #[serde(rename = "yearweekdayhoursminutes")]
    Yearweekdayhoursminutes,
    #[serde(rename = "yearweekdayhoursminutesseconds")]
    Yearweekdayhoursminutesseconds,
}

/// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
/// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
/// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
///
/// Vega-Lite automatically infers data types in many cases as discussed below. However, type
/// is required for a field if: (1) the field is not nominal and the field encoding has no
/// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
/// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
/// or `timeUnit`.
///
/// __Default value:__
///
/// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
/// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
/// following criteria: - `"quantitative"` is the default type if (1) the encoded field
/// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
/// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
/// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
/// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
/// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
/// encoded field contains a [custom `sort`
/// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
/// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
/// `order`.
///
/// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
/// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
/// object](https://vega.github.io/vega-lite/docs/datetime.html)
///
/// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
/// data types (number, string, etc.). The same primitive data type can have different types
/// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
/// data. - Data values for a temporal field can be either a date-time string (e.g.,
/// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
/// (e.g., `1552199579097`). - When using with
/// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
/// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
/// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
/// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
/// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
/// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
/// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
/// the `type` property refers to the post-aggregation data type. For example, we can
/// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
/// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
/// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
/// have exactly the same type as their primary channels (e.g., `x`, `y`).
///
/// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
///
/// Data type based on level of measurement
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Type {
    #[serde(rename = "geojson")]
    Geojson,
    #[serde(rename = "nominal")]
    Nominal,
    #[serde(rename = "ordinal")]
    Ordinal,
    #[serde(rename = "quantitative")]
    Quantitative,
    #[serde(rename = "temporal")]
    Temporal,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RepeatEnum {
    #[serde(rename = "column")]
    Column,
    #[serde(rename = "layer")]
    Layer,
    #[serde(rename = "repeat")]
    Repeat,
    #[serde(rename = "row")]
    Row,
}

/// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
/// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
/// size of the bar and tick should be applied to x or y dimension. - For area, this property
/// determines the orient property of the Vega output. - For line and trail marks, this
/// property determines the sort order of the points in the line if `config.sortLineBy` is
/// not specified. For stacked charts, this is always determined by the orientation of the
/// stack; therefore explicitly specified value will be ignored.
///
/// The direction of the legend, one of `"vertical"` or `"horizontal"`.
///
/// __Default value:__ - For top-/bottom-`orient`ed legends, `"horizontal"` - For
/// left-/right-`orient`ed legends, `"vertical"` - For top/bottom-left/right-`orient`ed
/// legends, `"horizontal"` for gradient legends and `"vertical"` for symbol legends.
///
/// The default direction (`"horizontal"` or `"vertical"`) for gradient legends.
///
/// __Default value:__ `"vertical"`.
///
/// The default direction (`"horizontal"` or `"vertical"`) for symbol legends.
///
/// __Default value:__ `"vertical"`.
///
/// Orientation of the box plot. This is normally automatically determined based on types of
/// fields on x and y channels. However, an explicit `orient` be specified when the
/// orientation is ambiguous.
///
/// __Default value:__ `"vertical"`.
///
/// Orientation of the error bar. This is normally automatically determined, but can be
/// specified when the orientation is ambiguous and cannot be automatically determined.
///
/// Orientation of the error band. This is normally automatically determined, but can be
/// specified when the orientation is ambiguous and cannot be automatically determined.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Orientation {
    #[serde(rename = "horizontal")]
    Horizontal,
    #[serde(rename = "vertical")]
    Vertical,
}

/// Horizontal text alignment of axis tick labels, overriding the default setting for the
/// current axis orientation.
///
/// Horizontal text alignment of axis titles.
///
/// The alignment of the legend label, can be left, center, or right.
///
/// Horizontal text alignment for legend titles.
///
/// __Default value:__ `"left"`.
///
/// The horizontal alignment of the text or ranged marks (area, bar, image, rect, rule). One
/// of `"left"`, `"right"`, `"center"`.
///
/// __Note:__ Expression reference is *not* supported for range marks.
///
/// Horizontal text alignment for title text. One of `"left"`, `"center"`, or `"right"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Align {
    #[serde(rename = "center")]
    Center,
    #[serde(rename = "left")]
    Left,
    #[serde(rename = "right")]
    Right,
}

/// Vertical text baseline of axis tick labels, overriding the default setting for the
/// current axis orientation. One of `"alphabetic"` (default), `"top"`, `"middle"`,
/// `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and `"line-bottom"` values
/// operate similarly to `"top"` and `"bottom"`, but are calculated relative to the
/// *lineHeight* rather than *fontSize* alone.
///
/// Vertical text baseline for axis titles. One of `"alphabetic"` (default), `"top"`,
/// `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
/// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
/// relative to the *lineHeight* rather than *fontSize* alone.
///
/// The position of the baseline of legend label, can be `"top"`, `"middle"`, `"bottom"`, or
/// `"alphabetic"`.
///
/// __Default value:__ `"middle"`.
///
/// Vertical text baseline for legend titles.  One of `"alphabetic"` (default), `"top"`,
/// `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
/// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
/// relative to the *lineHeight* rather than *fontSize* alone.
///
/// __Default value:__ `"top"`.
///
/// For text marks, the vertical text baseline. One of `"alphabetic"` (default), `"top"`,
/// `"middle"`, `"bottom"`, `"line-top"`, `"line-bottom"`, or an expression reference that
/// provides one of the valid values. The `"line-top"` and `"line-bottom"` values operate
/// similarly to `"top"` and `"bottom"`, but are calculated relative to the `lineHeight`
/// rather than `fontSize` alone.
///
/// For range marks, the vertical alignment of the marks. One of `"top"`, `"middle"`,
/// `"bottom"`.
///
/// __Note:__ Expression reference is *not* supported for range marks.
///
/// Vertical text baseline for title and subtitle text. One of `"alphabetic"` (default),
/// `"top"`, `"middle"`, `"bottom"`, `"line-top"`, or `"line-bottom"`. The `"line-top"` and
/// `"line-bottom"` values operate similarly to `"top"` and `"bottom"`, but are calculated
/// relative to the *lineHeight* rather than *fontSize* alone.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Baseline {
    #[serde(rename = "alphabetic")]
    Alphabetic,
    #[serde(rename = "bottom")]
    Bottom,
    #[serde(rename = "line-bottom")]
    LineBottom,
    #[serde(rename = "line-top")]
    LineTop,
    #[serde(rename = "middle")]
    Middle,
    #[serde(rename = "top")]
    Top,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FontWeightEnum {
    #[serde(rename = "bold")]
    Bold,
    #[serde(rename = "bolder")]
    Bolder,
    #[serde(rename = "lighter")]
    Lighter,
    #[serde(rename = "normal")]
    Normal,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LabelOverlapEnum {
    #[serde(rename = "greedy")]
    Greedy,
    #[serde(rename = "parity")]
    Parity,
}

/// The type of the legend. Use `"symbol"` to create a discrete legend and `"gradient"` for a
/// continuous color gradient.
///
/// __Default value:__ `"gradient"` for non-binned quantitative fields and temporal fields;
/// `"symbol"` otherwise.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LegendType {
    #[serde(rename = "gradient")]
    Gradient,
    #[serde(rename = "symbol")]
    Symbol,
}

/// The orientation of the legend, which determines how the legend is positioned within the
/// scene. One of `"left"`, `"right"`, `"top"`, `"bottom"`, `"top-left"`, `"top-right"`,
/// `"bottom-left"`, `"bottom-right"`, `"none"`.
///
/// __Default value:__ `"right"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LegendOrient {
    #[serde(rename = "bottom")]
    Bottom,
    #[serde(rename = "bottom-left")]
    BottomLeft,
    #[serde(rename = "bottom-right")]
    BottomRight,
    #[serde(rename = "left")]
    Left,
    #[serde(rename = "none")]
    None,
    #[serde(rename = "right")]
    Right,
    #[serde(rename = "top")]
    Top,
    #[serde(rename = "top-left")]
    TopLeft,
    #[serde(rename = "top-right")]
    TopRight,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TimeInterval {
    #[serde(rename = "day")]
    Day,
    #[serde(rename = "hour")]
    Hour,
    #[serde(rename = "millisecond")]
    Millisecond,
    #[serde(rename = "minute")]
    Minute,
    #[serde(rename = "month")]
    Month,
    #[serde(rename = "second")]
    Second,
    #[serde(rename = "week")]
    Week,
    #[serde(rename = "year")]
    Year,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TitleAnchorEnum {
    #[serde(rename = "end")]
    End,
    #[serde(rename = "middle")]
    Middle,
    #[serde(rename = "start")]
    Start,
}

/// The orientation of the header label. One of `"top"`, `"bottom"`, `"left"` or `"right"`.
///
/// Shortcut for setting both labelOrient and titleOrient.
///
/// The orientation of the header title. One of `"top"`, `"bottom"`, `"left"` or `"right"`.
///
/// Orientation of the legend title.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Orient {
    #[serde(rename = "bottom")]
    Bottom,
    #[serde(rename = "left")]
    Left,
    #[serde(rename = "right")]
    Right,
    #[serde(rename = "top")]
    Top,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DomainEnum {
    #[serde(rename = "unaggregated")]
    Unaggregated,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ExprRefType {
    #[serde(rename = "cubehelix")]
    Cubehelix,
    #[serde(rename = "cubehelix-long")]
    CubehelixLong,
    #[serde(rename = "rgb")]
    Rgb,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ScaleInterpolateEnum {
    #[serde(rename = "cubehelix")]
    Cubehelix,
    #[serde(rename = "cubehelix-long")]
    CubehelixLong,
    #[serde(rename = "hcl")]
    Hcl,
    #[serde(rename = "hcl-long")]
    HclLong,
    #[serde(rename = "hsl")]
    Hsl,
    #[serde(rename = "hsl-long")]
    HslLong,
    #[serde(rename = "lab")]
    Lab,
    #[serde(rename = "rgb")]
    Rgb,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RangeEnum {
    #[serde(rename = "category")]
    Category,
    #[serde(rename = "diverging")]
    Diverging,
    #[serde(rename = "heatmap")]
    Heatmap,
    #[serde(rename = "height")]
    Height,
    #[serde(rename = "ordinal")]
    Ordinal,
    #[serde(rename = "ramp")]
    Ramp,
    #[serde(rename = "symbol")]
    Symbol,
    #[serde(rename = "width")]
    Width,
}

/// The type of scale. Vega-Lite supports the following categories of scale types:
///
/// 1) [**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).
///
/// 2) [**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.
///
/// 3) [**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).
///
/// __Default value:__ please see the [scale type
/// table](https://vega.github.io/vega-lite/docs/scale.html#type).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ScaleType {
    #[serde(rename = "band")]
    Band,
    #[serde(rename = "bin-ordinal")]
    BinOrdinal,
    #[serde(rename = "identity")]
    Identity,
    #[serde(rename = "linear")]
    Linear,
    #[serde(rename = "log")]
    Log,
    #[serde(rename = "ordinal")]
    Ordinal,
    #[serde(rename = "point")]
    Point,
    #[serde(rename = "pow")]
    Pow,
    #[serde(rename = "quantile")]
    Quantile,
    #[serde(rename = "quantize")]
    Quantize,
    #[serde(rename = "sequential")]
    Sequential,
    #[serde(rename = "sqrt")]
    Sqrt,
    #[serde(rename = "symlog")]
    Symlog,
    #[serde(rename = "threshold")]
    Threshold,
    #[serde(rename = "time")]
    Time,
    #[serde(rename = "utc")]
    Utc,
}

/// The [encoding channel](https://vega.github.io/vega-lite/docs/encoding.html#channels) to
/// sort by (e.g., `"x"`, `"y"`)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SortByChannel {
    #[serde(rename = "color")]
    Color,
    #[serde(rename = "fill")]
    Fill,
    #[serde(rename = "fillOpacity")]
    FillOpacity,
    #[serde(rename = "opacity")]
    Opacity,
    #[serde(rename = "shape")]
    Shape,
    #[serde(rename = "size")]
    Size,
    #[serde(rename = "stroke")]
    Stroke,
    #[serde(rename = "strokeOpacity")]
    StrokeOpacity,
    #[serde(rename = "strokeWidth")]
    StrokeWidth,
    #[serde(rename = "text")]
    Text,
    #[serde(rename = "x")]
    X,
    #[serde(rename = "y")]
    Y,
}

/// The sort order. One of `"ascending"` (default) or `"descending"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SortOrder {
    #[serde(rename = "ascending")]
    Ascending,
    #[serde(rename = "descending")]
    Descending,
}

/// The sort order. One of `"ascending"` (default) or `"descending"`.
///
/// The [encoding channel](https://vega.github.io/vega-lite/docs/encoding.html#channels) to
/// sort by (e.g., `"x"`, `"y"`)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Sort {
    #[serde(rename = "ascending")]
    Ascending,
    #[serde(rename = "color")]
    Color,
    #[serde(rename = "descending")]
    Descending,
    #[serde(rename = "fill")]
    Fill,
    #[serde(rename = "fillOpacity")]
    FillOpacity,
    #[serde(rename = "opacity")]
    Opacity,
    #[serde(rename = "shape")]
    Shape,
    #[serde(rename = "size")]
    Size,
    #[serde(rename = "-color")]
    SortColor,
    #[serde(rename = "-fill")]
    SortFill,
    #[serde(rename = "-fillOpacity")]
    SortFillOpacity,
    #[serde(rename = "-opacity")]
    SortOpacity,
    #[serde(rename = "-shape")]
    SortShape,
    #[serde(rename = "-size")]
    SortSize,
    #[serde(rename = "-stroke")]
    SortStroke,
    #[serde(rename = "-strokeOpacity")]
    SortStrokeOpacity,
    #[serde(rename = "-strokeWidth")]
    SortStrokeWidth,
    #[serde(rename = "-text")]
    SortText,
    #[serde(rename = "-x")]
    SortX,
    #[serde(rename = "-y")]
    SortY,
    #[serde(rename = "stroke")]
    Stroke,
    #[serde(rename = "strokeOpacity")]
    StrokeOpacity,
    #[serde(rename = "strokeWidth")]
    StrokeWidth,
    #[serde(rename = "text")]
    Text,
    #[serde(rename = "x")]
    X,
    #[serde(rename = "y")]
    Y,
}

/// The type of gradient. Use `"linear"` for a linear gradient.
///
/// The type of gradient. Use `"radial"` for a radial gradient.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Gradient {
    #[serde(rename = "linear")]
    Linear,
    #[serde(rename = "radial")]
    Radial,
}

/// The type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`) for
/// the encoded field or constant value (`datum`). It can also be a `"geojson"` type for
/// encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html).
///
/// Vega-Lite automatically infers data types in many cases as discussed below. However, type
/// is required for a field if: (1) the field is not nominal and the field encoding has no
/// specified `aggregate` (except `argmin` and `argmax`), `bin`, scale type, custom `sort`
/// order, nor `timeUnit` or (2) if you wish to use an ordinal scale for a field with `bin`
/// or `timeUnit`.
///
/// __Default value:__
///
/// 1) For a data `field`, `"nominal"` is the default data type unless the field encoding has
/// `aggregate`, `channel`, `bin`, scale type, `sort`, or `timeUnit` that satisfies the
/// following criteria: - `"quantitative"` is the default type if (1) the encoded field
/// contains `bin` or `aggregate` except `"argmin"` and `"argmax"`, (2) the encoding channel
/// is `latitude` or `longitude` channel or (3) if the specified scale type is [a
/// quantitative scale](https://vega.github.io/vega-lite/docs/scale.html#type). -
/// `"temporal"` is the default type if (1) the encoded field contains `timeUnit` or (2) the
/// specified scale type is a time or utc scale - `ordinal""` is the default type if (1) the
/// encoded field contains a [custom `sort`
/// order](https://vega.github.io/vega-lite/docs/sort.html#specifying-custom-sort-order), (2)
/// the specified scale type is an ordinal/point/band scale, or (3) the encoding channel is
/// `order`.
///
/// 2) For a constant value in data domain (`datum`): - `"quantitative"` if the datum is a
/// number - `"nominal"` if the datum is a string - `"temporal"` if the datum is [a date time
/// object](https://vega.github.io/vega-lite/docs/datetime.html)
///
/// __Note:__ - Data `type` describes the semantics of the data rather than the primitive
/// data types (number, string, etc.). The same primitive data type can have different types
/// of measurement. For example, numeric data can represent quantitative, ordinal, or nominal
/// data. - Data values for a temporal field can be either a date-time string (e.g.,
/// `"2015-03-07 12:32:17"`, `"17:01"`, `"2015-03-16"`. `"2015"`) or a timestamp number
/// (e.g., `1552199579097`). - When using with
/// [`bin`](https://vega.github.io/vega-lite/docs/bin.html), the `type` property can be
/// either `"quantitative"` (for using a linear bin scale) or [`"ordinal"` (for using an
/// ordinal bin scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin). - When
/// using with [`timeUnit`](https://vega.github.io/vega-lite/docs/timeunit.html), the `type`
/// property can be either `"temporal"` (default, for using a temporal scale) or [`"ordinal"`
/// (for using an ordinal scale)](https://vega.github.io/vega-lite/docs/type.html#cast-bin).
/// - When using with [`aggregate`](https://vega.github.io/vega-lite/docs/aggregate.html),
/// the `type` property refers to the post-aggregation data type. For example, we can
/// calculate count `distinct` of a categorical field `"cat"` using `{"aggregate":
/// "distinct", "field": "cat"}`. The `"type"` of the aggregate output is `"quantitative"`. -
/// Secondary channels (e.g., `x2`, `y2`, `xError`, `yError`) do not have `type` as they must
/// have exactly the same type as their primary channels (e.g., `x`, `y`).
///
/// __See also:__ [`type`](https://vega.github.io/vega-lite/docs/type.html) documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StandardType {
    #[serde(rename = "nominal")]
    Nominal,
    #[serde(rename = "ordinal")]
    Ordinal,
    #[serde(rename = "quantitative")]
    Quantitative,
    #[serde(rename = "temporal")]
    Temporal,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BinEnum {
    #[serde(rename = "binned")]
    Binned,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ValueEnum {
    #[serde(rename = "height")]
    Height,
    #[serde(rename = "width")]
    Width,
}

/// Mode for stacking marks. One of `"zero"` (default), `"center"`, or `"normalize"`. The
/// `"zero"` offset will stack starting at `0`. The `"center"` offset will center the stacks.
/// The `"normalize"` offset will compute percentage values for each stack point, with output
/// values in the range `[0,1]`.
///
/// __Default value:__ `"zero"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StackOffset {
    #[serde(rename = "center")]
    Center,
    #[serde(rename = "normalize")]
    Normalize,
    #[serde(rename = "zero")]
    Zero,
}

/// The stroke cap for line ending style. One of `"butt"`, `"round"`, or `"square"`.
///
/// __Default value:__ `"butt"`
///
/// The stroke cap for the domain line's ending style. One of `"butt"`, `"round"` or
/// `"square"`.
///
/// __Default value:__ `"butt"`
///
/// The stroke cap for grid lines' ending style. One of `"butt"`, `"round"` or `"square"`.
///
/// __Default value:__ `"butt"`
///
/// The stroke cap for the tick lines' ending style. One of `"butt"`, `"round"` or
/// `"square"`.
///
/// __Default value:__ `"butt"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StrokeCap {
    #[serde(rename = "butt")]
    Butt,
    #[serde(rename = "round")]
    Round,
    #[serde(rename = "square")]
    Square,
}

/// For band scales, indicates if ticks and grid lines should be placed at the `"center"` of
/// a band (default) or at the band `"extent"`s to indicate intervals
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TickBandEnum {
    #[serde(rename = "center")]
    Center,
    #[serde(rename = "extent")]
    Extent,
}

/// The imputation method to use for the field value of imputed data objects. One of
/// `"value"`, `"mean"`, `"median"`, `"max"` or `"min"`.
///
/// __Default value:__  `"value"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ImputeParamsMethod {
    #[serde(rename = "max")]
    Max,
    #[serde(rename = "mean")]
    Mean,
    #[serde(rename = "median")]
    Median,
    #[serde(rename = "min")]
    Min,
    #[serde(rename = "value")]
    Value,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum HeightEnum {
    #[serde(rename = "container")]
    Container,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BlendEnum {
    #[serde(rename = "color")]
    Color,
    #[serde(rename = "color-burn")]
    ColorBurn,
    #[serde(rename = "color-dodge")]
    ColorDodge,
    #[serde(rename = "darken")]
    Darken,
    #[serde(rename = "difference")]
    Difference,
    #[serde(rename = "exclusion")]
    Exclusion,
    #[serde(rename = "hard-light")]
    HardLight,
    #[serde(rename = "hue")]
    Hue,
    #[serde(rename = "lighten")]
    Lighten,
    #[serde(rename = "luminosity")]
    Luminosity,
    #[serde(rename = "multiply")]
    Multiply,
    #[serde(rename = "overlay")]
    Overlay,
    #[serde(rename = "saturation")]
    Saturation,
    #[serde(rename = "screen")]
    Screen,
    #[serde(rename = "soft-light")]
    SoftLight,
}

/// The mouse cursor used over the mark. Any valid [CSS cursor
/// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
///
/// The mouse cursor used over the interval mark. Any valid [CSS cursor
/// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
///
/// The mouse cursor used over the view. Any valid [CSS cursor
/// type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Cursor {
    #[serde(rename = "alias")]
    Alias,
    #[serde(rename = "all-scroll")]
    AllScroll,
    #[serde(rename = "auto")]
    Auto,
    #[serde(rename = "cell")]
    Cell,
    #[serde(rename = "col-resize")]
    ColResize,
    #[serde(rename = "context-menu")]
    ContextMenu,
    #[serde(rename = "copy")]
    Copy,
    #[serde(rename = "crosshair")]
    Crosshair,
    #[serde(rename = "default")]
    Default,
    #[serde(rename = "e-resize")]
    EResize,
    #[serde(rename = "ew-resize")]
    EwResize,
    #[serde(rename = "grab")]
    Grab,
    #[serde(rename = "grabbing")]
    Grabbing,
    #[serde(rename = "help")]
    Help,
    #[serde(rename = "move")]
    Move,
    #[serde(rename = "n-resize")]
    NResize,
    #[serde(rename = "ne-resize")]
    NeResize,
    #[serde(rename = "nesw-resize")]
    NeswResize,
    #[serde(rename = "no-drop")]
    NoDrop,
    #[serde(rename = "none")]
    None,
    #[serde(rename = "not-allowed")]
    NotAllowed,
    #[serde(rename = "ns-resize")]
    NsResize,
    #[serde(rename = "nw-resize")]
    NwResize,
    #[serde(rename = "nwse-resize")]
    NwseResize,
    #[serde(rename = "pointer")]
    Pointer,
    #[serde(rename = "progress")]
    Progress,
    #[serde(rename = "row-resize")]
    RowResize,
    #[serde(rename = "s-resize")]
    SResize,
    #[serde(rename = "se-resize")]
    SeResize,
    #[serde(rename = "sw-resize")]
    SwResize,
    #[serde(rename = "text")]
    Text,
    #[serde(rename = "vertical-text")]
    VerticalText,
    #[serde(rename = "w-resize")]
    WResize,
    #[serde(rename = "wait")]
    Wait,
    #[serde(rename = "zoom-in")]
    ZoomIn,
    #[serde(rename = "zoom-out")]
    ZoomOut,
}

/// The direction of the text. One of `"ltr"` (left-to-right) or `"rtl"` (right-to-left).
/// This property determines on which side is truncated in response to the limit parameter.
///
/// __Default value:__ `"ltr"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TextDirection {
    #[serde(rename = "ltr")]
    Ltr,
    #[serde(rename = "rtl")]
    Rtl,
}

/// The line interpolation method to use for line and area marks. One of the following: -
/// `"linear"`: piecewise linear segments, as in a polyline. - `"linear-closed"`: close the
/// linear segments to form a polygon. - `"step"`: alternate between horizontal and vertical
/// segments, as in a step function. - `"step-before"`: alternate between vertical and
/// horizontal segments, as in a step function. - `"step-after"`: alternate between
/// horizontal and vertical segments, as in a step function. - `"basis"`: a B-spline, with
/// control point duplication on the ends. - `"basis-open"`: an open B-spline; may not
/// intersect the start or end. - `"basis-closed"`: a closed B-spline, as in a loop. -
/// `"cardinal"`: a Cardinal spline, with control point duplication on the ends. -
/// `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will
/// intersect other control points. - `"cardinal-closed"`: a closed Cardinal spline, as in a
/// loop. - `"bundle"`: equivalent to basis, except the tension parameter is used to
/// straighten the spline. - `"monotone"`: cubic interpolation that preserves monotonicity in
/// y.
///
/// The line interpolation method for the error band. One of the following: - `"linear"`:
/// piecewise linear segments, as in a polyline. - `"linear-closed"`: close the linear
/// segments to form a polygon. - `"step"`: a piecewise constant function (a step function)
/// consisting of alternating horizontal and vertical lines. The y-value changes at the
/// midpoint of each pair of adjacent x-values. - `"step-before"`: a piecewise constant
/// function (a step function) consisting of alternating horizontal and vertical lines. The
/// y-value changes before the x-value. - `"step-after"`: a piecewise constant function (a
/// step function) consisting of alternating horizontal and vertical lines. The y-value
/// changes after the x-value. - `"basis"`: a B-spline, with control point duplication on the
/// ends. - `"basis-open"`: an open B-spline; may not intersect the start or end. -
/// `"basis-closed"`: a closed B-spline, as in a loop. - `"cardinal"`: a Cardinal spline,
/// with control point duplication on the ends. - `"cardinal-open"`: an open Cardinal spline;
/// may not intersect the start or end, but will intersect other control points. -
/// `"cardinal-closed"`: a closed Cardinal spline, as in a loop. - `"bundle"`: equivalent to
/// basis, except the tension parameter is used to straighten the spline. - `"monotone"`:
/// cubic interpolation that preserves monotonicity in y.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Interpolate {
    #[serde(rename = "basis")]
    Basis,
    #[serde(rename = "basis-closed")]
    BasisClosed,
    #[serde(rename = "basis-open")]
    BasisOpen,
    #[serde(rename = "bundle")]
    Bundle,
    #[serde(rename = "cardinal")]
    Cardinal,
    #[serde(rename = "cardinal-closed")]
    CardinalClosed,
    #[serde(rename = "cardinal-open")]
    CardinalOpen,
    #[serde(rename = "catmull-rom")]
    CatmullRom,
    #[serde(rename = "linear")]
    Linear,
    #[serde(rename = "linear-closed")]
    LinearClosed,
    #[serde(rename = "monotone")]
    Monotone,
    #[serde(rename = "natural")]
    Natural,
    #[serde(rename = "step")]
    Step,
    #[serde(rename = "step-after")]
    StepAfter,
    #[serde(rename = "step-before")]
    StepBefore,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Invalid {
    #[serde(rename = "filter")]
    Filter,
}

/// The stroke line join method. One of `"miter"`, `"round"` or `"bevel"`.
///
/// __Default value:__ `"miter"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StrokeJoin {
    #[serde(rename = "bevel")]
    Bevel,
    #[serde(rename = "miter")]
    Miter,
    #[serde(rename = "round")]
    Round,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Content {
    #[serde(rename = "data")]
    Data,
    #[serde(rename = "encoding")]
    Encoding,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum XEnum {
    #[serde(rename = "width")]
    Width,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum YEnum {
    #[serde(rename = "height")]
    Height,
}

/// The mark type. This could a primitive mark type (one of `"bar"`, `"circle"`, `"square"`,
/// `"tick"`, `"line"`, `"area"`, `"point"`, `"geoshape"`, `"rule"`, and `"text"`) or a
/// composite mark type (`"boxplot"`, `"errorband"`, `"errorbar"`).
///
/// All types of primitive marks.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Mark {
    #[serde(rename = "arc")]
    Arc,
    #[serde(rename = "area")]
    Area,
    #[serde(rename = "bar")]
    Bar,
    #[serde(rename = "boxplot")]
    Boxplot,
    #[serde(rename = "circle")]
    Circle,
    #[serde(rename = "errorband")]
    Errorband,
    #[serde(rename = "errorbar")]
    Errorbar,
    #[serde(rename = "geoshape")]
    Geoshape,
    #[serde(rename = "image")]
    Image,
    #[serde(rename = "line")]
    Line,
    #[serde(rename = "point")]
    Point,
    #[serde(rename = "rect")]
    Rect,
    #[serde(rename = "rule")]
    Rule,
    #[serde(rename = "square")]
    Square,
    #[serde(rename = "text")]
    Text,
    #[serde(rename = "tick")]
    Tick,
    #[serde(rename = "trail")]
    Trail,
}

/// The extent of the band. Available options include: - `"ci"`: Extend the band to the
/// confidence interval of the mean. - `"stderr"`: The size of band are set to the value of
/// standard error, extending from the mean. - `"stdev"`: The size of band are set to the
/// value of standard deviation, extending from the mean. - `"iqr"`: Extend the band to the
/// q1 and q3.
///
/// __Default value:__ `"stderr"`.
///
/// The extent of the rule. Available options include: - `"ci"`: Extend the rule to the
/// confidence interval of the mean. - `"stderr"`: The size of rule are set to the value of
/// standard error, extending from the mean. - `"stdev"`: The size of rule are set to the
/// value of standard deviation, extending from the mean. - `"iqr"`: Extend the rule to the
/// q1 and q3.
///
/// __Default value:__ `"stderr"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ExtentExtent {
    #[serde(rename = "ci")]
    Ci,
    #[serde(rename = "iqr")]
    Iqr,
    #[serde(rename = "min-max")]
    MinMax,
    #[serde(rename = "stderr")]
    Stderr,
    #[serde(rename = "stdev")]
    Stdev,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PointEnum {
    #[serde(rename = "transparent")]
    Transparent,
}

/// The cartographic projection to use. This value is case-insensitive, for example
/// `"albers"` and `"Albers"` indicate the same projection type. You can find all valid
/// projection types [in the
/// documentation](https://vega.github.io/vega-lite/docs/projection.html#projection-types).
///
/// __Default value:__ `mercator`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ProjectionType {
    #[serde(rename = "albers")]
    Albers,
    #[serde(rename = "albersUsa")]
    AlbersUsa,
    #[serde(rename = "azimuthalEqualArea")]
    AzimuthalEqualArea,
    #[serde(rename = "azimuthalEquidistant")]
    AzimuthalEquidistant,
    #[serde(rename = "conicConformal")]
    ConicConformal,
    #[serde(rename = "conicEqualArea")]
    ConicEqualArea,
    #[serde(rename = "conicEquidistant")]
    ConicEquidistant,
    #[serde(rename = "equalEarth")]
    EqualEarth,
    #[serde(rename = "equirectangular")]
    Equirectangular,
    #[serde(rename = "gnomonic")]
    Gnomonic,
    #[serde(rename = "identity")]
    Identity,
    #[serde(rename = "mercator")]
    Mercator,
    #[serde(rename = "naturalEarth1")]
    NaturalEarth1,
    #[serde(rename = "orthographic")]
    Orthographic,
    #[serde(rename = "stereographic")]
    Stereographic,
    #[serde(rename = "transverseMercator")]
    TransverseMercator,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ResolveMode {
    #[serde(rename = "independent")]
    Independent,
    #[serde(rename = "shared")]
    Shared,
}

/// Establishes a two-way binding between the interval selection and the scales used within
/// the same view. This allows a user to interactively pan and zoom the view.
///
/// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PurpleLegendBinding {
    #[serde(rename = "legend")]
    Legend,
    #[serde(rename = "scales")]
    Scales,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MarkType {
    #[serde(rename = "arc")]
    Arc,
    #[serde(rename = "area")]
    Area,
    #[serde(rename = "group")]
    Group,
    #[serde(rename = "image")]
    Image,
    #[serde(rename = "line")]
    Line,
    #[serde(rename = "path")]
    Path,
    #[serde(rename = "rect")]
    Rect,
    #[serde(rename = "rule")]
    Rule,
    #[serde(rename = "shape")]
    Shape,
    #[serde(rename = "symbol")]
    Symbol,
    #[serde(rename = "text")]
    Text,
    #[serde(rename = "trail")]
    Trail,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Source {
    #[serde(rename = "scope")]
    Scope,
    #[serde(rename = "view")]
    View,
    #[serde(rename = "window")]
    Window,
}

/// By default, `all` data values are considered to lie within an empty selection. When set
/// to `none`, empty selections contain no data values.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Empty {
    #[serde(rename = "all")]
    All,
    #[serde(rename = "none")]
    None,
}

/// With layered and multi-view displays, a strategy that determines how selections' data
/// queries are resolved when applied in a filter transform, conditional encoding rule, or
/// scale domain.
///
/// __See also:__ [`resolve`](https://vega.github.io/vega-lite/docs/selection-resolve.html)
/// documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SelectionResolution {
    #[serde(rename = "global")]
    Global,
    #[serde(rename = "intersect")]
    Intersect,
    #[serde(rename = "union")]
    Union,
}

/// Determines the default event processing and data query for the selection. Vega-Lite
/// currently supports three selection types:
///
/// - `"single"` -- to select a single discrete data value on `click`. - `"multi"` -- to
/// select multiple discrete data value; the first value is selected on `click` and
/// additional values toggled on shift-`click`. - `"interval"` -- to select a continuous
/// range of data values on `drag`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SelectionDefType {
    #[serde(rename = "interval")]
    Interval,
    #[serde(rename = "multi")]
    Multi,
    #[serde(rename = "single")]
    Single,
}

/// Default title orientation (`"top"`, `"bottom"`, `"left"`, or `"right"`)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TitleOrient {
    #[serde(rename = "bottom")]
    Bottom,
    #[serde(rename = "left")]
    Left,
    #[serde(rename = "none")]
    None,
    #[serde(rename = "right")]
    Right,
    #[serde(rename = "top")]
    Top,
}

/// The aggregation operation to apply to the fields (e.g., `"sum"`, `"average"`, or
/// `"count"`). See the [full list of supported aggregation
/// operations](https://vega.github.io/vega-lite/docs/aggregate.html#ops) for more
/// information.
///
/// The aggregation operation to apply (e.g., `"sum"`, `"average"` or `"count"`). See the
/// list of all supported operations
/// [here](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AggregateOp {
    #[serde(rename = "argmax")]
    Argmax,
    #[serde(rename = "argmin")]
    Argmin,
    #[serde(rename = "average")]
    Average,
    #[serde(rename = "ci0")]
    Ci0,
    #[serde(rename = "ci1")]
    Ci1,
    #[serde(rename = "count")]
    Count,
    #[serde(rename = "distinct")]
    Distinct,
    #[serde(rename = "max")]
    Max,
    #[serde(rename = "mean")]
    Mean,
    #[serde(rename = "median")]
    Median,
    #[serde(rename = "min")]
    Min,
    #[serde(rename = "missing")]
    Missing,
    #[serde(rename = "product")]
    Product,
    #[serde(rename = "q1")]
    Q1,
    #[serde(rename = "q3")]
    Q3,
    #[serde(rename = "stderr")]
    Stderr,
    #[serde(rename = "stdev")]
    Stdev,
    #[serde(rename = "stdevp")]
    Stdevp,
    #[serde(rename = "sum")]
    Sum,
    #[serde(rename = "valid")]
    Valid,
    #[serde(rename = "values")]
    Values,
    #[serde(rename = "variance")]
    Variance,
    #[serde(rename = "variancep")]
    Variancep,
}

/// The imputation method to use for the field value of imputed data objects. One of
/// `"value"`, `"mean"`, `"median"`, `"max"` or `"min"`.
///
/// __Default value:__  `"value"`
///
/// The functional form of the regression model. One of `"linear"`, `"log"`, `"exp"`,
/// `"pow"`, `"quad"`, or `"poly"`.
///
/// __Default value:__ `"linear"`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TransformMethod {
    #[serde(rename = "exp")]
    Exp,
    #[serde(rename = "linear")]
    Linear,
    #[serde(rename = "log")]
    Log,
    #[serde(rename = "max")]
    Max,
    #[serde(rename = "mean")]
    Mean,
    #[serde(rename = "median")]
    Median,
    #[serde(rename = "min")]
    Min,
    #[serde(rename = "poly")]
    Poly,
    #[serde(rename = "pow")]
    Pow,
    #[serde(rename = "quad")]
    Quad,
    #[serde(rename = "value")]
    Value,
}

/// The window or aggregation operation to apply within a window (e.g., `"rank"`, `"lead"`,
/// `"sum"`, `"average"` or `"count"`). See the list of all supported operations
/// [here](https://vega.github.io/vega-lite/docs/window.html#ops).
///
/// The aggregation operation to apply to the fields (e.g., `"sum"`, `"average"`, or
/// `"count"`). See the [full list of supported aggregation
/// operations](https://vega.github.io/vega-lite/docs/aggregate.html#ops) for more
/// information.
///
/// The aggregation operation to apply (e.g., `"sum"`, `"average"` or `"count"`). See the
/// list of all supported operations
/// [here](https://vega.github.io/vega-lite/docs/aggregate.html#ops).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Op {
    #[serde(rename = "argmax")]
    Argmax,
    #[serde(rename = "argmin")]
    Argmin,
    #[serde(rename = "average")]
    Average,
    #[serde(rename = "ci0")]
    Ci0,
    #[serde(rename = "ci1")]
    Ci1,
    #[serde(rename = "count")]
    Count,
    #[serde(rename = "cume_dist")]
    CumeDist,
    #[serde(rename = "dense_rank")]
    DenseRank,
    #[serde(rename = "distinct")]
    Distinct,
    #[serde(rename = "first_value")]
    FirstValue,
    #[serde(rename = "lag")]
    Lag,
    #[serde(rename = "last_value")]
    LastValue,
    #[serde(rename = "lead")]
    Lead,
    #[serde(rename = "max")]
    Max,
    #[serde(rename = "mean")]
    Mean,
    #[serde(rename = "median")]
    Median,
    #[serde(rename = "min")]
    Min,
    #[serde(rename = "missing")]
    Missing,
    #[serde(rename = "nth_value")]
    NthValue,
    #[serde(rename = "ntile")]
    Ntile,
    #[serde(rename = "percent_rank")]
    PercentRank,
    #[serde(rename = "product")]
    Product,
    #[serde(rename = "q1")]
    Q1,
    #[serde(rename = "q3")]
    Q3,
    #[serde(rename = "rank")]
    Rank,
    #[serde(rename = "row_number")]
    RowNumber,
    #[serde(rename = "stderr")]
    Stderr,
    #[serde(rename = "stdev")]
    Stdev,
    #[serde(rename = "stdevp")]
    Stdevp,
    #[serde(rename = "sum")]
    Sum,
    #[serde(rename = "valid")]
    Valid,
    #[serde(rename = "values")]
    Values,
    #[serde(rename = "variance")]
    Variance,
    #[serde(rename = "variancep")]
    Variancep,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ExtentEnum {
    #[serde(rename = "min-max")]
    MinMax,
}

/// The extent of the band. Available options include: - `"ci"`: Extend the band to the
/// confidence interval of the mean. - `"stderr"`: The size of band are set to the value of
/// standard error, extending from the mean. - `"stdev"`: The size of band are set to the
/// value of standard deviation, extending from the mean. - `"iqr"`: Extend the band to the
/// q1 and q3.
///
/// __Default value:__ `"stderr"`.
///
/// The extent of the rule. Available options include: - `"ci"`: Extend the rule to the
/// confidence interval of the mean. - `"stderr"`: The size of rule are set to the value of
/// standard error, extending from the mean. - `"stdev"`: The size of rule are set to the
/// value of standard deviation, extending from the mean. - `"iqr"`: Extend the rule to the
/// q1 and q3.
///
/// __Default value:__ `"stderr"`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ErrorbandExtent {
    #[serde(rename = "ci")]
    Ci,
    #[serde(rename = "iqr")]
    Iqr,
    #[serde(rename = "stderr")]
    Stderr,
    #[serde(rename = "stdev")]
    Stdev,
}

/// Defines how Vega-Lite generates title for fields. There are three possible styles: -
/// `"verbal"` (Default) - displays function in a verbal style (e.g., "Sum of field",
/// "Year-month of date", "field (binned)"). - `"function"` - displays function using
/// parentheses and capitalized texts (e.g., "SUM(field)", "YEARMONTH(date)", "BIN(field)").
/// - `"plain"` - displays only the field name without functions (e.g., "field", "date",
/// "field").
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FieldTitle {
    #[serde(rename = "functional")]
    Functional,
    #[serde(rename = "plain")]
    Plain,
    #[serde(rename = "verbal")]
    Verbal,
}

/// Establishes a two-way binding between the interval selection and the scales used within
/// the same view. This allows a user to interactively pan and zoom the view.
///
/// __See also:__ [`bind`](https://vega.github.io/vega-lite/docs/bind.html) documentation.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Bind {
    #[serde(rename = "scales")]
    Scales,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LegendBindingEnum {
    #[serde(rename = "legend")]
    Legend,
}

/// The orientation of a non-stacked bar, tick, area, and line charts. The value is either
/// horizontal (default) or vertical. - For bar, rule and tick, this determines whether the
/// size of the bar and tick should be applied to x or y dimension. - For area, this property
/// determines the orient property of the Vega output. - For line and trail marks, this
/// property determines the sort order of the points in the line if `config.sortLineBy` is
/// not specified. For stacked charts, this is always determined by the orientation of the
/// stack; therefore explicitly specified value will be ignored.
///
/// The direction of the legend, one of `"vertical"` or `"horizontal"`.
///
/// __Default value:__ - For top-/bottom-`orient`ed legends, `"horizontal"` - For
/// left-/right-`orient`ed legends, `"vertical"` - For top/bottom-left/right-`orient`ed
/// legends, `"horizontal"` for gradient legends and `"vertical"` for symbol legends.
///
/// The default direction (`"horizontal"` or `"vertical"`) for gradient legends.
///
/// __Default value:__ `"vertical"`.
///
/// The default direction (`"horizontal"` or `"vertical"`) for symbol legends.
///
/// __Default value:__ `"vertical"`.
///
/// Orientation of the box plot. This is normally automatically determined based on types of
/// fields on x and y channels. However, an explicit `orient` be specified when the
/// orientation is ambiguous.
///
/// __Default value:__ `"vertical"`.
///
/// Orientation of the error bar. This is normally automatically determined, but can be
/// specified when the orientation is ambiguous and cannot be automatically determined.
///
/// Orientation of the error band. This is normally automatically determined, but can be
/// specified when the orientation is ambiguous and cannot be automatically determined.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AxisOrient {
    #[serde(rename = "bottom")]
    Bottom,
    #[serde(rename = "horizontal")]
    Horizontal,
    #[serde(rename = "left")]
    Left,
    #[serde(rename = "right")]
    Right,
    #[serde(rename = "top")]
    Top,
    #[serde(rename = "vertical")]
    Vertical,
}