--- title: UI Files type: docs weight: 10 --- UI files (`.ui`) are Hytale's declarative markup language for defining user interfaces. They describe the structure, layout, and styling of UI elements that can be loaded by plugins via `UICommandBuilder.append()`. ## File Location UI files are typically stored in the Assets directory: ``` Assets/ Common/UI/Custom/ # Server-side custom UI Pages/ # Custom page templates Hud/ # Custom HUD elements Common.ui # Shared definitions Sounds.ui # Sound definitions Client/Interface/ # Client-side UI InGame/Hud/ # HUD components Common/ # Common components Common.ui # Client shared definitions ``` ## Basic Structure A `.ui` file consists of variable definitions and widget declarations: ``` // Import external definitions $Common = "../Common.ui"; // Define local variables @ButtonHeight = 44; @TextColor = #96a9be; // Define a widget tree Group #Container { Anchor: (Width: 400, Height: 300); Background: (Color: #000000(0.8)); Label #Title { Text: "Hello World"; Style: (FontSize: 24, TextColor: @TextColor); } } ``` ## Loading UI Files from Plugins Use `UICommandBuilder.append()` to load a UI file: ```java @Override public void build(Ref ref, UICommandBuilder builder, UIEventBuilder events, Store store) { // Load the UI template (extension .ui is REQUIRED) builder.append("Pages/MyPage.ui"); // Append to a specific element builder.append("#ContentList", "Pages/ListItem.ui"); // Set dynamic values using selectors builder.set("#Title", "Welcome, " + playerRef.getUsername()); } ``` ### Path Resolution The path is relative to `Common/UI/Custom/`. The `.ui` extension is **required**. | Path in `append()` | Resolved Location | |-------------------|-------------------| | `Pages/MyPage.ui` | `Common/UI/Custom/Pages/MyPage.ui` | | `Common.ui` | `Common/UI/Custom/Common.ui` | ### For Java Plugins (Mods) When creating a Java plugin with custom UI, place your `.ui` files in the resources folder: ``` your-plugin/ src/main/ java/ # Java source code resources/ Common/UI/Custom/ # UI files go here Pages/ MyPage.ui MyButton.ui Common.ui # Your shared definitions plugin.json # Plugin manifest ``` Set `"IncludesAssetPack": true` in your `plugin.json` to enable asset loading: ```json { "Group": "MyGroup", "Name": "MyPlugin", "Version": "1.0.0", "Main": "com.example.MyPlugin", "IncludesAssetPack": true } ``` {{< callout type="info" >}} The server automatically looks for UI files in `Common/UI/Custom/` within your plugin's asset pack. This is why paths like `Pages/MyPage.ui` work without specifying the full path. {{< /callout >}} ## Key Concepts ### Variables Variables store reusable values: ``` @Height = 50; // Number @Color = #ff5500; // Color @Style = (FontSize: 16, RenderBold: true); // Object ``` ### Imports Import definitions from other files: ``` $Common = "Common.ui"; // Import file $Common.@DefaultButtonStyle // Reference imported variable ``` ### Widget IDs Use `#` to assign IDs that can be targeted from Java: ``` Label #PlayerName { Text: "Unknown"; } ``` ```java builder.set("#PlayerName", player.getUsername()); ``` ### Localization Use `%` prefix for translation keys: ``` Label { Text: %server.ui.welcome.title; } ``` ## Next Steps - [UI Syntax](ui-syntax) - Detailed syntax reference - [UI Widgets](ui-widgets) - Available widget types - [UI Properties](ui-properties) - Common properties - [UI Styles](ui-styles) - Styling system