workspaces / iac-f63ed22f4e50Markdown ↓

{ "childOrderSignificant" : true, "components" : [ { "attributes" : [ { "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.", "name" : "id", "required" : true, "valueSchema" : { "type" : "string" }, "valueType" : "string" }, { "description" : "Heading shown to users.", "name" : "title", "required" : true, "valueSchema" : { "type" : "string" }, "valueType" : "string" }, { "description" : "The audience the workspace is for, such as Sales or Operations.", "name" : "role", "required" : true, "valueSchema" : { "type" : "string" }, "valueType" : "string" }, { "allowedValues" : [ "urn:cococo:dataxml" ], "description" : "Binds the t: prefix used for data bindings. Any prefix bound to urn:cococo:dataxml works.", "name" : "xmlns:t", "required" : false, "valueSchema" : { "enum" : [ "urn:cococo:dataxml" ], "type" : "string" }, "valueType" : "string" }, { "description" : "Space-separated business domains the workspace relates to. They are hints and grant no permissions.", "name" : "domains", "required" : false, "valueSchema" : { "type" : "string" }, "valueType" : "string" } ], "category" : "document", "children" : [ { "contracts" : [ "state" ], "minimum" : 0 }, { "contracts" : [ "handler" ], "minimum" : 0 }, { "contracts" : [ "data-source" ], "minimum" : 0 }, { "contracts" : [ "row", "column", "master-detail", "panel", "metric-panel", "record-browser", "record-editor", "related-records" ], "minimum" : 0 } ], "constraints" : [

  ],
  "id" : "workspace",
  "lowersTo" : [

  ],
  "summary" : "The root element of a Workspace: a screen of panels that read and edit business data. It declares shared state, server Lua handlers, data sources and the layout.",
  "tag" : "workspace",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Space-separated query variable names that must have a value before the panel loads. An empty value loads immediately; leaving it out waits until every top-level variable has a value.",
      "name" : "wait-for",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "query-graphql",
        "query-lua",
        "query-magicquery"
      ],
      "maximum" : 1,
      "minimum" : 1
    }
  ],
  "constraints" : [

  ],
  "id" : "data-source",
  "lowersTo" : [
    "panel"
  ],
  "summary" : "Loads data for lookups without showing a panel, for example the options of a relationship picker. It loads and refreshes like a panel. It does not hide the data from anyone allowed to open the workspace.",
  "tag" : "data-source",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Name of the state, used wherever it is read or written.",
      "name" : "name",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Initial value, as JSON. Text needs JSON quotes, for example `\"open\"`.",
      "name" : "default",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "state",
  "lowersTo" : [

  ],
  "summary" : "Declares a piece of shared state, such as the selected record or a filter value, with its initial JSON value. Queries, lists, filters and forms read and write it by name.",
  "tag" : "state",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Name of the Lua function, exported as `exports.<name>`.",
      "name" : "name",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "read",
        "action"
      ],
      "description" : "`read` to supply panel data, `action` to perform writes.",
      "name" : "mode",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "read",
          "action"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "handler-input"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "handler-output"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "handler-constraint"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "handler",
  "lowersTo" : [

  ],
  "summary" : "Declares a server Lua function the workspace can call: `read` handlers supply panel data, `action` handlers perform writes. Omit `input` and `output` to derive the contract from the typed Lua function.",
  "tag" : "handler",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Path of the handler input to restrict.",
      "name" : "path",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "true"
      ],
      "description" : "Set to `true` to require a value for this Lua handler input. The server enforces it on every call.",
      "name" : "required",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    },
    {
      "description" : "Minimum text length, enforced by the server and the form.",
      "name" : "min-length",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    },
    {
      "description" : "Maximum text length, enforced by the server and the form.",
      "name" : "max-length",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    },
    {
      "description" : "Lowest allowed number, inclusive, enforced by the server and the form.",
      "name" : "minimum",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "finite-number"
    },
    {
      "description" : "Highest allowed number, inclusive, enforced by the server and the form.",
      "name" : "maximum",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "finite-number"
    },
    {
      "description" : "Minimum number of list items, enforced by the server and the form.",
      "name" : "min-items",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    },
    {
      "description" : "Maximum number of list items, enforced by the server and the form.",
      "name" : "max-items",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "handler-constraint",
  "lowersTo" : [

  ],
  "summary" : "Adds an input restriction to a handler. The server enforces it on every call, including direct API calls. Use it for arguments without a visible form field.",
  "tag" : "field",
  "textAllowed" : false
},
{
  "attributes" : [

  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "handler-input",
  "lowersTo" : [

  ],
  "summary" : "An explicit handler input schema, using a schema root in urn:cococo:json-schema:1 or legacy JSON text/CDATA. Prefer typed Lua inputs; if you use this, supply an output schema too.",
  "tag" : "input",
  "textAllowed" : true
},
{
  "attributes" : [

  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "handler-output",
  "lowersTo" : [

  ],
  "summary" : "An explicit handler output schema, using a schema root in urn:cococo:json-schema:1 or legacy JSON text/CDATA. Supply it together with an input schema, or not at all.",
  "tag" : "output",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "layout",
  "children" : [
    {
      "contracts" : [
        "row",
        "column",
        "master-detail",
        "panel",
        "metric-panel",
        "record-browser",
        "record-editor",
        "related-records"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "row",
  "lowersTo" : [
    "stack"
  ],
  "summary" : "Places its children side by side. Each child's `weight` sets its share of the width.",
  "tag" : "row",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "layout",
  "children" : [
    {
      "contracts" : [
        "row",
        "column",
        "master-detail",
        "panel",
        "metric-panel",
        "record-browser",
        "record-editor",
        "related-records"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "column",
  "lowersTo" : [
    "stack"
  ],
  "summary" : "Stacks its children vertically. Each child's `weight` sets its share of the space.",
  "tag" : "column",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "layout",
  "children" : [
    {
      "contracts" : [
        "row",
        "column",
        "master-detail",
        "panel",
        "metric-panel",
        "record-browser",
        "record-editor",
        "related-records"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Needs exactly two layout children."
  ],
  "id" : "master-detail",
  "lowersTo" : [
    "stack"
  ],
  "summary" : "A two-region layout, typically a list of records on one side and the selected record on the other.",
  "tag" : "master-detail",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    },
    {
      "description" : "Space-separated query variable names that must have a value before the panel loads. An empty value loads immediately; leaving it out waits until every top-level variable has a value.",
      "name" : "wait-for",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "layout",
  "children" : [
    {
      "contracts" : [
        "query-graphql",
        "query-lua",
        "query-magicquery"
      ],
      "maximum" : 1,
      "minimum" : 1
    },
    {
      "contracts" : [
        "pager",
        "filter",
        "record-list",
        "record-detail",
        "record-table",
        "kpi-summary",
        "trend",
        "text",
        "form",
        "action-form",
        "block-ActionGroup",
        "block-AiInsight",
        "block-AlertBlock",
        "block-Checklist",
        "block-DataList",
        "block-DataTable",
        "block-FilterBar",
        "block-Form",
        "block-FormBlock",
        "block-GaugeChart",
        "block-Journey",
        "block-MapBlock",
        "block-MediaPreview",
        "block-MetricGroup",
        "block-Pager",
        "block-ProgressBar",
        "block-RecordCard",
        "block-RelationGraph",
        "block-SparklineChart",
        "block-StateInput",
        "block-SwatchSet",
        "block-TabSwitch",
        "block-Text",
        "block-Timeline"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "panel",
  "lowersTo" : [
    "panel"
  ],
  "summary" : "A titled region that runs one query and displays the result with the blocks inside it. Most workspace content lives in panels.",
  "tag" : "panel",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "graphql"
      ],
      "description" : "Always `graphql` for this query.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "graphql"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "state-arg"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "query-graphql",
  "lowersTo" : [

  ],
  "summary" : "Loads a panel's data with a GraphQL query written inside the element; CDATA keeps it readable. Arguments pass declared state to the query's variables.",
  "tag" : "query",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "lua"
      ],
      "description" : "Always `lua` for this query.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "lua"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name of a handler declared in this workspace.",
      "name" : "handler",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "state-arg"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "query-lua",
  "lowersTo" : [

  ],
  "summary" : "Loads a panel's data by calling a declared `read` handler in the workspace's server Lua.",
  "tag" : "query",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "magicquery"
      ],
      "description" : "Always `magicquery` for this query.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "magicquery"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The MagicQuery noun to load, as listed by `listMagicQueries`.",
      "name" : "noun",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Identifier of a single record to load, written literally.",
      "name" : "identifier",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key holding the identifier of a single record to load.",
      "name" : "identifier-state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "magic-arg"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Use `identifier` or `identifier-state`, not both."
  ],
  "id" : "query-magicquery",
  "lowersTo" : [

  ],
  "summary" : "Loads a panel's data with a MagicQuery: a supported noun plus named parameters, which the server expands into GraphQL.",
  "tag" : "query",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Name of the query variable or input that receives the value.",
      "name" : "name",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key to read.",
      "name" : "state",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "state-arg",
  "lowersTo" : [

  ],
  "summary" : "Passes declared workspace state to a query variable, handler input or mutation input.",
  "tag" : "arg",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "MagicQuery parameter name.",
      "name" : "name",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key supplying the value.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A literal value, as text.",
      "name" : "value",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [
    "Supply exactly one of `state` or `value`."
  ],
  "id" : "magic-arg",
  "lowersTo" : [

  ],
  "summary" : "Passes one MagicQuery parameter, either from declared state or as a literal value.",
  "tag" : "arg",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Name of the nested input object.",
      "name" : "name",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "state-arg"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "mutation-input"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "mutation-input",
  "lowersTo" : [

  ],
  "summary" : "Groups nested input values for a legacy GraphQL submit.",
  "tag" : "input",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key holding the ID of the metric to load.",
      "name" : "metric-state",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unit shown after the value, such as `kg`. Use `unit` or `t:unit`, not both.",
      "name" : "unit",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "defaultValue" : "24",
      "description" : "Number of recent samples to load.",
      "name" : "samples",
      "required" : false,
      "valueSchema" : {
        "maximum" : 1000,
        "minimum" : 2,
        "type" : "integer"
      },
      "valueType" : "integer (2…1000)"
    },
    {
      "allowedValues" : [
        "line",
        "area"
      ],
      "defaultValue" : "area",
      "description" : "Chart style.",
      "name" : "style",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "line",
          "area"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "composite",
  "children" : [
    {
      "contracts" : [
        "metric-stat"
      ],
      "minimum" : 1
    }
  ],
  "constraints" : [

  ],
  "id" : "metric-panel",
  "lowersTo" : [
    "panel",
    "MetricGroup",
    "SparklineChart"
  ],
  "summary" : "A ready-made dashboard panel: loads a metric's recent samples and shows the statistics you choose above a trend chart.",
  "tag" : "metric-panel",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "avg",
        "min",
        "max",
        "count"
      ],
      "description" : "The statistic to show: average, minimum, maximum or count.",
      "name" : "stat",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "avg",
          "min",
          "max",
          "count"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "metric-stat",
  "lowersTo" : [

  ],
  "summary" : "One statistic shown by a `metric-panel`, such as the average or maximum of the series.",
  "tag" : "metric",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key that holds the selected record's identity.",
      "name" : "select",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the list of records in the query result.",
      "name" : "items",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name for each item, used to start item paths such as `customer.node.name`.",
      "name" : "as",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to each item's stable identity, starting with the item name.",
      "name" : "key",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to each item's main label, starting with the item name.",
      "name" : "primary",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to each item's secondary label, starting with the item name.",
      "name" : "secondary",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "composite",
  "children" : [
    {
      "contracts" : [
        "query-graphql",
        "query-lua",
        "query-magicquery"
      ],
      "maximum" : 1,
      "minimum" : 1
    },
    {
      "contracts" : [
        "detail"
      ],
      "maximum" : 1,
      "minimum" : 1
    }
  ],
  "constraints" : [
    "It creates a list panel and a list with the IDs `<id>-list-panel` and `<id>-list`; keep every ID in the workspace unique.",
    "Changing the selection keeps any unsaved form drafts.",
    "Its query decides filtering and pagination; the component adds no search or paging controls. Add a `filter` and a `pager` alongside it for those."
  ],
  "id" : "record-browser",
  "lowersTo" : [
    "stack",
    "panel",
    "DataList"
  ],
  "summary" : "A ready-made list-and-detail workflow: a selectable list of records plus a detail region for the selected one. It creates its selection state if you have not declared it.",
  "tag" : "record-browser",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "defaultValue" : "2",
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "row",
        "column",
        "master-detail",
        "panel",
        "metric-panel",
        "record-browser",
        "record-editor",
        "related-records"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "detail",
  "lowersTo" : [

  ],
  "summary" : "The region of a `record-browser` that shows the selected record. Its contents read the selection through state.",
  "tag" : "detail",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key that holds the selected record's identity.",
      "name" : "select",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "defaultValue" : "id",
      "description" : "Query variable or handler input that receives the selected identity.",
      "name" : "argument",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the record being edited in the panel's data.",
      "name" : "record",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the record's identity within that record.",
      "name" : "identity",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "defaultValue" : "id",
      "description" : "Mutation or handler input that receives the record's identity automatically.",
      "name" : "identity-input",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "composite",
  "children" : [
    {
      "contracts" : [
        "query-graphql",
        "query-lua",
        "query-magicquery"
      ],
      "maximum" : 1,
      "minimum" : 1
    },
    {
      "contracts" : [
        "form-submit"
      ],
      "maximum" : 1,
      "minimum" : 1
    },
    {
      "contracts" : [
        "section"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "fieldset"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "variant"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-value"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-actions"
      ],
      "maximum" : 1,
      "minimum" : 1
    }
  ],
  "constraints" : [
    "Its query must be GraphQL or Lua. The `argument` variable is filled from `select`; do not supply it again.",
    "Its form gets the ID `<id>-form`. `identity-input` is filled from `identity`; do not declare that input again.",
    "Submitting, validation, refresh and switching records behave as they do for `form`."
  ],
  "id" : "record-editor",
  "lowersTo" : [
    "panel",
    "Form"
  ],
  "summary" : "A ready-made edit panel: loads the selected record and shows an edit form whose identity input is filled in automatically.",
  "tag" : "record-editor",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key that identifies the parent record.",
      "name" : "parent-state",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "defaultValue" : "id",
      "description" : "Query variable or handler input that receives the parent's identity.",
      "name" : "parent-argument",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Form input that receives the parent's identity. Required when a form is present.",
      "name" : "parent-input",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the list of records in the query result.",
      "name" : "items",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name for each item, used to start item paths such as `customer.node.name`.",
      "name" : "as",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Share of the space relative to sibling layout elements.",
      "name" : "weight",
      "required" : false,
      "valueSchema" : {
        "exclusiveMinimum" : 0,
        "type" : "number"
      },
      "valueType" : "positive number"
    }
  ],
  "category" : "composite",
  "children" : [
    {
      "contracts" : [
        "query-graphql",
        "query-lua",
        "query-magicquery"
      ],
      "maximum" : 1,
      "minimum" : 1
    },
    {
      "contracts" : [
        "table-column"
      ],
      "minimum" : 1
    },
    {
      "contracts" : [
        "form"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Its query must be GraphQL or Lua. The `parent-argument` variable is filled from `parent-state`; do not supply it again.",
    "Its table gets the ID `<id>-table`. When a form is present, `parent-input` is required and is filled in as a hidden value. The form must use create mode and must not supply that input again.",
    "After a successful save, panels refresh as usual. It does not delete records, and it does not group writes into one transaction."
  ],
  "id" : "related-records",
  "lowersTo" : [
    "panel",
    "DataTable",
    "Form"
  ],
  "summary" : "Shows the records that belong to the selected parent, such as a customer's contacts, in a table, with an optional form for adding one. The parent's identity is filled into that form automatically.",
  "tag" : "related-records",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "ID of the panel whose results are paged.",
      "name" : "panel",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key holding the cursor that the panel's query reads.",
      "name" : "state",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the panel's result to the end cursor of the current page.",
      "name" : "next",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the panel's result to the flag that says another page exists.",
      "name" : "has-next",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "pager",
  "lowersTo" : [
    "Pager"
  ],
  "summary" : "Next, Previous and First buttons for a panel whose query pages through results with a cursor.",
  "tag" : "pager",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key the filter edits.",
      "name" : "state",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "text",
        "date",
        "number"
      ],
      "defaultValue" : "text",
      "description" : "Input control: text, date or number.",
      "name" : "control",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "text",
          "date",
          "number"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Hint text shown in the empty input.",
      "name" : "placeholder",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "null",
        "string"
      ],
      "defaultValue" : "null",
      "description" : "Value stored when the filter is empty: `null`, or an empty string.",
      "name" : "empty",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "null",
          "string"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Space-separated state keys set to null whenever this filter is applied or cleared, such as a pagination cursor.",
      "name" : "reset-state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "filter",
  "lowersTo" : [
    "StateInput"
  ],
  "summary" : "An editable filter bound to shared state. Apply or Clear updates the state and reloads the panels that depend on it; it never submits a form.",
  "tag" : "filter",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the list of records in the query result.",
      "name" : "t:for",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name for each item, used to start item paths such as `customer.node.name`.",
      "name" : "t:as",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to each item's main label, starting with the item name.",
      "name" : "primary",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to each item's secondary label, starting with the item name.",
      "name" : "secondary",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key that holds the selected record's identity.",
      "name" : "select",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to each item's stable identity, starting with the item name.",
      "name" : "key",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "record-list",
  "lowersTo" : [
    "DataList"
  ],
  "summary" : "A selectable list of records. Selecting one writes its key to shared state for other panels to use.",
  "tag" : "record-list",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the text to show.",
      "name" : "t:text",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "detail-field"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "record-detail",
  "lowersTo" : [
    "RecordCard"
  ],
  "summary" : "Shows one record: a heading plus labelled values.",
  "tag" : "record-detail",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the value to show. Inside a list, start it with the item name.",
      "name" : "t:value",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "detail-field",
  "lowersTo" : [

  ],
  "summary" : "One labelled value in a `record-detail`.",
  "tag" : "field",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the list of records in the query result.",
      "name" : "t:for",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name for each item, used to start item paths such as `customer.node.name`.",
      "name" : "t:as",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "table-column"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "record-table",
  "lowersTo" : [
    "DataTable"
  ],
  "summary" : "Shows records as rows, with the columns you define.",
  "tag" : "record-table",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the value to show. Inside a list, start it with the item name.",
      "name" : "t:value",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "status"
      ],
      "description" : "Set to `status` to show the value as a coloured status.",
      "name" : "format",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "status"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "table-column",
  "lowersTo" : [

  ],
  "summary" : "One column of a table, bound to a value on each row.",
  "tag" : "column",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "row",
        "grid",
        "list"
      ],
      "defaultValue" : "row",
      "description" : "How the metrics are arranged.",
      "name" : "layout",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "row",
          "grid",
          "list"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "large",
        "standard"
      ],
      "defaultValue" : "large",
      "description" : "Size of the metric tiles.",
      "name" : "size",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "large",
          "standard"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "kpi-metric"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "kpi-summary",
  "lowersTo" : [
    "MetricGroup"
  ],
  "summary" : "A group of headline numbers, each with a label and an optional unit and trend.",
  "tag" : "kpi-summary",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the value to show. Inside a list, start it with the item name.",
      "name" : "t:value",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unit shown after the value, such as `kg`. Use `unit` or `t:unit`, not both.",
      "name" : "unit",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the panel's data to the unit shown after the value. Use `unit` or `t:unit`, not both.",
      "name" : "t:unit",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to a trend value shown with the metric.",
      "name" : "trend",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "kpi-metric",
  "lowersTo" : [

  ],
  "summary" : "One headline number in a `kpi-summary`.",
  "tag" : "metric",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the list of records in the query result.",
      "name" : "t:for",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name for each item, used to start item paths such as `customer.node.name`.",
      "name" : "t:as",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the value to show. Inside a list, start it with the item name.",
      "name" : "t:value",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "line",
        "area"
      ],
      "defaultValue" : "area",
      "description" : "Chart style.",
      "name" : "style",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "line",
          "area"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "trend",
  "lowersTo" : [
    "SparklineChart"
  ],
  "summary" : "A line or area chart of a series of values from the panel's data.",
  "tag" : "trend",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the text to show. Leave it out to show the element's own text.",
      "name" : "t:text",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "text",
  "lowersTo" : [
    "Text"
  ],
  "summary" : "Shows text, either written in the element or bound to a value in the panel's data.",
  "tag" : "text",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the record being edited in the panel's data.",
      "name" : "record",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the record's identity within that record.",
      "name" : "identity",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "create",
        "edit"
      ],
      "description" : "`create` or `edit`. Defaults to edit when `record` is set.",
      "name" : "mode",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "create",
          "edit"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "form-submit"
      ],
      "maximum" : 1,
      "minimum" : 1
    },
    {
      "contracts" : [
        "section"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "fieldset"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "variant"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-value"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-actions"
      ],
      "maximum" : 1,
      "minimum" : 1
    }
  ],
  "constraints" : [
    "`mode` defaults to edit when `record` is set, otherwise create. Edit mode needs `record` and `identity`.",
    "For GraphQL, inputs and response selections are checked against your instance schema. For Lua, inputs come from the declared handler."
  ],
  "id" : "form",
  "lowersTo" : [
    "Form"
  ],
  "summary" : "A form for creating or editing a record. It keeps the user's draft, validates it, asks for confirmation and submits it through a GraphQL mutation or a Lua action.",
  "tag" : "form",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "graphql",
        "lua"
      ],
      "description" : "`graphql` to run the mutation written inside the element, `lua` to call an action handler.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "graphql",
          "lua"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name of a handler declared in this workspace.",
      "name" : "handler",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the response to the saved record, used to confirm what was saved.",
      "name" : "result",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the response to the list of structured errors.",
      "name" : "errors",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Prefix added to server error paths before they are matched to form inputs.",
      "name" : "error-prefix",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Confirmation message shown before submitting. Defaults to the workspace title followed by `: confirm change`. Leaving it out does not skip confirmation.",
      "name" : "confirm",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [
    "A GraphQL submit contains a mutation and no `handler`. A Lua submit names an action handler and contains no text.",
    "`errors` must point to a structured error list. `result`, when given, must contain every field the form reads from the record."
  ],
  "id" : "form-submit",
  "lowersTo" : [

  ],
  "summary" : "How a form submits: a GraphQL mutation written inside the element, or a server Lua action. It also says where to find errors and the saved record in the response.",
  "tag" : "submit",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path of the input object the variant fills.",
      "name" : "path",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "one-of",
        "discriminator"
      ],
      "description" : "How the choice is sent: `one-of` for a GraphQL OneOf input, `discriminator` for an input with a type field.",
      "name" : "encoding",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "one-of",
          "discriminator"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown above the choice of cases.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The input member that records the chosen case. Required for discriminator encoding.",
      "name" : "discriminator",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the edited record that supplies the initial value.",
      "name" : "source",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Workspace state key whose value fills this input. Editing the form does not change that state.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "always",
        "changed"
      ],
      "defaultValue" : "always",
      "description" : "`always` sends the value every time; `changed` sends it only when the user changed it.",
      "name" : "submit",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "always",
          "changed"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Case selected initially for new records. Never overrides the case of an existing record.",
      "name" : "default-case",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "variant-case"
      ],
      "minimum" : 1
    }
  ],
  "constraints" : [
    "With `one-of` encoding, the input must be a GraphQL OneOf object and every member needs a case. Cases that are single values or lists are not supported. Use `field` on each case, never `value`.",
    "The variant fills its whole input and submits exactly one selected member. Required fields of a case must appear in that case.",
    "With `discriminator` encoding, the discriminator must be a direct string or enum input, and each case uses `value`, never `field`. Enum and Lua choices need a case for every value. Required fields shared by every case must be declared in each case.",
    "For Lua inputs, each alternative must be a closed object with one common required discriminator and unique string values.",
    "Case fields are relative to the selected object. Cases that reuse a field name keep separate drafts.",
    "Cases can contain conditional fieldsets, nested variants, static options and lookups. Fields and variants keep the order you write them in."
  ],
  "id" : "variant",
  "lowersTo" : [

  ],
  "summary" : "Lets the user choose one of several shapes for part of the input, for example a person or a company, each with its own fields.",
  "tag" : "variant",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "The GraphQL OneOf member this case fills. Required for one-of encoding.",
      "name" : "field",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The discriminator value this case sends. Required for discriminator encoding.",
      "name" : "value",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown for this case.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "variant-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "variant"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "case-fieldset"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "case-section"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "variant-case",
  "lowersTo" : [

  ],
  "summary" : "One choice within a `variant`, with the fields that belong to it.",
  "tag" : "case",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "1",
        "2"
      ],
      "defaultValue" : "1",
      "description" : "Number of columns.",
      "name" : "columns",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          1,
          2
        ],
        "type" : "integer"
      },
      "valueType" : "integer"
    },
    {
      "description" : "A condition in the `form-predicate/1` language that decides whether this group takes part (see Conditional forms). It reads form input and variant selections, never workspace state.",
      "name" : "when",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "variant-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "variant"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "case-fieldset"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "case-section"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Field paths are relative to the case, but `when` conditions use the full input path, including the member name for OneOf cases.",
    "`selection[variant-id]` can refer to the containing variant, its ancestors, and variants outside the group it controls. Its value is the selected case key, or null.",
    "A required field can be hidden only if it belongs to an optional object whose fields are all hidden together.",
    "Drafts in hidden groups are kept, but they are not validated or submitted.",
    "Conditions can read fields at the top of the form and in the containing cases, but not fields in sibling conditional groups."
  ],
  "id" : "case-fieldset",
  "lowersTo" : [

  ],
  "summary" : "A conditional group of fields inside a variant case. Its `when` condition decides whether the fields take part; hidden drafts are kept.",
  "tag" : "fieldset",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "1",
        "2"
      ],
      "defaultValue" : "1",
      "description" : "Number of columns.",
      "name" : "columns",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          1,
          2
        ],
        "type" : "integer"
      },
      "valueType" : "integer"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "variant-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "variant"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "case-fieldset"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "case-section"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "case-section",
  "lowersTo" : [

  ],
  "summary" : "A plain group of fields inside a variant case, laid out in one or two columns.",
  "tag" : "section",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Path of this input, relative to the selected case.",
      "name" : "path",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the edited record that supplies the initial value.",
      "name" : "source",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "text",
        "textarea",
        "email",
        "phone",
        "password",
        "number",
        "toggle",
        "select",
        "record-picker",
        "json"
      ],
      "description" : "Input control to show. By default it is chosen from the input's type.",
      "name" : "control",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "text",
          "textarea",
          "email",
          "phone",
          "password",
          "number",
          "toggle",
          "select",
          "record-picker",
          "json"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Hint text shown in the empty input.",
      "name" : "placeholder",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Short explanation shown with the input. Defaults to the schema's description when there is one.",
      "name" : "help",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "defaultValue" : "false",
      "description" : "Set to `true` to show the value without letting the user change it.",
      "name" : "readonly",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "option"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "lookup"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "variant-field",
  "lowersTo" : [

  ],
  "summary" : "An input inside a variant case. Its path is relative to the selected case.",
  "tag" : "field",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "1",
        "2"
      ],
      "defaultValue" : "1",
      "description" : "Number of columns.",
      "name" : "columns",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          1,
          2
        ],
        "type" : "integer"
      },
      "valueType" : "integer"
    },
    {
      "description" : "A condition in the `form-predicate/1` language that decides whether this group takes part (see Conditional forms). It reads form input and variant selections, never workspace state.",
      "name" : "when",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "form-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "form-value"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "section"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "fieldset"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "variant"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Needs a version of the CoCoCo app that supports conditional forms. Hidden fields keep their drafts but are not validated or submitted.",
    "At most 64 groups and 8 levels of nesting; IDs are unique within the form.",
    "Conditions can read fields that are always shown or belong to an enclosing group, and variant selections, but never their own contents or unrelated conditional groups. `selection[variant-id]` is the selected case key, or null; switching case re-evaluates dependent fieldsets.",
    "A required field can be hidden only when its whole optional object is left out. Field paths stay absolute.",
    "Contains fields, values, sections and nested fieldsets. Inside a variant case, use the variant-case fieldset."
  ],
  "id" : "fieldset",
  "lowersTo" : [

  ],
  "summary" : "A conditional group of fields. Its `when` condition decides whether they are validated and submitted; hidden drafts are kept, not cleared.",
  "tag" : "fieldset",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "1",
        "2"
      ],
      "defaultValue" : "1",
      "description" : "Number of columns.",
      "name" : "columns",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          1,
          2
        ],
        "type" : "integer"
      },
      "valueType" : "integer"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "form-field"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "section",
  "lowersTo" : [

  ],
  "summary" : "A plain group of fields, laid out in one or two columns.",
  "tag" : "section",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Path of this input in the mutation variables or handler input.",
      "name" : "path",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the edited record that supplies the initial value.",
      "name" : "source",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Workspace state key whose value fills this input. Editing the form does not change that state.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "text",
        "textarea",
        "email",
        "phone",
        "password",
        "number",
        "toggle",
        "select",
        "record-picker",
        "json"
      ],
      "description" : "Input control to show. By default it is chosen from the input's type.",
      "name" : "control",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "text",
          "textarea",
          "email",
          "phone",
          "password",
          "number",
          "toggle",
          "select",
          "record-picker",
          "json"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Hint text shown in the empty input.",
      "name" : "placeholder",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Short explanation shown with the input. Defaults to the schema's description when there is one.",
      "name" : "help",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "always",
        "changed"
      ],
      "defaultValue" : "always",
      "description" : "`always` sends the value every time; `changed` sends it only when the user changed it.",
      "name" : "submit",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "always",
          "changed"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "defaultValue" : "false",
      "description" : "Set to `true` to show the value without letting the user change it.",
      "name" : "readonly",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    },
    {
      "allowedValues" : [
        "true"
      ],
      "description" : "Set to `true` to require a value for this Lua handler input. The server enforces it on every call.",
      "name" : "required",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    },
    {
      "description" : "Minimum text length, enforced by the server and the form.",
      "name" : "min-length",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    },
    {
      "description" : "Maximum text length, enforced by the server and the form.",
      "name" : "max-length",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    },
    {
      "description" : "Lowest allowed number, inclusive, enforced by the server and the form.",
      "name" : "minimum",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "finite-number"
    },
    {
      "description" : "Highest allowed number, inclusive, enforced by the server and the form.",
      "name" : "maximum",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "finite-number"
    },
    {
      "description" : "Minimum number of list items, enforced by the server and the form.",
      "name" : "min-items",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    },
    {
      "description" : "Maximum number of list items, enforced by the server and the form.",
      "name" : "max-items",
      "required" : false,
      "valueSchema" : {
        "minimum" : 0,
        "type" : "integer"
      },
      "valueType" : "nonnegative-integer"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "option"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "lookup"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Use `source` or `state`, not both, and either `lookup` or `option` children, not both.",
    "The control defaults from the input's type; a `lookup` makes it a record picker. Required inputs must use `submit=\"always\"`."
  ],
  "id" : "form-field",
  "lowersTo" : [

  ],
  "summary" : "A visible input in a form, bound to one path in the mutation or handler input.",
  "tag" : "field",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Path of this input in the mutation variables or handler input.",
      "name" : "path",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the edited record that supplies the initial value.",
      "name" : "source",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Workspace state key whose value fills this input. Editing the form does not change that state.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "text",
        "textarea",
        "email",
        "phone",
        "password",
        "number",
        "toggle",
        "select",
        "record-picker",
        "json"
      ],
      "description" : "Input control to show. By default it is chosen from the input's type.",
      "name" : "control",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "text",
          "textarea",
          "email",
          "phone",
          "password",
          "number",
          "toggle",
          "select",
          "record-picker",
          "json"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Hint text shown in the empty input.",
      "name" : "placeholder",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Short explanation shown with the input. Defaults to the schema's description when there is one.",
      "name" : "help",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "always",
        "changed"
      ],
      "defaultValue" : "always",
      "description" : "`always` sends the value every time; `changed` sends it only when the user changed it.",
      "name" : "submit",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "always",
          "changed"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "defaultValue" : "false",
      "description" : "Set to `true` to show the value without letting the user change it.",
      "name" : "readonly",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "option"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "lookup"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Use `source` or `state`, not both, and either `lookup` or `option` children, not both.",
    "Required inputs must use `submit=\"always\"`."
  ],
  "id" : "form-value",
  "lowersTo" : [

  ],
  "summary" : "A hidden, read-only input in a form, such as a record ID taken from the record or from state.",
  "tag" : "value",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The value stored when this option is chosen, as JSON.",
      "name" : "value",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "option",
  "lowersTo" : [

  ],
  "summary" : "One fixed choice for a field, with a label and a JSON value.",
  "tag" : "option",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "ID of the panel or data source whose records supply the choices.",
      "name" : "panel",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the list of records in that panel's result.",
      "name" : "items",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path, relative to each record, to the value stored when it is chosen. Do not start it with an item name.",
      "name" : "value",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path, relative to each record, to the label shown for it. Do not start it with an item name.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "lookup",
  "lowersTo" : [

  ],
  "summary" : "Offers a field's choices from the records another panel or data source has loaded. Searching filters only those loaded records.",
  "tag" : "lookup",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "defaultValue" : "Save",
      "description" : "Text of the save button.",
      "name" : "save-label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "defaultValue" : "Discard changes",
      "description" : "Text of the button that discards changes.",
      "name" : "reset-label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "form-actions",
  "lowersTo" : [

  ],
  "summary" : "Sets the text of a form's save and reset buttons.",
  "tag" : "form-actions",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Unique identifier: lowercase letters, digits and hyphens, starting with a letter.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown to users.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name of a handler declared in this workspace.",
      "name" : "handler",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Confirmation message shown before submitting. Defaults to the workspace title followed by `: confirm change`. Leaving it out does not skip confirmation.",
      "name" : "confirm",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Message shown after the action succeeds.",
      "name" : "success",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "legacy",
  "children" : [
    {
      "contracts" : [
        "legacy-field"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "state-arg"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "legacy-submit-graphql",
        "legacy-submit-lua"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "action-form",
  "lowersTo" : [
    "FormBlock",
    "ActionGroup"
  ],
  "summary" : "A legacy form that writes shared state and runs an action. Use `form` instead: it protects the user's draft.",
  "tag" : "action-form",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "State key the input writes.",
      "name" : "state",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Input type.",
      "name" : "type",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Hint text shown in the empty input.",
      "name" : "placeholder",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "legacy-field",
  "lowersTo" : [

  ],
  "summary" : "An input in a legacy `action-form`.",
  "tag" : "field",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "graphql"
      ],
      "description" : "Always `graphql` for this submit.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "graphql"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "state-arg"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "mutation-input"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "legacy-submit-graphql",
  "lowersTo" : [

  ],
  "summary" : "The GraphQL mutation a legacy `action-form` runs.",
  "tag" : "submit",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "lua"
      ],
      "description" : "Always `lua` for this submit.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "lua"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Name of a handler declared in this workspace.",
      "name" : "handler",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "state-arg"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "legacy-submit-lua",
  "lowersTo" : [

  ],
  "summary" : "The Lua action a legacy `action-form` runs.",
  "tag" : "submit",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Name of the property to set.",
      "name" : "name",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [

  ],
  "constraints" : [

  ],
  "id" : "block-property",
  "lowersTo" : [

  ],
  "summary" : "Sets one property of a generic block, or of its `config` or `data-binding`, to a JSON value. Use it for values an attribute cannot express, such as lists and objects.",
  "tag" : "property",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "row",
        "column"
      ],
      "description" : "Arrange the buttons in a `row` or a `column`.",
      "name" : "layout",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "row",
          "column"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-ActionGroup-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "ActionGroup"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "ActionGroup"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-ActionGroup-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-ActionGroup",
  "lowersTo" : [
    "ActionGroup"
  ],
  "summary" : "A row or column of action buttons.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Optional topic to focus the analysis on, such as \"delivery risk\".",
      "name" : "focus",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "panel"
      ],
      "description" : "What to analyse. Currently always the panel the block is in.",
      "name" : "scope",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "panel"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-AiInsight-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "AiInsight"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "AiInsight"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-AiInsight-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-AiInsight",
  "lowersTo" : [
    "AiInsight"
  ],
  "summary" : "An AI analysis of the panel's data, shown inline. It runs when the panel loads or refreshes, is read-only, and is advisory. It needs a configured AI assistant.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "info",
        "warning",
        "error",
        "critical"
      ],
      "description" : "How serious the message is; sets its colour.",
      "name" : "severity",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "info",
          "warning",
          "error",
          "critical"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-AlertBlock-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Label for an action on the alert. The CoCoCo app does not show it yet.",
      "name" : "actionLabel",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The message text.",
      "name" : "message",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-AlertBlock-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "AlertBlock"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "AlertBlock"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-AlertBlock-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-AlertBlock-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-AlertBlock",
  "lowersTo" : [
    "AlertBlock"
  ],
  "summary" : "A message with a severity: info, warning, error or critical.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to show check icons.",
      "name" : "showIcons",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Checklist-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The list of items.",
      "name" : "items",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each item's label.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each item's state; a done-like value shows a tick.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Checklist-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "Checklist"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "Checklist"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Checklist-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Checklist-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-Checklist",
  "lowersTo" : [
    "Checklist"
  ],
  "summary" : "A list of items with a done state, such as the steps of a process.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to let users select rows.",
      "name" : "isSelectable",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-DataList-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Badge text on each row.",
      "name" : "badge",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The list of rows.",
      "name" : "items",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Main line of each row.",
      "name" : "primaryText",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Second line of each row.",
      "name" : "secondaryText",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each row's status, shown as a coloured dot.",
      "name" : "statusDot",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-DataList-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "DataList"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "DataList"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-DataList-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-DataList-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-DataList",
  "lowersTo" : [
    "DataList"
  ],
  "summary" : "A list of rows with a main line, a second line, a badge and a status dot. `record-list` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to let users sort by column.",
      "name" : "isSortable",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    },
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to split long tables into pages.",
      "name" : "pagination",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-DataTable-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The list of rows.",
      "name" : "rows",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-DataTable-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "DataTable"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "DataTable"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-DataTable-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-DataTable-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-DataTable",
  "lowersTo" : [
    "DataTable"
  ],
  "summary" : "A table of rows. `record-table` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to allow more than one selection.",
      "name" : "multiSelect",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-FilterBar-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The list of options.",
      "name" : "options",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The selected value or values.",
      "name" : "value",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-FilterBar-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "FilterBar"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "FilterBar"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-FilterBar-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-FilterBar-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-FilterBar",
  "lowersTo" : [
    "FilterBar"
  ],
  "summary" : "A row of filter options the user can choose from.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "form-predicate/1"
      ],
      "description" : "Condition language used by conditional groups. Always `form-predicate/1`.",
      "name" : "conditionProfile",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "form-predicate/1"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Prefix added to server error paths before they are matched to inputs.",
      "name" : "errorPrefix",
      "required" : false,
      "valueSchema" : {
        "maxLength" : 512,
        "pattern" : "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$",
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the response to the list of structured errors.",
      "name" : "errors",
      "required" : false,
      "valueSchema" : {
        "maxLength" : 512,
        "pattern" : "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$",
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the record's identity within the record.",
      "name" : "identity",
      "required" : false,
      "valueSchema" : {
        "maxLength" : 512,
        "pattern" : "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$",
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "create",
        "edit"
      ],
      "description" : "`create` or `edit`.",
      "name" : "mode",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "create",
          "edit"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "ID of the mutation the form submits.",
      "name" : "mutationId",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path to the record being edited in the panel's data.",
      "name" : "record",
      "required" : false,
      "valueSchema" : {
        "maxLength" : 512,
        "pattern" : "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$",
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Text of the button that discards changes.",
      "name" : "resetLabel",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the response to the saved record.",
      "name" : "result",
      "required" : false,
      "valueSchema" : {
        "maxLength" : 512,
        "pattern" : "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$",
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Text of the submit button.",
      "name" : "submitLabel",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Form-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "Form"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "Form"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Form-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-Form",
  "lowersTo" : [
    "Form"
  ],
  "summary" : "The low-level form block. Use `form` instead, which adds draft protection and schema checks.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [

  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-FormBlock-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "FormBlock"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "FormBlock"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-FormBlock-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-FormBlock",
  "lowersTo" : [
    "FormBlock"
  ],
  "summary" : "Input fields that write workspace state for a following action. Prefer `form`.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Highest value on the gauge.",
      "name" : "max",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "number"
    },
    {
      "description" : "Lowest value on the gauge.",
      "name" : "min",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "number"
    },
    {
      "allowedValues" : [
        "thick",
        "thin"
      ],
      "description" : "Thickness of the gauge ring.",
      "name" : "thickness",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "thick",
          "thin"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-GaugeChart-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Label shown with the gauge.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The number to show.",
      "name" : "value",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-GaugeChart-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "GaugeChart"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "GaugeChart"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-GaugeChart-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-GaugeChart-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-GaugeChart",
  "lowersTo" : [
    "GaugeChart"
  ],
  "summary" : "A gauge showing one number between a minimum and a maximum.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Handle of the published journey to embed. Write it literally; it cannot be bound to data.",
      "name" : "handle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Journey-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [

  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Journey-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "Journey"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "Journey"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Journey-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Journey-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-Journey",
  "lowersTo" : [
    "Journey"
  ],
  "summary" : "Embeds a published Journey, a guided step-by-step process, in the panel.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Initial zoom level.",
      "name" : "defaultZoom",
      "required" : false,
      "valueSchema" : {
        "type" : "number"
      },
      "valueType" : "number"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-MapBlock-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Each marker's label.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each location's latitude.",
      "name" : "lat",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each location's longitude.",
      "name" : "lng",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The list of locations.",
      "name" : "locations",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-MapBlock-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "MapBlock"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "MapBlock"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-MapBlock-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-MapBlock-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-MapBlock",
  "lowersTo" : [
    "MapBlock"
  ],
  "summary" : "A map with a marker for each location.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Aspect ratio of the preview area.",
      "name" : "aspectRatio",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "How the image fills the preview area.",
      "name" : "objectFit",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-MediaPreview-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Text shown when there is no image.",
      "name" : "fallbackText",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Address of the image.",
      "name" : "thumbnailUrl",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-MediaPreview-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "MediaPreview"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "MediaPreview"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-MediaPreview-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-MediaPreview-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-MediaPreview",
  "lowersTo" : [
    "MediaPreview"
  ],
  "summary" : "An image preview, with text shown when there is no image.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "row",
        "grid",
        "list"
      ],
      "description" : "How the metric tiles are arranged.",
      "name" : "layout",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "row",
          "grid",
          "list"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "large",
        "standard"
      ],
      "description" : "Size of the metric tiles.",
      "name" : "size",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "large",
          "standard"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-MetricGroup-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [

  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-MetricGroup-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "MetricGroup"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "MetricGroup"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-MetricGroup-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-MetricGroup-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-MetricGroup",
  "lowersTo" : [
    "MetricGroup"
  ],
  "summary" : "A group of metric tiles. `kpi-summary` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Path in the panel's result to the flag that says another page exists.",
      "name" : "hasNext",
      "required" : false,
      "valueSchema" : {
        "minLength" : 1,
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Path in the panel's result to the end cursor of the current page.",
      "name" : "next",
      "required" : false,
      "valueSchema" : {
        "minLength" : 1,
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "ID of the panel whose results are paged.",
      "name" : "panel",
      "required" : false,
      "valueSchema" : {
        "minLength" : 1,
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key holding the cursor that the panel's query reads.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "minLength" : 1,
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Pager-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "Pager"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "Pager"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Pager-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-Pager",
  "lowersTo" : [
    "Pager"
  ],
  "summary" : "Next, Previous and First buttons. `pager` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Colour of the bar.",
      "name" : "color",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-ProgressBar-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Label at the left end.",
      "name" : "labelLeft",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label at the right end.",
      "name" : "labelRight",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Progress, from 0 to 100.",
      "name" : "percentage",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-ProgressBar-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "ProgressBar"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "ProgressBar"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-ProgressBar-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-ProgressBar-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-ProgressBar",
  "lowersTo" : [
    "ProgressBar"
  ],
  "summary" : "A progress bar with optional labels at each end.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Layout of the card.",
      "name" : "layout",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to show an avatar.",
      "name" : "showAvatar",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-RecordCard-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The record's status, shown as a badge.",
      "name" : "statusBadge",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The record's title.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-RecordCard-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "RecordCard"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "RecordCard"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-RecordCard-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-RecordCard-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-RecordCard",
  "lowersTo" : [
    "RecordCard"
  ],
  "summary" : "A card showing one record, with a title, a status badge and labelled fields. `record-detail` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "How the diagram is arranged.",
      "name" : "layout",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-RelationGraph-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The list of links between them.",
      "name" : "edges",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The list of records to draw.",
      "name" : "nodes",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-RelationGraph-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "RelationGraph"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "RelationGraph"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-RelationGraph-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-RelationGraph-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-RelationGraph",
  "lowersTo" : [
    "RelationGraph"
  ],
  "summary" : "A diagram of records and the links between them.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Colour of the line.",
      "name" : "color",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "line",
        "area"
      ],
      "description" : "`line` or `area`.",
      "name" : "type",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "line",
          "area"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "When each point is an object, the path to its number.",
      "name" : "valueKey",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-SparklineChart-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The list of numbers, or of objects (see `valueKey`).",
      "name" : "dataPoints",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-SparklineChart-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "SparklineChart"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "SparklineChart"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-SparklineChart-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-SparklineChart-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-SparklineChart",
  "lowersTo" : [
    "SparklineChart"
  ],
  "summary" : "A small line or area chart. `trend` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "text",
        "date",
        "number"
      ],
      "description" : "Input control: text, date or number.",
      "name" : "control",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "text",
          "date",
          "number"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "null",
        "string"
      ],
      "description" : "Value stored when the input is empty: `null`, or an empty string.",
      "name" : "empty",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "null",
          "string"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Label shown to users.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Hint text shown in the empty input.",
      "name" : "placeholder",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "State key the input edits.",
      "name" : "state",
      "required" : false,
      "valueSchema" : {
        "pattern" : "^[A-Za-z_][A-Za-z0-9_]*$",
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-StateInput-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "StateInput"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "StateInput"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-StateInput-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-StateInput",
  "lowersTo" : [
    "StateInput"
  ],
  "summary" : "An input bound to workspace state. `filter` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "circle",
        "square"
      ],
      "description" : "`circle` or `square`.",
      "name" : "shape",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "circle",
          "square"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-SwatchSet-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Each swatch's colour code.",
      "name" : "colorCode",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each swatch's label.",
      "name" : "label",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The list of swatches.",
      "name" : "swatches",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-SwatchSet-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "SwatchSet"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "SwatchSet"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-SwatchSet-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-SwatchSet-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-SwatchSet",
  "lowersTo" : [
    "SwatchSet"
  ],
  "summary" : "A set of colour swatches, each with a label.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "TabSwitch"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "TabSwitch"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-TabSwitch",
  "lowersTo" : [
    "TabSwitch"
  ],
  "summary" : "A row of tabs the user can switch between. Define the tabs with a `<property name=\"tabs\">` list of labels and values.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "allowedValues" : [
        "true",
        "false"
      ],
      "description" : "Set to `true` to format the text as Markdown.",
      "name" : "markdown",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          true,
          false
        ],
        "type" : "boolean"
      },
      "valueType" : "boolean"
    },
    {
      "allowedValues" : [
        "title",
        "heading",
        "body",
        "caption"
      ],
      "description" : "Text style: title, heading, body or caption.",
      "name" : "style",
      "required" : false,
      "valueSchema" : {
        "enum" : [
          "title",
          "heading",
          "body",
          "caption"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Text-config",
  "lowersTo" : [

  ],
  "summary" : "Settings for the enclosing block. Use attributes for simple values, `<property>` children for lists and objects, or one complete JSON body.",
  "tag" : "config",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "The text to show.",
      "name" : "text",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Text-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "Text"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "Text"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Text-config"
      ],
      "maximum" : 1,
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Text-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-Text",
  "lowersTo" : [
    "Text"
  ],
  "summary" : "Text, optionally formatted as Markdown. `text` covers the common case.",
  "tag" : "block",
  "textAllowed" : false
},
{
  "attributes" : [
    {
      "description" : "Each event's detail text.",
      "name" : "detail",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "The list of events.",
      "name" : "items",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each event's status, shown as a coloured marker.",
      "name" : "statusDot",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each event's time.",
      "name" : "timestamp",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Each event's title.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "syntax",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    }
  ],
  "constraints" : [

  ],
  "id" : "block-Timeline-dataBinding",
  "lowersTo" : [

  ],
  "summary" : "Binds the enclosing block to the panel's data. Each value is literal text or a `{{ dot.path }}` expression. Use attributes, `<property>` children, or one complete JSON body.",
  "tag" : "data-binding",
  "textAllowed" : true
},
{
  "attributes" : [
    {
      "description" : "Context for the AI assistant about what this block shows.",
      "name" : "aiHint",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Unique identifier for the block.",
      "name" : "id",
      "required" : true,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Secondary text shown under the title.",
      "name" : "subtitle",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "Heading shown above the block.",
      "name" : "title",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "allowedValues" : [
        "Timeline"
      ],
      "description" : "The block type.",
      "name" : "type",
      "required" : true,
      "valueSchema" : {
        "enum" : [
          "Timeline"
        ],
        "type" : "string"
      },
      "valueType" : "string"
    },
    {
      "description" : "A `{{ }}` expression over the panel's data. The block is shown only when it is true.",
      "name" : "visibilityCondition",
      "required" : false,
      "valueSchema" : {
        "type" : "string"
      },
      "valueType" : "string"
    }
  ],
  "category" : "block",
  "children" : [
    {
      "contracts" : [
        "block-property"
      ],
      "minimum" : 0
    },
    {
      "contracts" : [
        "block-Timeline-dataBinding"
      ],
      "maximum" : 1,
      "minimum" : 0
    }
  ],
  "constraints" : [
    "Do not set the same property twice. The server checks required properties and the other rules for the block type."
  ],
  "id" : "block-Timeline",
  "lowersTo" : [
    "Timeline"
  ],
  "summary" : "A vertical timeline of events.",
  "tag" : "block",
  "textAllowed" : false
}

], "format" : "cococo-workspace-components/1", "sourceFormat" : "cococo-workspace/1", "unknownAttributesAllowed" : false }

Published platform manual · revision 15d64565f137