---
title: UI Properties
type: docs
weight: 13
---

This page documents common properties available on UI widgets.

## Anchor (Positioning)

The `Anchor` property controls widget position and size.

### Position Properties

```
Anchor: (
  Left: 10,      // Distance from left edge
  Right: 10,     // Distance from right edge
  Top: 10,       // Distance from top edge
  Bottom: 10     // Distance from bottom edge
);
```

### Size Properties

```
Anchor: (
  Width: 200,    // Fixed width
  Height: 100    // Fixed height
);
```

### Shorthand Properties

```
Anchor: (Full: 10);           // All sides = 10
Anchor: (Horizontal: 20);     // Left and Right = 20
Anchor: (Vertical: 15);       // Top and Bottom = 15
```

### Combined Example

```
// Fixed size, positioned from top-left
Anchor: (Left: 50, Top: 100, Width: 300, Height: 200);

// Fill parent with margins
Anchor: (Full: 16);

// Anchored to bottom-right corner
Anchor: (Right: 20, Bottom: 20, Width: 100, Height: 40);

// Full width, fixed height at bottom
Anchor: (Horizontal: 0, Bottom: 0, Height: 50);
```

## Background

The `Background` property sets widget background appearance.

### Solid Color

```
Background: (Color: #ff5500);
Background: (Color: #000000(0.5));    // With opacity
```

### Simple Texture

```
Background: "MyTexture.png";
Background: (TexturePath: "MyTexture.png");
```

### 9-Patch (Stretchable) Texture

```
// Uniform border
Background: (TexturePath: "Panel.png", Border: 20);

// Separate horizontal/vertical borders
Background: (
  TexturePath: "Button.png",
  HorizontalBorder: 80,
  VerticalBorder: 12
);
```

### Using PatchStyle

```
@MyBackground = PatchStyle(
  TexturePath: "Panel.png",
  Border: 16
);

Group {
  Background: @MyBackground;
}
```

## Padding

The `Padding` property sets inner spacing.

```
Padding: (Full: 16);              // All sides
Padding: (Horizontal: 20);        // Left and Right
Padding: (Vertical: 10);          // Top and Bottom
Padding: (Left: 10, Right: 20);   // Individual sides
Padding: (Top: 5, Bottom: 15, Horizontal: 10);
```

### Using Padding Constructor

```
@ContentPadding = Padding(Full: 16, Top: 8);

Group {
  Padding: @ContentPadding;
}
```

## LayoutMode

The `LayoutMode` property controls how children are arranged.

### Stacking Modes

| Mode | Description |
|------|-------------|
| `Top` | Stack children from top to bottom |
| `Bottom` | Stack children from bottom to top |
| `Left` | Stack children from left to right |
| `Right` | Stack children from right to left |

```
Group {
  LayoutMode: Top;      // Vertical list, top-aligned

  Label { Text: "First"; Anchor: (Height: 30); }
  Label { Text: "Second"; Anchor: (Height: 30); }
  Label { Text: "Third"; Anchor: (Height: 30); }
}
```

### Centering Modes

| Mode | Description |
|------|-------------|
| `Middle` | Center children vertically |
| `CenterMiddle` | Center children both horizontally and vertically |

```
Group {
  LayoutMode: CenterMiddle;

  Label { Text: "Centered!"; }
}
```

### Scrolling Modes

| Mode | Description |
|------|-------------|
| `TopScrolling` | Vertical scroll, content from top |
| `BottomScrolling` | Vertical scroll, content from bottom (chat-style) |

```
Group #ChatLog {
  LayoutMode: BottomScrolling;
  ScrollbarStyle: @DefaultScrollbarStyle;
  AutoScrollDown: true;
}
```

### Wrapping Mode

| Mode | Description |
|------|-------------|
| `LeftCenterWrap` | Flow left-to-right, wrap to next row |

```
Group #ItemGrid {
  LayoutMode: LeftCenterWrap;

  // Items will wrap to new rows
}
```

