UI View
A screen: layers of components on a 15 × 15 grid, drawn in GUI space and therefore identical for every player whatever their GUI scale, field of view or aspect ratio.
Configuration
| Field | What it does |
|---|---|
viewId | The identifier actions, commands and items use to open this view. |
layers | The layers, drawn back to front. |
nodes | Screens of this menu: tabs and sub-menus. Leave empty for a single screen. |
rootNodeId | Which node the menu opens on. Empty opens the first declared one. |
tooltipAnchor / titleAnchor | Where explanations and the breadcrumb sit. Negative coordinates inherit the server default. |
sounds | Played on open, on close and on a click. |
states | What components become while a condition holds. |
opening / openingMillis / openingFade | How the view arrives. |
Components
| Field | What it does |
|---|---|
componentId | Unique inside its layer. Also how a state addresses it. |
placement | CELL on the grid, MARKER anywhere in the viewport, SCRIM a full-screen veil, NONE not drawn. |
palette / hoverPalette / disabledPalette | Tints. NONE keeps the previous one. |
background | A panel image painted behind it instead of a flat tint. |
icon | A material whose picture is drawn, for instance DIAMOND_SWORD. |
text / textPalette / textAlign | Drawn across the component. |
label / tooltip | Shown beside the screen while the cursor rests on it. |
binding | A placeholder this component takes its value from. |
criteria | What must hold for a click to be answered. |
onLeftClick / onRightClick | What a click triggers. |
navigateTo | The node this button opens. |
input | Ask the player to type a value before the click takes effect. |
A component answers a click only when something is wired to one. Navigating counts: a tab that only changes screen is a button, and drawing it as decoration would leave the cursor sliding over it as though it were part of the frame.
Tints
A cell's glyph colour carries its column, its row and its tint, so a tint is an index into a fixed palette rather than a free value:
FRAME SURFACE SURFACE_LIGHT MUTED
BLUE BLUE_LIGHT CYAN TEAL
GREEN GREEN_LIGHT YELLOW ORANGE
RED_DARK RED PURPLE WHITE
BLACK INK SLATE STEEL STEEL_LIGHT MIST PAPER
FOREST MINT GOLD AMBER WINE CORAL VIOLET
NONE means not drawn, which is how an empty cell stays transparent — it is not another colour.
[!NOTE] Text reaches only the first sixteen tints. A text glyph's colour is spent on its position and its width, so its tint comes from its font, and the pack ships sixteen text fonts. A text tint past the sixteenth falls back to white — legible and in the right place — rather than drawing in the wrong place.
Panels and pictures
background names a picture rather than a texture path: the pack owns which image that name draws,
so retexturing never touches a page.
A picture is painted per cell. A button three cells wide repeats its image three times unless the pack supplies the nine pieces of a panel — four corners, four edges, a centre — which is how a panel of any size is composed without stretching its corners.
Any number of pictures share one font, so adding images costs nothing in the renderer's budget.
Lists
A repeat is a window over a numbered source. Item 3 reads <source>.3, and its picture
<source>.3.icon. The template is an ordinary component: what an item looks like is authored exactly
like any other cell, and only its id, its binding and its position are supplied per item.
stepMode decides whether a gesture turns a whole window (PAGE) or moves one item (ITEM).
States
A state gives components a different look while a condition holds.
| Field | What it does |
|---|---|
stateId | Unique inside the view. |
priority | Higher wins when several hold at once. |
parentId | The state this one refines. It inherits every override the parent does not restate. |
conditions | Facts and permissions that must all hold. Leave empty for a default. |
overrides | What components become. |
An override addresses a component by its id, or by column:row to address the cell it sits on —
which is how a state written against a chest layout applies here unchanged. An id wins over a
coordinate.
Every override field means KEEP when left empty, except visible, which is the one field that
can subtract. A component a state hides is removed, not merely tinted away: leaving it in place
would keep it under the cursor and let it answer a click nobody can aim at.
States are re-evaluated on every repaint, so a view changes while it is open.
Arrival
| Field | What it does |
|---|---|
opening | NONE, WIPE_DOWN, WIPE_UP, WIPE_RIGHT, WIPE_LEFT, BLOOM, FADE. |
openingMillis | How long it takes. Zero shows the view at once. |
openingFade | Cells come up from transparent instead of appearing at once. |
BLOOM opens outwards from the middle of the screen, which suits a menu opening under the player's
own cursor — the middle is where they are already looking.
The animation plays only when entering the interface. Moving between tabs, or opening a second view from a button, shows none: what charms once annoys the tenth time.
[!NOTE] Nothing slides. A cell's address is a whole number of columns and rows, so an arrival reveals cells in an order. A smooth glide is not something the grid can express, and offering one would deliver a stutter.