{
  "$id": "https://stillwarddisplay.com/schema/widget.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "description": "A widget: a card and what is on it. At most 64 KB, 64 items and 8 pictures; pictures are PNG or SVG files in the same folder.",
  "properties": {
    "$schema": {
      "type": "string"
    },
    "ground": {
      "additionalProperties": false,
      "properties": {
        "edge": {
          "description": "A hairline just inside the card's edge, brighter at the top.",
          "type": "boolean"
        },
        "family": {
          "description": "The family every word of the widget is set in; a line may name its own. One of: segoe (Segoe UI Variable), bahnschrift (Bahnschrift), bahnschrift-narrow (Bahnschrift), montserrat (Montserrat), raleway (Raleway), unbounded (Unbounded), oswald (Oswald), exo (Exo 2), mono (JetBrains Mono), cormorant (Cormorant), comfortaa (Comfortaa), russo (Russo One), wet-paint (Rubik Wet Paint), spray-paint (Rubik Spray Paint), glitch (Rubik Glitch), stalinist (Stalinist One), tektur (Tektur), jura (Jura), rubik-mono (Rubik Mono One).",
          "enum": [
            "segoe",
            "bahnschrift",
            "bahnschrift-narrow",
            "montserrat",
            "raleway",
            "unbounded",
            "oswald",
            "exo",
            "mono",
            "cormorant",
            "comfortaa",
            "russo",
            "wet-paint",
            "spray-paint",
            "glitch",
            "stalinist",
            "tektur",
            "jura",
            "rubik-mono"
          ],
          "type": "string"
        },
        "fill": {
          "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
          "pattern": "^(none|ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
          "type": "string"
        },
        "fill2": {
          "description": "A colour the ground fades to from top to bottom.",
          "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
          "type": "string"
        },
        "opacity": {
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "radius": {
          "maximum": 64,
          "minimum": 0,
          "type": "number"
        },
        "shadow": {
          "description": "A soft shadow under everything drawn, so words with no card under them read on a light wallpaper.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        }
      },
      "type": "object"
    },
    "items": {
      "description": "Drawn in order, the last on top. An item of a kind this version does not know is left out, not the file.",
      "items": {
        "oneOf": [
          {
            "additionalProperties": false,
            "properties": {
              "align": {
                "enum": [
                  "start",
                  "middle",
                  "end"
                ]
              },
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "colour2": {
                "description": "A colour the words fade to from left to right.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "family": {
                "description": "This line's own family, over the widget's. One of: segoe (Segoe UI Variable), bahnschrift (Bahnschrift), bahnschrift-narrow (Bahnschrift), montserrat (Montserrat), raleway (Raleway), unbounded (Unbounded), oswald (Oswald), exo (Exo 2), mono (JetBrains Mono), cormorant (Cormorant), comfortaa (Comfortaa), russo (Russo One), wet-paint (Rubik Wet Paint), spray-paint (Rubik Spray Paint), glitch (Rubik Glitch), stalinist (Stalinist One), tektur (Tektur), jura (Jura), rubik-mono (Rubik Mono One).",
                "enum": [
                  "segoe",
                  "bahnschrift",
                  "bahnschrift-narrow",
                  "montserrat",
                  "raleway",
                  "unbounded",
                  "oswald",
                  "exo",
                  "mono",
                  "cormorant",
                  "comfortaa",
                  "russo",
                  "wet-paint",
                  "spray-paint",
                  "glitch",
                  "stalinist",
                  "tektur",
                  "jura",
                  "rubik-mono"
                ],
                "type": "string"
              },
              "fit": {
                "description": "Made smaller to fit the box rather than cut short.",
                "type": "boolean"
              },
              "font": {
                "maximum": 160.0,
                "minimum": 6.0,
                "type": "number"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "text": {
                "description": "Words, with any of these in braces for what the program knows: {time}, {time.seconds}, {time.h}, {time.m}, {ampm}, {date}, {date.long}, {date.monthday}, {weekday}, {weekday.short}, {day}, {month}, {month.short}, {year}, {cpu}, {ram}, {ram.used}, {ram.total}, {gpu}, {net.down}, {net.up}, {battery}, {battery.state}, {uptime}, {media.title}, {media.artist}, {media.position}, {media.length}, {media.progress}, {volume}, {desk}, {desk.number}, {desk.count}, {preset}, {timer}, {rec.time}, {game.time}, {download}, {download.percent}, {download.progress}, {call.app}, {output}, {headset.battery}, {shelf}, {agent.state}, {agent.project}, {agent.say}, {agent.allow}, {agent.deny}; {disk.c}, {disk.c.free} for any drive letter; and {time@Tokyo Standard Time}, {offset@Tokyo Standard Time} for the time in a zone, by Windows' own id, and how far it is from yours.",
                "maxLength": 200,
                "type": "string"
              },
              "touch": {
                "description": "What the words do as the pointer passes over them: smear as wet paint does and run back, or tear and split as a broken signal.",
                "enum": [
                  "still",
                  "smear",
                  "glitch"
                ]
              },
              "tracking": {
                "description": "Room between the letters beyond the face's own, in ems.",
                "maximum": 0.6000000238418579,
                "minimum": -0.10000000149011612,
                "type": "number"
              },
              "type": {
                "const": "text"
              },
              "upper": {
                "description": "In capitals, whatever the words are.",
                "type": "boolean"
              },
              "weight": {
                "maximum": 900,
                "minimum": 100,
                "type": "integer"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "text"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "track": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "type": {
                "const": "bar"
              },
              "value": {
                "description": "A number the program knows, 0 to 100 (the network's in bytes a second).",
                "enum": [
                  "cpu",
                  "ram",
                  "gpu",
                  "battery",
                  "volume",
                  "net.down",
                  "net.up",
                  "media.progress",
                  "download.progress"
                ],
                "type": "string"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "value"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "track": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "type": {
                "const": "ring"
              },
              "value": {
                "description": "A number the program knows, 0 to 100 (the network's in bytes a second).",
                "enum": [
                  "cpu",
                  "ram",
                  "gpu",
                  "battery",
                  "volume",
                  "net.down",
                  "net.up",
                  "media.progress",
                  "download.progress"
                ],
                "type": "string"
              },
              "width": {
                "minimum": 1,
                "type": "number"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "value"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "fill": {
                "type": "boolean"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "seconds": {
                "maximum": 600,
                "minimum": 10,
                "type": "integer"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "graph"
              },
              "value": {
                "description": "A number the program knows, 0 to 100 (the network's in bytes a second).",
                "enum": [
                  "cpu",
                  "ram",
                  "gpu",
                  "battery",
                  "volume",
                  "net.down",
                  "net.up",
                  "media.progress",
                  "download.progress"
                ],
                "type": "string"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "value"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "glyph": {
                "enum": [
                  "play",
                  "pause",
                  "stop",
                  "previous",
                  "next",
                  "volume",
                  "mute",
                  "clock",
                  "calendar",
                  "wifi",
                  "download",
                  "upload",
                  "battery",
                  "monitor",
                  "settings",
                  "home",
                  "star",
                  "music",
                  "video",
                  "game",
                  "sun",
                  "cloud",
                  "search",
                  "folder",
                  "mail",
                  "person",
                  "pin",
                  "stopwatch",
                  "chart",
                  "desks",
                  "power",
                  "heart",
                  "switch",
                  "terminal",
                  "back",
                  "forward"
                ],
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "glyph"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "glyph"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "file": {
                "pattern": "^[^\\\\/:.][^\\\\/:]*\\.([pP][nN][gG]|[sS][vV][gG])$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "image"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "file"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "action": {
                "pattern": "^(media\\.toggle|media\\.next|media\\.previous|volume\\.mute|volume\\.up|volume\\.down|find-pointer|open|rec\\.pause|rec\\.stop|timer\\.pause|timer\\.stop|calendar\\.previous|calendar\\.next|calendar\\.today|media\\.player|agent\\.allow|agent\\.deny|desk:([1-9]|1[0-9]|20)|preset:([1-9]|1[0-9]|20)|timer\\.start:([1-9]|[1-9][0-9]|1[01][0-9]|120))$",
                "type": "string"
              },
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "bare": {
                "description": "Its glyph or words alone, without the pad under them.",
                "type": "boolean"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "glyph": {
                "enum": [
                  "play",
                  "pause",
                  "stop",
                  "previous",
                  "next",
                  "volume",
                  "mute",
                  "clock",
                  "calendar",
                  "wifi",
                  "download",
                  "upload",
                  "battery",
                  "monitor",
                  "settings",
                  "home",
                  "star",
                  "music",
                  "video",
                  "game",
                  "sun",
                  "cloud",
                  "search",
                  "folder",
                  "mail",
                  "person",
                  "pin",
                  "stopwatch",
                  "chart",
                  "desks",
                  "power",
                  "heart",
                  "switch",
                  "terminal",
                  "back",
                  "forward"
                ],
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "text": {
                "maxLength": 60,
                "type": "string"
              },
              "type": {
                "const": "button"
              }
            },
            "required": [
              "type",
              "at",
              "size",
              "action"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "desks"
              }
            },
            "required": [
              "type",
              "at",
              "size"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "rect"
              }
            },
            "required": [
              "type",
              "at",
              "size"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "dial": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(none|ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "face": {
                "enum": [
                  "ticks",
                  "numbers",
                  "dots",
                  "bare"
                ]
              },
              "hand": {
                "description": "The second hand's colour.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "seconds": {
                "type": "boolean"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "clock"
              },
              "zone": {
                "description": "Windows' own id of a time zone, such as \"Tokyo Standard Time\" (tzutil /l lists them); none, the computer's own.",
                "pattern": "^[A-Za-z0-9 .+()-]{1,64}$",
                "type": "string"
              }
            },
            "required": [
              "type",
              "at",
              "size"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "today": {
                "description": "The ring round today.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "type": {
                "const": "calendar"
              }
            },
            "required": [
              "type",
              "at",
              "size"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "cover"
              }
            },
            "required": [
              "type",
              "at",
              "size"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "at": {
                "description": "Top left on the card, in points.",
                "items": {
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "bars": {
                "description": "How many bars, from the bass up.",
                "maximum": 48,
                "minimum": 4,
                "type": "integer"
              },
              "colour": {
                "description": "A colour word: ink and ink-2 (the card's text, light or dark to suit it), steel or accent with a shade 1 to 5 (lightest to darkest), or #rrggbb; /0.5 after any makes it see-through.",
                "pattern": "^(ink|ink-2|steel(:[1-5])?|accent(:[1-5])?|#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))(/(0(\\.[0-9]+)?|1(\\.0+)?))?$",
                "type": "string"
              },
              "form": {
                "description": "Bars standing on the foot, mirrored about the middle, a filled line over the tops, or columns of dots.",
                "enum": [
                  "bars",
                  "mirror",
                  "line",
                  "dots"
                ]
              },
              "opacity": {
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "maximum": 64,
                "minimum": 0,
                "type": "number"
              },
              "size": {
                "description": "Width and height, in points; moved and cut to stay on the card.",
                "items": {
                  "minimum": 1,
                  "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
              },
              "type": {
                "const": "spectrum"
              }
            },
            "required": [
              "type",
              "at",
              "size"
            ],
            "type": "object"
          }
        ]
      },
      "maxItems": 64,
      "type": "array"
    },
    "name": {
      "maxLength": 64,
      "type": "string"
    },
    "size": {
      "description": "The card's width and height in points at 100 %.",
      "items": {
        "maximum": 1200.0,
        "minimum": 40.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 2,
      "type": "array"
    },
    "version": {
      "maximum": 1,
      "minimum": 1,
      "type": "integer"
    }
  },
  "required": [
    "name",
    "size"
  ],
  "title": "Stillward Display widget",
  "type": "object"
}
