# GUI system This directory contains the XML files describing the components which make up Graphite's GUI. ## Principles The framework is inspired by [Vue.js](https://vuejs.org/). Each component's layout is defined in an XML, and recursively made out of lower-level components. Interactivity is provided by script files which expose reactive variables. As these variables are mutated, the component is updated to match the current state. ## Layout The layout engine does a top-down pass through the component tree in order to determine what to render. Layout is controlled using predefined attributes, such as `width`, `height`, `x-align`, `y-align`, `spacing` or `padding`. ## Component lifetime The children of a component are passed to it as a `content` attribute. For example, looking at the row component: ```xml {{INNER_XML}} ``` The `content` attribute defines a new variable `INNER_XML` of type either `GuiXml` or `None`, which can contain more XML or nothing at all. It has a default value of `none` (of type `None`). This is then expanded in the body of the row: `{{INNER_XML}}`. ## Defining new components ### Component files To define a new component, create a new `.xml` file in this directory. Subdirectories become namespaces for the components (e.g. the file `window/main.xml` defines a component ``). ### Parameters User-defined parameters start with a colon (`:`). They are created by adding attributes to a component source file: `:parameter="VARIABLE_NAME: (VariableType) = defaultValue"`