{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://winkledor.com/schema/design-1.json",
  "title": "Winkledor design",
  "description": "A Winkledor new tab design. Data only: no code, markup, styles or addresses to fetch.",
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string",
      "description": "For editors; ignored by Winkledor."
    },
    "winkledor": {
      "const": 1
    },
    "id": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{0,38}\\/[a-z0-9][a-z0-9-]{0,38}$",
      "description": "owner/name, lowercase."
    },
    "name": {
      "type": "string",
      "maxLength": 32,
      "description": "Title Case."
    },
    "version": {
      "type": "string",
      "pattern": "^\\d{1,4}\\.\\d{1,4}\\.\\d{1,4}$"
    },
    "author": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 48,
          "default": ""
        },
        "url": {
          "type": "string",
          "maxLength": 200,
          "pattern": "^https:\\/\\/[^\\s\"<>]+$",
          "default": ""
        }
      },
      "additionalProperties": false
    },
    "license": {
      "enum": [
        "CC0-1.0",
        "CC-BY-4.0"
      ]
    },
    "basedOn": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 79,
          "pattern": "^[a-z0-9][a-z0-9-]{0,38}\\/[a-z0-9][a-z0-9-]{0,38}$",
          "default": ""
        },
        "version": {
          "type": "string",
          "maxLength": 14,
          "pattern": "^\\d{1,4}\\.\\d{1,4}\\.\\d{1,4}$",
          "default": ""
        }
      },
      "additionalProperties": false
    },
    "description": {
      "type": "string",
      "maxLength": 140,
      "description": "Sentence case."
    },
    "layers": {
      "type": "array",
      "minItems": 1,
      "maxItems": 4,
      "description": "Bottom first. Keyframe \"at\" values are hours on the canonical day: first light 5.25, sunrise 6.35, sunset 19, last light 20.1.",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "description": "A sky drawn with light: colours and a glowing light for each time of day, eased between, with grain and slow movement.",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]{0,23}$"
              },
              "type": {
                "const": "sky@1"
              },
              "palette": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 23.99,
                      "default": 12,
                      "description": "Hour on the canonical day: first light 5.25, sunrise 6.35, sunset 19, last light 20.1."
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 24,
                      "default": "",
                      "description": "Title Case, e.g. \"Golden Hour\"."
                    },
                    "zenith": {
                      "type": "string",
                      "maxLength": 7,
                      "pattern": "^#[0-9a-f]{6}$",
                      "default": "#f6f9fb",
                      "description": "Top of the sky. Most of the screen is this colour."
                    },
                    "horizon": {
                      "type": "string",
                      "maxLength": 7,
                      "pattern": "^#[0-9a-f]{6}$",
                      "default": "#fbfaf4",
                      "description": "Bottom of the sky, before any light is added."
                    },
                    "glow": {
                      "type": "string",
                      "maxLength": 7,
                      "pattern": "^#[0-9a-f]{6}$",
                      "default": "#ffd95c",
                      "description": "Core of the light."
                    },
                    "halo": {
                      "type": "string",
                      "maxLength": 7,
                      "pattern": "^#[0-9a-f]{6}$",
                      "default": "#fdeec0",
                      "description": "Wide wash around the light; what the core fades through."
                    },
                    "light": {
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "number",
                          "minimum": -0.5,
                          "maximum": 1.5,
                          "default": 0.5
                        },
                        {
                          "type": "number",
                          "minimum": -1,
                          "maximum": 1.5,
                          "default": -0.12
                        }
                      ],
                      "minItems": 2,
                      "maxItems": 2,
                      "default": [
                        0.5,
                        -0.12
                      ],
                      "description": "The light's centre: x from the left edge (0 to 1), y in screen heights from the bottom (negative is below the screen)."
                    },
                    "radius": {
                      "type": "number",
                      "minimum": 0.2,
                      "maximum": 3,
                      "default": 0.92,
                      "description": "The glow's size in screen heights."
                    },
                    "intensity": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1.5,
                      "default": 1,
                      "description": "How far the light colours push into the sky."
                    },
                    "grain": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 0.08,
                      "default": 0.01,
                      "description": "Film grain amplitude."
                    },
                    "motion": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1.5,
                      "default": 1,
                      "description": "Drift and breathing at this hour; nights are calmer."
                    }
                  },
                  "additionalProperties": false
                },
                "minItems": 2,
                "maxItems": 24,
                "description": "The day as keyframes. The sky eases between neighbours, so a keyframe is never a hard boundary."
              },
              "character": {
                "type": "string",
                "enum": [
                  "natural",
                  "pastel",
                  "mono"
                ],
                "default": "natural",
                "description": "Natural as drawn; Pastel lifts and softens; Mono keeps only lightness."
              },
              "field": {
                "type": "object",
                "properties": {
                  "horizonReach": {
                    "type": "number",
                    "minimum": 0.05,
                    "maximum": 1,
                    "default": 0.62,
                    "description": "How much of the screen, from the bottom, the horizon tint reaches."
                  },
                  "haloFalloff": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 12,
                    "default": 2.4,
                    "description": "Falloff of the wide halo. Larger is tighter."
                  },
                  "glowFalloff": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 16,
                    "default": 4.2,
                    "description": "Falloff of the core. Larger is tighter."
                  },
                  "haloMix": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.88,
                    "description": "How far the halo may push the sky towards its colour."
                  },
                  "stretchBase": {
                    "type": "number",
                    "minimum": 0.4,
                    "maximum": 3,
                    "default": 0.95,
                    "description": "Horizontal stretch of the light."
                  },
                  "stretchPerAspect": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.24,
                    "description": "Extra stretch on wide screens."
                  }
                },
                "additionalProperties": false
              },
              "wave": {
                "type": "object",
                "properties": {
                  "drift": {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 0.1,
                        "default": 0.03
                      },
                      {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 0.1,
                        "default": 0.022
                      }
                    ],
                    "minItems": 2,
                    "maxItems": 2,
                    "default": [
                      0.03,
                      0.022
                    ],
                    "description": "How far the light drifts, as a share of the screen."
                  },
                  "breathe": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 0.1,
                    "default": 0.028,
                    "description": "How much the light grows and shrinks."
                  },
                  "warp": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 0.6,
                    "default": 0.28,
                    "description": "How much slow noise bends the light's outline."
                  }
                },
                "additionalProperties": false
              },
              "fixedLight": {
                "type": "object",
                "properties": {
                  "at": {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number",
                        "minimum": -0.5,
                        "maximum": 1.5,
                        "default": 0.5
                      },
                      {
                        "type": "number",
                        "minimum": -1,
                        "maximum": 1.5,
                        "default": -0.18
                      }
                    ],
                    "minItems": 2,
                    "maxItems": 2,
                    "default": [
                      0.5,
                      -0.18
                    ]
                  },
                  "radius": {
                    "type": "number",
                    "minimum": 0.2,
                    "maximum": 3,
                    "default": 0.86
                  }
                },
                "additionalProperties": false,
                "description": "Hold the light in one place all day instead of following the palette."
              },
              "weather": {
                "type": "boolean",
                "default": true,
                "description": "Let the weather change the light, when the person has turned weather on."
              }
            },
            "required": [
              "type"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "description": "A picture from the design's assets, or one per time of day, full screen or placed, blended over the layers below.",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]{0,23}$"
              },
              "type": {
                "const": "image@1"
              },
              "src": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]*$",
                "description": "The picture, by asset name. Or use schedule."
              },
              "schedule": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 23.99,
                      "default": 12
                    },
                    "src": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9-]*$",
                      "description": "The name of a picture in the design's assets."
                    }
                  },
                  "additionalProperties": false
                },
                "minItems": 0,
                "maxItems": 12,
                "description": "A picture per time of day: each takes over at its hour on the canonical day."
              },
              "fade": {
                "type": "number",
                "minimum": 0,
                "maximum": 6,
                "default": 1,
                "description": "Hours either side of each change in the schedule over which pictures crossfade."
              },
              "fit": {
                "type": "string",
                "enum": [
                  "cover",
                  "contain"
                ],
                "default": "cover",
                "description": "cover fills the screen; contain places the whole picture at the anchor."
              },
              "anchor": {
                "type": "string",
                "enum": [
                  "top-left",
                  "top",
                  "top-right",
                  "left",
                  "centre",
                  "right",
                  "bottom-left",
                  "bottom",
                  "bottom-right"
                ],
                "default": "centre",
                "description": "Where a contained picture sits."
              },
              "scale": {
                "type": "number",
                "minimum": 0.1,
                "maximum": 1,
                "default": 0.5,
                "description": "A contained picture's size, as a share of the screen's shorter side."
              },
              "opacity": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "default": 1
              },
              "blend": {
                "type": "string",
                "enum": [
                  "normal",
                  "multiply",
                  "screen",
                  "soft-light",
                  "overlay"
                ],
                "default": "normal",
                "description": "How the picture combines with the layers below."
              },
              "hover": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]*$",
                "description": "A picture shown while the pointer is over a contained picture."
              },
              "dim": {
                "type": "string",
                "enum": [
                  "darken",
                  "keep"
                ],
                "default": "darken",
                "description": "Whether the picture darkens with dimmed daylight."
              }
            },
            "required": [
              "type"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "layout": {
      "oneOf": [
        {
          "type": "string",
          "enum": [
            "corner",
            "centre"
          ]
        },
        {
          "type": "object",
          "properties": {
            "slots": {
              "type": "object",
              "maxProperties": 4,
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "anchor": {
                    "type": "string",
                    "enum": [
                      "top-left",
                      "top",
                      "top-right",
                      "left",
                      "centre",
                      "right",
                      "bottom-left",
                      "bottom"
                    ],
                    "description": "Where the slot sits; bottom-right is kept for the settings control."
                  },
                  "sample": {
                    "type": "string",
                    "enum": [
                      "box",
                      "zone"
                    ],
                    "default": "box",
                    "description": "Where text colour is judged from: box, what is behind the text; zone, a fixed area around the anchor, for content that grows."
                  }
                },
                "required": [
                  "anchor"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "slots"
          ],
          "additionalProperties": false
        }
      ],
      "default": "corner",
      "description": "A preset, or slots of your own. \"corner\" has \"main\" (bottom-left) and \"top\" (top-right); \"centre\" has \"main\" (centre) and \"top\" (top-right)."
    },
    "components": {
      "type": "array",
      "maxItems": 6,
      "items": {
        "oneOf": [
          {
            "type": "object",
            "description": "\"Good morning\" and so on, with the person's name if they gave one. The words are Winkledor's own.",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]{0,23}$"
              },
              "type": {
                "const": "greeting@1"
              },
              "slot": {
                "type": "string"
              },
              "style": {
                "type": "object",
                "properties": {
                  "font": {
                    "oneOf": [
                      {
                        "type": "string",
                        "enum": [
                          "system",
                          "serif",
                          "rounded",
                          "mono",
                          "geometric",
                          "humanist",
                          "classic",
                          "didone",
                          "slab"
                        ]
                      },
                      {
                        "type": "string",
                        "pattern": "^asset:([a-z][a-z0-9-]{0,31})$"
                      }
                    ],
                    "description": "A font family every computer has, or \"asset:<name>\" for a font file in the design's assets."
                  },
                  "scale": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 2.5,
                    "description": "Size, relative to the design's."
                  },
                  "weight": {
                    "type": "number",
                    "minimum": 200,
                    "maximum": 700
                  },
                  "tracking": {
                    "type": "number",
                    "minimum": -0.05,
                    "maximum": 0.15,
                    "description": "Letter spacing, in em."
                  },
                  "hide": {
                    "type": "boolean",
                    "description": "Not shown in this design."
                  }
                },
                "additionalProperties": false
              }
            },
            "required": [
              "type"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "description": "The time, and the date if wanted. 12 or 24 hours is the person's setting.",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]{0,23}$"
              },
              "type": {
                "const": "clock@1"
              },
              "slot": {
                "type": "string"
              },
              "style": {
                "type": "object",
                "properties": {
                  "font": {
                    "oneOf": [
                      {
                        "type": "string",
                        "enum": [
                          "system",
                          "serif",
                          "rounded",
                          "mono",
                          "geometric",
                          "humanist",
                          "classic",
                          "didone",
                          "slab"
                        ]
                      },
                      {
                        "type": "string",
                        "pattern": "^asset:([a-z][a-z0-9-]{0,31})$"
                      }
                    ],
                    "description": "A font family every computer has, or \"asset:<name>\" for a font file in the design's assets."
                  },
                  "scale": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 2.5,
                    "description": "Size, relative to the design's."
                  },
                  "weight": {
                    "type": "number",
                    "minimum": 200,
                    "maximum": 700
                  },
                  "tracking": {
                    "type": "number",
                    "minimum": -0.05,
                    "maximum": 0.15,
                    "description": "Letter spacing, in em."
                  },
                  "hide": {
                    "type": "boolean",
                    "description": "Not shown in this design."
                  }
                },
                "additionalProperties": false
              },
              "date": {
                "type": "boolean",
                "default": true,
                "description": "Show the date beside the time."
              }
            },
            "required": [
              "type"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "description": "The person's quick links as one small row, if they turned links on. The links are theirs, never the design's.",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9-]{0,23}$"
              },
              "type": {
                "const": "links@1"
              },
              "slot": {
                "type": "string"
              },
              "style": {
                "type": "object",
                "properties": {
                  "font": {
                    "oneOf": [
                      {
                        "type": "string",
                        "enum": [
                          "system",
                          "serif",
                          "rounded",
                          "mono",
                          "geometric",
                          "humanist",
                          "classic",
                          "didone",
                          "slab"
                        ]
                      },
                      {
                        "type": "string",
                        "pattern": "^asset:([a-z][a-z0-9-]{0,31})$"
                      }
                    ],
                    "description": "A font family every computer has, or \"asset:<name>\" for a font file in the design's assets."
                  },
                  "scale": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 2.5,
                    "description": "Size, relative to the design's."
                  },
                  "weight": {
                    "type": "number",
                    "minimum": 200,
                    "maximum": 700
                  },
                  "tracking": {
                    "type": "number",
                    "minimum": -0.05,
                    "maximum": 0.15,
                    "description": "Letter spacing, in em."
                  },
                  "hide": {
                    "type": "boolean",
                    "description": "Not shown in this design."
                  }
                },
                "additionalProperties": false
              }
            },
            "required": [
              "type"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "type": {
      "type": "object",
      "properties": {
        "font": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "system",
                "serif",
                "rounded",
                "mono",
                "geometric",
                "humanist",
                "classic",
                "didone",
                "slab"
              ]
            },
            {
              "type": "string",
              "pattern": "^asset:([a-z][a-z0-9-]{0,31})$"
            }
          ],
          "default": "system",
          "description": "A font family every computer has, or \"asset:<name>\" for a font file in the design's assets."
        },
        "hero": {
          "type": "object",
          "properties": {
            "size": {
              "type": "object",
              "properties": {
                "min": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 200,
                  "default": 32,
                  "description": "Pixels, on the smallest screens."
                },
                "fluid": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 10,
                      "default": 1.9
                    },
                    {
                      "type": "number",
                      "minimum": -50,
                      "maximum": 100,
                      "default": 14
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2,
                  "default": [
                    1.9,
                    14
                  ],
                  "description": "In between: a share of the screen width (in vw) plus pixels."
                },
                "max": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 240,
                  "default": 66,
                  "description": "Pixels, on the largest screens."
                }
              },
              "additionalProperties": false
            },
            "weight": {
              "type": "number",
              "minimum": 200,
              "maximum": 700,
              "default": 300
            },
            "tracking": {
              "type": "number",
              "minimum": -0.05,
              "maximum": 0.15,
              "default": -0.024,
              "description": "Letter spacing, in em."
            }
          },
          "additionalProperties": false,
          "description": "The headline of each slot: the greeting, or the time when it stands alone."
        },
        "meta": {
          "type": "object",
          "properties": {
            "size": {
              "type": "object",
              "properties": {
                "min": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 200,
                  "default": 14,
                  "description": "Pixels, on the smallest screens."
                },
                "fluid": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 10,
                      "default": 0.42
                    },
                    {
                      "type": "number",
                      "minimum": -50,
                      "maximum": 100,
                      "default": 9.5
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2,
                  "default": [
                    0.42,
                    9.5
                  ],
                  "description": "In between: a share of the screen width (in vw) plus pixels."
                },
                "max": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 240,
                  "default": 18,
                  "description": "Pixels, on the largest screens."
                }
              },
              "additionalProperties": false
            },
            "weight": {
              "type": "number",
              "minimum": 200,
              "maximum": 700,
              "default": 400
            }
          },
          "additionalProperties": false,
          "description": "Everything else: the date, the time under a greeting, links."
        },
        "edge": {
          "type": "object",
          "properties": {
            "min": {
              "type": "number",
              "minimum": 0,
              "maximum": 200,
              "default": 24,
              "description": "Pixels, on the smallest screens."
            },
            "fluid": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 10,
                  "default": 3.4
                },
                {
                  "type": "number",
                  "minimum": -50,
                  "maximum": 100,
                  "default": 0
                }
              ],
              "minItems": 2,
              "maxItems": 2,
              "default": [
                3.4,
                0
              ],
              "description": "In between: a share of the screen width (in vw) plus pixels."
            },
            "max": {
              "type": "number",
              "minimum": 0,
              "maximum": 240,
              "default": 64,
              "description": "Pixels, on the largest screens."
            }
          },
          "additionalProperties": false,
          "description": "How far text sits from the edges of the screen."
        }
      },
      "additionalProperties": false
    },
    "motion": {
      "type": "object",
      "properties": {
        "style": {
          "type": "string",
          "enum": [
            "rise",
            "fade",
            "slide",
            "blur",
            "letters"
          ],
          "default": "rise",
          "description": "How text arrives and leaves: rise (up out of a slight blur), fade, slide (in from the side), blur, or letters (one after another)."
        },
        "arrive": {
          "type": "number",
          "minimum": 0,
          "maximum": 2000,
          "default": 720,
          "description": "Milliseconds for text to arrive."
        },
        "leave": {
          "type": "number",
          "minimum": 0,
          "maximum": 1200,
          "default": 340,
          "description": "Milliseconds for text to leave."
        },
        "stagger": {
          "type": "number",
          "minimum": 0,
          "maximum": 300,
          "default": 70,
          "description": "Milliseconds between one line and the next."
        },
        "rise": {
          "type": "number",
          "minimum": 0,
          "maximum": 24,
          "default": 6,
          "description": "Pixels text travels as it arrives."
        },
        "blur": {
          "type": "number",
          "minimum": 0,
          "maximum": 12,
          "default": 5,
          "description": "Pixels of blur text arrives out of."
        },
        "easeArrive": {
          "type": "array",
          "prefixItems": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0
            },
            {
              "type": "number",
              "minimum": -1,
              "maximum": 2,
              "default": 0
            },
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0
            },
            {
              "type": "number",
              "minimum": -1,
              "maximum": 2,
              "default": 0
            }
          ],
          "minItems": 4,
          "maxItems": 4,
          "default": [
            0.2,
            0.7,
            0.2,
            1
          ],
          "description": "A cubic Bezier easing, [x1, y1, x2, y2]."
        },
        "easeLeave": {
          "type": "array",
          "prefixItems": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0
            },
            {
              "type": "number",
              "minimum": -1,
              "maximum": 2,
              "default": 0
            },
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0
            },
            {
              "type": "number",
              "minimum": -1,
              "maximum": 2,
              "default": 0
            }
          ],
          "minItems": 4,
          "maxItems": 4,
          "default": [
            0.5,
            0,
            0.8,
            0.3
          ],
          "description": "A cubic Bezier easing, [x1, y1, x2, y2]."
        }
      },
      "additionalProperties": false
    },
    "ink": {
      "type": "object",
      "properties": {
        "dark": {
          "type": "number",
          "minimum": 0,
          "maximum": 0.3,
          "default": 0.22,
          "description": "Lightness of dark text, 0 black to 1 white."
        },
        "light": {
          "type": "number",
          "minimum": 0.9,
          "maximum": 1,
          "default": 0.985,
          "description": "Lightness of light text."
        },
        "minContrast": {
          "type": "number",
          "minimum": 4.6,
          "maximum": 7,
          "default": 4.6,
          "description": "The least contrast text may have against what is behind it; never below 4.6."
        },
        "tint": {
          "type": "string",
          "maxLength": 7,
          "pattern": "^#[0-9a-f]{6}$",
          "description": "A colour to lean the text towards."
        },
        "tintAmount": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "default": 0.6,
          "description": "How far towards the tint, before the contrast floor has its say."
        }
      },
      "additionalProperties": false
    },
    "options": {
      "type": "array",
      "maxItems": 3,
      "description": "Short rows the design offers in the settings panel. The first choice is the default.",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9-]{0,23}$"
          },
          "label": {
            "type": "string",
            "maxLength": 12,
            "description": "Title Case."
          },
          "choices": {
            "type": "array",
            "minItems": 2,
            "maxItems": 4,
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9-]{0,23}$"
                },
                "label": {
                  "type": "string",
                  "maxLength": 12
                },
                "set": {
                  "type": "object",
                  "description": "Paths in this design to new values, e.g. { \"layers.sky.character\": \"mono\" }.",
                  "propertyNames": {
                    "pattern": "^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)*$"
                  }
                }
              },
              "required": [
                "id",
                "label"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "label",
          "choices"
        ],
        "additionalProperties": false
      }
    },
    "assets": {
      "type": "object",
      "maxProperties": 16,
      "additionalProperties": {
        "type": "object",
        "description": "A picture (width and height in pixels) or a font (width and height 0).",
        "properties": {
          "type": {
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp",
              "image/avif",
              "font/woff2",
              "font/woff",
              "font/ttf",
              "font/otf"
            ]
          },
          "width": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3840
          },
          "height": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3840
          },
          "data": {
            "type": "string",
            "contentEncoding": "base64",
            "maxLength": 2800000
          }
        },
        "required": [
          "type",
          "width",
          "height",
          "data"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "winkledor",
    "id",
    "name",
    "version",
    "license",
    "layers"
  ],
  "additionalProperties": false
}