## FlexWeight

The `FlexWeight` property controls flexible sizing in layout.

```
Group {
  LayoutMode: Left;

  Group {
    Anchor: (Width: 100);    // Fixed width
  }

  Group {
    FlexWeight: 1;           // Takes remaining space
  }

  Group {
    FlexWeight: 2;           // Takes 2x the space of FlexWeight: 1
  }
}
```

## Visible

Controls widget visibility.

```
Group #Panel {
  Visible: true;    // or false, or @Variable
}

Button #CloseButton {
  Visible: @CloseButton;    // Controlled by template parameter
}
```

## Text

Sets text content for Label and TextButton widgets.

```
Label {
  Text: "Static text";
}

Label {
  Text: %server.ui.title;    // Translation key
}

Label #DynamicText {
  Text: "";                  // Set from Java
}
```

## ScrollbarStyle

Configures scrollbar appearance for scrolling containers.

```
Group {
  LayoutMode: TopScrolling;
  ScrollbarStyle: (
    Spacing: 6,
    Size: 6,
    Background: (TexturePath: "Scrollbar.png", Border: 3),
    Handle: (TexturePath: "ScrollbarHandle.png", Border: 3),
    HoveredHandle: (TexturePath: "ScrollbarHandleHovered.png", Border: 3),
    DraggedHandle: (TexturePath: "ScrollbarHandleDragged.png", Border: 3)
  );
}
```

### ScrollbarStyle Options

| Property | Description |
|----------|-------------|
| `Spacing` | Gap between scrollbar and content |
| `Size` | Scrollbar width/height |
| `Background` | Track background |
| `Handle` | Normal handle appearance |
| `HoveredHandle` | Handle when hovered |
| `DraggedHandle` | Handle when dragging |
| `OnlyVisibleWhenHovered` | Hide when not interacting |

## AutoScrollDown

For BottomScrolling containers, automatically scroll to new content.

```
Group #ChatLog {
  LayoutMode: BottomScrolling;
  AutoScrollDown: true;
}
```

## Disabled

Disables interaction with a widget.

```
Button #SubmitButton {
  Disabled: false;
}

ActionButton #Binding {
  Disabled: true;
}
```

## TooltipText

Displays tooltip on hover.

```
Button #InfoButton {
  TooltipText: %ui.tooltip.help;
}
```

## TextTooltipStyle

Configures tooltip appearance.

```
Button {
  TooltipText: "Help text";
  TextTooltipStyle: (
    Background: (TexturePath: "TooltipBg.png", Border: 24),
    MaxWidth: 400,
    LabelStyle: (Wrap: true, FontSize: 16),
    Padding: 24
  );
}
```

## Common Property Combinations

### Panel with Title and Content

```
Group #Panel {
  Anchor: (Width: 400, Height: 300);
  Background: (TexturePath: "Panel.png", Border: 20);
  LayoutMode: Top;
  Padding: (Full: 16);

  Label #Title {
    Anchor: (Height: 40);
    // ...
  }

  Group #Content {
    FlexWeight: 1;
    LayoutMode: TopScrolling;
    ScrollbarStyle: @DefaultScrollbarStyle;
    Padding: (Top: 8);
  }
}
```

### Horizontal Button Row

```
Group #ButtonRow {
  Anchor: (Height: 50);
  LayoutMode: Right;
  Padding: (Horizontal: 10);

  TextButton #Cancel {
    Anchor: (Width: 100);
  }

  Group { Anchor: (Width: 10); }  // Spacer

  TextButton #Confirm {
    Anchor: (Width: 100);
  }
}
```

### Full-Screen Overlay

```
Group #Overlay {
  Anchor: (Full: 0);
  Background: (Color: #000000(0.7));
  LayoutMode: CenterMiddle;

  Group #Dialog {
    Anchor: (Width: 500, Height: 300);
    Background: (TexturePath: "Dialog.png", Border: 20);
  }
}
```
