{
  "scriptappy": "1.0.0",
  "info": {
    "name": "@nebula.js/supernova",
    "version": "0.2.0",
    "license": "MIT",
    "stability": "experimental"
  },
  "entries": {
    "useState": {
      "description": "Creates a stateful value.",
      "templates": [
        {
          "name": "S"
        }
      ],
      "kind": "function",
      "params": [
        {
          "name": "initialState",
          "description": "The initial state.",
          "kind": "union",
          "items": [
            {
              "type": "S"
            },
            {
              "kind": "function",
              "params": [],
              "returns": {
                "type": "S"
              }
            }
          ]
        }
      ],
      "returns": {
        "description": "The value and a function to update it.",
        "kind": "array",
        "items": [
          {
            "type": "S"
          },
          {
            "type": "#/definitions/SetStateFn",
            "generics": [
              {
                "type": "S"
              }
            ]
          }
        ]
      },
      "examples": [
        "import { useState } from '@nebula.js/supernova';\n// ...\n// initiate with simple primitive value\nconst [zoomed, setZoomed] = useState(false);\n\n// update\nsetZoomed(true);\n\n// lazy initiation\nconst [value, setValue] = useState(() => heavy());"
      ]
    },
    "useEffect": {
      "description": "Triggers a callback function when a dependant value changes.",
      "kind": "function",
      "params": [
        {
          "name": "effect",
          "description": "The callback.",
          "type": "#/definitions/EffectCallback"
        },
        {
          "name": "deps",
          "description": "The dependencies which should trigger the callback.",
          "optional": true,
          "kind": "array",
          "items": {
            "type": "any"
          }
        }
      ],
      "examples": [
        "import { useEffect } from '@nebula.js/supernova';\n// ...\nuseEffect(() => {\n  console.log('mounted');\n  return () => {\n    console.log('unmounted');\n  };\n}, []);"
      ]
    },
    "useMemo": {
      "description": "Creates a stateful value when a dependant changes.",
      "templates": [
        {
          "name": "T"
        }
      ],
      "kind": "function",
      "params": [
        {
          "name": "factory",
          "description": "The factory function.",
          "kind": "function",
          "params": [],
          "returns": {
            "type": "T"
          }
        },
        {
          "name": "deps",
          "description": "The dependencies.",
          "kind": "array",
          "items": {
            "type": "any"
          }
        }
      ],
      "returns": {
        "description": "The value returned from the factory function.",
        "type": "T"
      },
      "examples": [
        "import { useMemo } from '@nebula.js/supernova';\n// ...\nconst v = useMemo(() => {\n  return doSomeHeavyCalculation();\n}), []);"
      ]
    },
    "usePromise": {
      "description": "Runs a callback function when a dependant changes.",
      "templates": [
        {
          "name": "P"
        }
      ],
      "kind": "function",
      "params": [
        {
          "name": "factory",
          "description": "The factory function that calls the promise.",
          "kind": "function",
          "params": [],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "P"
              }
            ]
          }
        },
        {
          "name": "deps",
          "description": "The dependencies.",
          "optional": true,
          "kind": "array",
          "items": {
            "type": "any"
          }
        }
      ],
      "returns": {
        "description": "The resolved value.",
        "kind": "array",
        "items": [
          {
            "type": "P"
          },
          {
            "type": "Error"
          }
        ]
      },
      "examples": [
        "import { usePromise } from '@nebula.js/supernova';\nimport { useModel } from '@nebula.js/supernova';\n// ...\nconst model = useModel();\nconst [resolved, rejected] = usePromise(() => model.getLayout(), []);"
      ]
    },
    "useElement": {
      "description": "Gets the HTMLElement this supernova is rendered into.",
      "kind": "function",
      "params": [],
      "returns": {
        "type": "HTMLElement"
      },
      "examples": [
        "import { useElement } from '@nebula.js/supernova';\n// ...\nconst el = useElement();\nel.innerHTML = 'Hello!';"
      ]
    },
    "useRect": {
      "description": "Gets the size of the HTMLElement the supernova is rendered into.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The size of the element.",
        "type": "#/definitions/Rect"
      },
      "examples": [
        "import { useRect } from '@nebula.js/supernova';\n// ...\nconst rect = useRect();\nuseEffect(() => {\n  console.log('resize');\n}, [rect.width, rect.height])"
      ]
    },
    "useLayout": {
      "description": "Gets the layout of the generic object associated with this supernova.",
      "kind": "function",
      "params": [],
      "returns": {
        "type": "qae.GenericObjectLayout"
      },
      "examples": [
        "import { useLayout } from '@nebula.js/supernova';\n// ...\nconst layout = useLayout();\nconsole.log(layout);"
      ]
    },
    "useStaleLayout": {
      "description": "Gets the layout of the generic object associated with this supernova.\n\nUnlike the regular layout, a _stale_ layout is not changed when a generic object enters\nthe modal state. This is mostly notable in that `qSelectionInfo.qInSelections` in the layout is\nalways `false`.\nThe returned value from `useStaleLayout()` and `useLayout()` are identical when the object\nis not in a modal state.",
      "kind": "function",
      "params": [],
      "returns": {
        "type": "qae.GenericObjectLayout"
      },
      "examples": [
        "import { useStaleLayout } from '@nebula.js/supernova';\n// ...\nconst staleLayout = useStaleLayout();\nconsole.log(staleLayout);"
      ]
    },
    "useAppLayout": {
      "description": "Gets the layout of the app associated with this supernova.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The app layout",
        "type": "qae.NxAppLayout"
      },
      "examples": [
        "import { useAppLayout } from '@nebula.js/supernova';\n// ...\nconst appLayout = useAppLayout();\nconsole.log(appLayout.qLocaleInfo);"
      ]
    },
    "useModel": {
      "description": "Gets the generic object API of the generic object connected to this supernova.",
      "kind": "function",
      "params": [],
      "returns": {
        "kind": "union",
        "items": [
          {
            "type": "enigma.GenericObject"
          },
          {
            "type": "undefined"
          }
        ]
      },
      "examples": [
        "import { useModel } from '@nebula.js/supernova';\n// ...\nconst model = useModel();\nuseEffect(() => {\n  model.getInfo().then(info => {\n    console.log(info);\n  })\n}, []);"
      ]
    },
    "useApp": {
      "description": "Gets the doc API.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The doc API.",
        "kind": "union",
        "items": [
          {
            "type": "enigma.Doc"
          },
          {
            "type": "undefined"
          }
        ]
      },
      "examples": [
        "import { useApp } from '@nebula.js/supernova';\n// ...\nconst app = useApp();\nuseEffect(() => {\n  app.getAllInfos().then(infos => {\n    console.log(infos);\n  })\n}, []);"
      ]
    },
    "useGlobal": {
      "description": "Gets the global API.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The global API.",
        "kind": "union",
        "items": [
          {
            "type": "enigma.Global"
          },
          {
            "type": "undefined"
          }
        ]
      },
      "examples": [
        "import { useGlobal } from '@nebula.js/supernova';\n\n// ...\nconst g = useGlobal();\nuseEffect(() => {\n  g.engineVersion().then(version => {\n    console.log(version);\n  })\n}, []);"
      ]
    },
    "useSelections": {
      "description": "Gets the object selections.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The object selections.",
        "type": "#/definitions/ObjectSelections"
      },
      "examples": [
        "import { useSelections } from '@nebula.js/supernova';\nimport { useElement } from '@nebula.js/supernova';\nimport { useEffect } from '@nebula.js/supernova';\n// ...\nconst selections = useSelections();\nconst element = useElement();\nuseEffect(() => {\n  const onClick = () => {\n    selections.begin('/qHyperCubeDef');\n  };\n  element.addEventListener('click', onClick);\n  return () => {\n    element.removeEventListener('click', onClick);\n  };\n}, []);"
      ]
    },
    "useTheme": {
      "description": "Gets the theme.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The theme.",
        "type": "#/definitions/Theme"
      },
      "examples": [
        "import { useTheme } from '@nebula.js/supernova';\n\nconst theme = useTheme();\nconsole.log(theme.getContrastinColorTo('#ff0000'));"
      ]
    },
    "useTranslator": {
      "description": "Gets the translator.",
      "kind": "function",
      "params": [],
      "returns": {
        "description": "The translator.",
        "type": "#/definitions/Translator"
      },
      "examples": [
        "import { useTranslator } from '@nebula.js/supernova';\n// ...\nconst translator = useTranslator();\nconsole.log(translator.get('SomeString'));"
      ]
    },
    "useAction": {
      "description": "Registers a custom action.",
      "templates": [
        {
          "name": "A"
        }
      ],
      "kind": "function",
      "params": [
        {
          "name": "factory",
          "kind": "function",
          "params": [],
          "returns": {
            "type": "#/definitions/ActionDefinition",
            "generics": [
              {
                "type": "A"
              }
            ]
          }
        },
        {
          "name": "deps",
          "optional": true,
          "kind": "array",
          "items": {
            "type": "any"
          }
        }
      ],
      "returns": {
        "type": "A"
      },
      "examples": [
        "import { useAction } from '@nebula.js/supernova';\n// ...\nconst [zoomed, setZoomed] = useState(false);\nconst act = useAction(() => ({\n  hidden: false,\n  disabled: zoomed,\n  action() {\n    setZoomed(prev => !prev);\n  },\n  icon: {}\n}), [zoomed]);"
      ]
    },
    "useConstraints": {
      "description": "Gets the desired constraints that should be applied when rendering the supernova.\n\nThe constraints are set on the nuclues configuration before the supernova is rendered\nand should respected by you when implementing the supernova.",
      "kind": "function",
      "params": [],
      "returns": {
        "type": "#/definitions/Constraints"
      },
      "examples": [
        "// configure nucleus to disallow active interactions when rendering\nnucleus(app, {\n  constraints: {\n    active: true, // do not allow interactions\n  }\n}).render({ element, id: 'sdfsdf' });",
        "import { useConstraints } from '@nebula.js/supernova';\n// ...\nconst constraints = useConstraints();\nuseEffect(() => {\n  if (constraints.active) {\n    // do not add any event listener if active constraint is set\n    return undefined;\n  }\n  const listener = () => {};\n  element.addEventListener('click', listener);\n  return () => {\n    element.removeEventListener('click', listener);\n  };\n}, [constraints])"
      ]
    },
    "useOptions": {
      "description": "Gets the options object provided when rendering the supernova.\n\nThis is an empty object by default but enables customization of the supernova through this object.\nOptions are different from setting properties on the generic object in that options\nare only temporary settings applied to the supernova when rendered.\n\nYou have the responsibility to provide documentation of the options you support, if any.",
      "kind": "function",
      "params": [],
      "returns": {
        "type": "object"
      },
      "examples": [
        "// when rendering the supernova with nucleus, anything can be set in options\nnucleus(app).render({\n  element,\n  type: 'my-chart',\n  options: {\n    showNavigation: true,\n  }\n});",
        "// it is up to you use and implement the provided options\nimport { useOptions } from '@nebula.js/supernova';\nimport { useEffect } from '@nebula.js/supernova';\n// ...\nconst options = useOptions();\nuseEffect(() => {\n  if (!options.showNavigation) {\n    // hide navigation\n  } else {\n    // show navigation\n  }\n}, [options.showNavigation]);"
      ]
    },
    "onTakeSnapshot": {
      "description": "Registers a callback that is called when a snapshot is taken.",
      "kind": "function",
      "params": [
        {
          "name": "snapshotCallback",
          "kind": "function",
          "params": [
            {
              "type": "qae.GenericObjectLayout"
            }
          ],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "qae.GenericObjectLayout"
              }
            ]
          }
        }
      ],
      "examples": [
        "import { onTakeSnapshot } from '@nebula.js/supernova';\nimport { useState } from '@nebula.js/supernova';\nimport { useLayout } from '@nebula.js/supernova';\n\nconst layout = useLayout();\nconst [zoomed] = useState(layout.isZoomed || false);\n\nonTakeSnapshot((copyOfLayout) => {\n  copyOfLayout.isZoomed = zoomed;\n  return Promise.resolve(copyOfLayout);\n});"
      ]
    }
  },
  "definitions": {
    "Supernova": {
      "description": "The entry point for defining a supernova.",
      "kind": "interface",
      "params": [
        {
          "name": "env",
          "optional": true,
          "type": "object"
        }
      ],
      "returns": {
        "type": "#/definitions/SupernovaDefinition"
      },
      "entries": {},
      "examples": [
        "import { useElement, useLayout } from '@nebula.js/supernova';\n\nexport default function() {\n  return {\n    qae: {\n      properties: {\n        dude: 'Heisenberg',\n      }\n    },\n    component() {\n      const el = useElement();\n      const layout = useLayout();\n      el.innerHTML = `What's my name? ${layout.dude}!!!`;\n    }\n  };\n}"
      ]
    },
    "SupernovaDefinition": {
      "kind": "interface",
      "entries": {
        "qae": {
          "type": "#/definitions/QAEDefinition"
        },
        "component": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "void"
          }
        }
      }
    },
    "SetStateFn": {
      "templates": [
        {
          "name": "S"
        }
      ],
      "kind": "interface",
      "params": [
        {
          "name": "newState",
          "description": "The new state",
          "kind": "union",
          "items": [
            {
              "type": "S"
            },
            {
              "kind": "function",
              "params": [
                {
                  "type": "S"
                }
              ],
              "returns": {
                "type": "S"
              }
            }
          ]
        }
      ],
      "entries": {}
    },
    "EffectCallback": {
      "kind": "alias",
      "items": {
        "kind": "function",
        "params": [],
        "returns": {
          "kind": "union",
          "items": [
            {
              "type": "void"
            },
            {
              "kind": "function",
              "params": [],
              "returns": {
                "type": "void"
              }
            }
          ]
        }
      }
    },
    "Rect": {
      "kind": "interface",
      "entries": {
        "top": {
          "type": "number"
        },
        "left": {
          "type": "number"
        },
        "width": {
          "type": "number"
        },
        "height": {
          "type": "number"
        }
      }
    },
    "ActionDefinition": {
      "templates": [
        {
          "name": "A"
        }
      ],
      "kind": "interface",
      "entries": {
        "action": {
          "type": "A"
        },
        "hidden": {
          "optional": true,
          "type": "boolean"
        },
        "disabled": {
          "optional": true,
          "type": "boolean"
        },
        "icon": {
          "optional": true,
          "kind": "object",
          "entries": {
            "viewBox": {
              "optional": true,
              "defaultValue": "\"0 0 16 16\"",
              "type": "string"
            },
            "shapes": {
              "kind": "array",
              "items": {
                "entries": {
                  "type": {
                    "type": "string"
                  },
                  "attrs": {
                    "optional": true,
                    "type": "object"
                  }
                },
                "kind": "object"
              }
            }
          }
        }
      }
    },
    "Constraints": {
      "kind": "interface",
      "entries": {
        "passive": {
          "optional": true,
          "type": "boolean"
        },
        "active": {
          "optional": true,
          "type": "boolean"
        },
        "select": {
          "optional": true,
          "type": "boolean"
        }
      }
    },
    "QAEDefinition": {
      "kind": "interface",
      "entries": {
        "properties": {
          "optional": true,
          "type": "qae.GenericObjectProperties"
        },
        "data": {
          "optional": true,
          "kind": "object",
          "entries": {
            "targets": {
              "kind": "array",
              "items": {
                "type": "#/definitions/DataTarget"
              }
            }
          }
        }
      }
    },
    "DataTarget": {
      "kind": "interface",
      "entries": {
        "path": {
          "type": "string"
        },
        "dimensions": {
          "optional": true,
          "type": "#/definitions/FieldTarget",
          "generics": [
            {
              "type": "qae.NxDimension"
            }
          ]
        },
        "measures": {
          "optional": true,
          "type": "#/definitions/FieldTarget",
          "generics": [
            {
              "type": "qae.NxMeasure"
            }
          ]
        }
      }
    },
    "FieldTarget": {
      "templates": [
        {
          "name": "T"
        }
      ],
      "kind": "interface",
      "entries": {
        "min": {
          "optional": true,
          "kind": "function",
          "params": [],
          "returns": {
            "type": "number"
          }
        },
        "max": {
          "optional": true,
          "kind": "function",
          "params": [],
          "returns": {
            "type": "number"
          }
        },
        "added": {
          "optional": true,
          "kind": "function",
          "params": [
            {
              "type": "T"
            },
            {
              "type": "qae.GenericObjectProperties"
            }
          ]
        },
        "removed": {
          "optional": true,
          "kind": "function",
          "params": [
            {
              "type": "T"
            },
            {
              "type": "qae.GenericObjectProperties"
            },
            {
              "type": "number"
            }
          ]
        }
      }
    },
    "ObjectSelections": {
      "kind": "class",
      "entries": {
        "begin": {
          "kind": "function",
          "params": [
            {
              "name": "paths",
              "kind": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        },
        "clear": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        },
        "confirm": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        },
        "cancel": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        },
        "select": {
          "kind": "function",
          "params": [
            {
              "name": "s",
              "kind": "object",
              "entries": {
                "method": {
                  "type": "string"
                },
                "params": {
                  "kind": "array",
                  "items": {
                    "type": "any"
                  }
                }
              }
            }
          ],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "boolean"
              }
            ]
          }
        },
        "canClear": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "boolean"
          }
        },
        "canConfirm": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "boolean"
          }
        },
        "canCancel": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "boolean"
          }
        },
        "isActive": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "boolean"
          }
        },
        "isModal": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "boolean"
          }
        },
        "goModal": {
          "kind": "function",
          "params": [
            {
              "name": "paths",
              "kind": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        },
        "noModal": {
          "kind": "function",
          "params": [
            {
              "name": "accept",
              "optional": true,
              "defaultValue": false,
              "type": "boolean"
            }
          ],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        },
        "abortModal": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "Promise",
            "generics": [
              {
                "type": "undefined"
              }
            ]
          }
        }
      }
    },
    "Translator": {
      "kind": "class",
      "entries": {
        "add": {
          "description": "Registers a string in multiple locales",
          "kind": "function",
          "params": [
            {
              "name": "item",
              "kind": "object",
              "entries": {
                "id": {
                  "type": "string"
                },
                "locale": {
                  "type": "object",
                  "generics": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "string"
                    }
                  ]
                }
              }
            }
          ],
          "examples": [
            "translator.add({\n  id: 'company.hello_user',\n  locale: {\n    'en-US': 'Hello {0}',\n    'sv-SE': 'Hej {0}\n  }\n});\ntranslator.get('company.hello_user', ['John']); // Hello John"
          ]
        },
        "get": {
          "description": "Translates a string for current locale",
          "kind": "function",
          "params": [
            {
              "name": "str",
              "description": "Id of the registered string",
              "type": "string"
            },
            {
              "name": "args",
              "description": "Values passed down for string interpolation",
              "optional": true,
              "kind": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "returns": {
            "description": "The translated string",
            "type": "string"
          }
        }
      }
    },
    "Theme": {
      "kind": "class",
      "entries": {
        "getDataColorScales": {
          "kind": "function",
          "params": [],
          "returns": {
            "kind": "array",
            "items": {
              "type": "#/definitions/Theme/definitions/ScalePalette"
            }
          }
        },
        "getDataColorPalettes": {
          "kind": "function",
          "params": [],
          "returns": {
            "kind": "array",
            "items": {
              "type": "#/definitions/Theme/definitions/DataPalette"
            }
          }
        },
        "getDataColorPickerPalettes": {
          "kind": "function",
          "params": [],
          "returns": {
            "kind": "array",
            "items": {
              "type": "#/definitions/Theme/definitions/ColorPickerPalette"
            }
          }
        },
        "getDataColorSpecials": {
          "kind": "function",
          "params": [],
          "returns": {
            "type": "#/definitions/Theme/definitions/DataColorSpecials"
          }
        },
        "getColorPickerColor": {
          "description": "Resolve a color object using the color picker palette from the provided JSON theme.",
          "kind": "function",
          "params": [
            {
              "name": "c",
              "kind": "object",
              "entries": {
                "index": {
                  "optional": true,
                  "type": "number"
                },
                "color": {
                  "optional": true,
                  "type": "string"
                }
              }
            }
          ],
          "returns": {
            "description": "The resolved color.",
            "type": "string"
          },
          "examples": ["theme.getColorPickerColor({ index: 1 });\ntheme.getColorPickerColor({ color: 'red' });"]
        },
        "getContrastingColorTo": {
          "description": "Get the best contrasting color against the specified `color`.\nThis is typically used to find a suitable text color for a label placed on an arbitrarily colored background.\n\nThe returned colors are derived from the theme.",
          "kind": "function",
          "params": [
            {
              "name": "color",
              "description": "A color to measure the contrast against",
              "type": "string"
            }
          ],
          "returns": {
            "description": "- The color that has the best contrast against the specified `color`.",
            "type": "string"
          },
          "examples": ["theme.getContrastingColorTo('#400');"]
        },
        "getStyle": {
          "description": "Get the value of a style attribute in the theme by searching in the theme's json structure.\nThe search starts at the specified base path and continue upwards until the value is found.\nIf possible it will get the attribute's value using the given path.",
          "kind": "function",
          "params": [
            {
              "name": "basePath",
              "description": "Base path in the theme's json structure to start the search in (specified as a name path separated by dots)",
              "type": "string"
            },
            {
              "name": "path",
              "description": "Expected path for the attribute (specified as a name path separated by dots)",
              "type": "string"
            },
            {
              "name": "attribute",
              "description": "Name of the style attribute",
              "type": "string"
            }
          ],
          "returns": {
            "description": "The style value",
            "type": "string"
          },
          "examples": ["theme.getStyle('object', 'title.main', 'fontSize'));\ntheme.getStyle('', '', 'fontSize'));"]
        }
      },
      "definitions": {
        "ScalePalette": {
          "kind": "interface",
          "entries": {
            "key": {
              "type": "string"
            },
            "type": {
              "kind": "union",
              "items": [
                {
                  "kind": "literal",
                  "value": "gradient"
                },
                {
                  "kind": "literal",
                  "value": "class"
                }
              ]
            },
            "colors": {
              "kind": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "DataPalette": {
          "kind": "interface",
          "entries": {
            "key": {
              "type": "string"
            },
            "type": {
              "kind": "union",
              "items": [
                {
                  "kind": "literal",
                  "value": "pyramid"
                },
                {
                  "kind": "literal",
                  "value": "row"
                }
              ]
            },
            "colors": {
              "kind": "union",
              "items": [
                {
                  "kind": "array",
                  "items": {
                    "type": "string"
                  }
                },
                {
                  "kind": "array",
                  "items": {
                    "kind": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              ]
            }
          }
        },
        "ColorPickerPalette": {
          "kind": "interface",
          "entries": {
            "key": {
              "type": "string"
            },
            "colors": {
              "kind": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "DataColorSpecials": {
          "kind": "interface",
          "entries": {
            "primary": {
              "type": "string"
            },
            "nil": {
              "type": "string"
            },
            "others": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
