---
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;
  }
}
```
