Files
Documentation/content/ui-systems/ui-syntax.en.md
2026-01-20 20:33:59 +01:00

332 lines
5.0 KiB
Markdown

---
title: UI Syntax
type: docs
weight: 11
---
This page covers the complete syntax of Hytale's UI markup language.
## Comments
```
// Single line comment
/* Multi-line
comment */
```
## Variables
### Local Variables
Define variables with `@` prefix:
```
@MyNumber = 50;
@MyString = "Hello";
@MyColor = #ff5500;
@MyObject = (Key: value, Other: 123);
```
### Variable Types
| Type | Example |
|------|---------|
| Number | `@Size = 50;` |
| String | `@Text = "Hello";` |
| Color | `@Color = #ff5500;` |
| Object | `@Obj = (Width: 100, Height: 50);` |
| Array | `@List = [item1, item2, item3];` |
| Boolean | `@Visible = true;` |
### Using Variables
Reference variables with `@`:
```
Group {
Anchor: (Height: @MyNumber);
Background: (Color: @MyColor);
}
```
## Imports
### Import Files
Use `$` prefix to import external files:
```
$Common = "Common.ui";
$Sounds = "../Sounds.ui";
$ClientCommon = "../../Common.ui";
```
### Reference Imported Variables
Access imported variables with dot notation:
```
$Common.@DefaultButtonStyle
$Sounds.@ButtonsLight
```
### Use Imported Templates
Instantiate templates from imports:
```
$Common.@TextButton {
@Text = "Click Me";
}
```
## Colors
### Hexadecimal
```
@Color1 = #ff5500; // RGB
@Color2 = #ff5500ff; // RGBA
```
### With Opacity
```
@Color3 = #ff5500(0.5); // 50% opacity
@Color4 = #000000(0.8); // 80% opacity
```
## Objects
### Basic Object
```
@Style = (
FontSize: 16,
TextColor: #ffffff,
RenderBold: true
);
```
### Nested Objects
```
@ButtonStyle = (
Default: (
Background: (TexturePath: "Button.png", Border: 12)
),
Hovered: (
Background: (TexturePath: "ButtonHovered.png", Border: 12)
)
);
```
## Spread Operator
Use `...` to extend/merge objects:
```
@BaseStyle = (
FontSize: 16,
TextColor: #ffffff
);
@ExtendedStyle = (
...@BaseStyle, // Inherit all properties from @BaseStyle
RenderBold: true // Add/override properties
);
```
Spread works in any object context:
```
Style: (
...$Common.@DefaultButtonStyle,
Sounds: (
...$Sounds.@ButtonsLight,
Activate: (Volume: 10)
)
);
```
## Templates (Macros)
### Define a Template
Templates are reusable widget definitions with parameters:
```
@MyButton = TextButton {
@Text = ""; // Parameter with default
@Anchor = Anchor(); // Parameter with default
@Sounds = (); // Empty default
Style: @DefaultTextButtonStyle;
Anchor: (...@Anchor, Height: 44);
Text: @Text;
};
```
### Instantiate a Template
```
// Use with defaults
@MyButton {}
// Override parameters
@MyButton {
@Text = "Submit";
@Anchor = (Width: 200);
}
// From import
$Common.@TextButton {
@Text = %ui.button.confirm;
}
```
## Widget Declarations
### Basic Widget
```
WidgetType {
Property: value;
}
```
### Widget with ID
IDs start with `#` and allow targeting from Java. IDs must be in **UpperCamelCase** format (no hyphens or underscores):
```
Label #PlayerName {
Text: "Unknown";
}
// Valid IDs
#MainPanel
#ConfirmButton
#PlayerHealthBar
// Invalid IDs (will cause errors)
#main-panel // No hyphens allowed
#confirm_button // No underscores allowed
#playerhealthbar // Should be UpperCamelCase
```
### Nested Widgets
```
Group #Container {
Label #Title {
Text: "Header";
}
Group #Content {
Label {
Text: "Body text";
}
}
}
```
### Anonymous Widgets
Widgets without ID are anonymous:
```
Group {
Label { Text: "No ID"; }
}
```
## Selectors
Selectors are strings starting with `#` used to target elements:
```java
// In Java code
builder.set("#PlayerName", "Steve");
builder.append("#Container", "ui/child_template");
builder.clear("#Content");
```
## Translation Keys
Use `%` prefix for localized strings:
```
Label {
Text: %server.ui.shop.title;
}
TextButton {
Text: %client.button.confirm;
}
```
## Typed Constructors
Some complex types use function-style constructors:
```
// Style constructors
@Style = LabelStyle(FontSize: 16, TextColor: #fff);
@BtnStyle = ButtonStyle(Default: (...), Hovered: (...));
// Layout constructors
@Pad = Padding(Full: 10);
@Anch = Anchor(Width: 100, Height: 50);
// Visual constructors
@Bg = PatchStyle(TexturePath: "bg.png", Border: 12);
@Scroll = ScrollbarStyle(Size: 6, Spacing: 8);
```
## Complete Example
```
$Common = "Common.ui";
$Sounds = "Sounds.ui";
@PanelWidth = 400;
@PanelHeight = 300;
@TitleColor = #b4c8c9;
@PanelTitle = Label {
@Text = "";
Style: (
FontSize: 20,
TextColor: @TitleColor,
RenderBold: true,
HorizontalAlignment: Center
);
Text: @Text;
};
Group #MainPanel {
Anchor: (Width: @PanelWidth, Height: @PanelHeight);
Background: (TexturePath: "Panel.png", Border: 20);
LayoutMode: Top;
Padding: (Full: 16);
@PanelTitle {
@Text = %ui.panel.title;
}
Group #Content {
FlexWeight: 1;
LayoutMode: TopScrolling;
ScrollbarStyle: $Common.@DefaultScrollbarStyle;
}
$Common.@TextButton #ConfirmButton {
@Text = %ui.button.confirm;
@Sounds = $Sounds.@ButtonsLight;
}
}
```