---
title: Syntaxe UI
type: docs
weight: 11
---

Cette page couvre la syntaxe complète du langage de balisage UI de Hytale.

## Commentaires

```
// Commentaire sur une ligne

/* Commentaire
   multi-lignes */
```

## Variables

### Variables Locales

Définissez les variables avec le préfixe `@` :

```
@MyNumber = 50;
@MyString = "Bonjour";
@MyColor = #ff5500;
@MyObject = (Key: value, Other: 123);
```

### Types de Variables

| Type | Exemple |
|------|---------|
| Nombre | `@Size = 50;` |
| Chaîne | `@Text = "Bonjour";` |
| Couleur | `@Color = #ff5500;` |
| Objet | `@Obj = (Width: 100, Height: 50);` |
| Tableau | `@List = [item1, item2, item3];` |
| Booléen | `@Visible = true;` |

### Utiliser les Variables

Référencez les variables avec `@` :

```
Group {
  Anchor: (Height: @MyNumber);
  Background: (Color: @MyColor);
}
```

## Imports

### Importer des Fichiers

Utilisez le préfixe `$` pour importer des fichiers externes :

```
$Common = "Common.ui";
$Sounds = "../Sounds.ui";
$ClientCommon = "../../Common.ui";
```

### Référencer les Variables Importées

Accédez aux variables importées avec la notation pointée :

```
$Common.@DefaultButtonStyle
$Sounds.@ButtonsLight
```

### Utiliser les Templates Importés

Instanciez les templates depuis les imports :

```
$Common.@TextButton {
  @Text = "Cliquez-moi";
}
```

## Couleurs

### Hexadécimal

```
@Color1 = #ff5500;          // RGB
@Color2 = #ff5500ff;        // RGBA
```

### Avec Opacité

```
@Color3 = #ff5500(0.5);     // 50% d'opacité
@Color4 = #000000(0.8);     // 80% d'opacité
```

## Objets

### Objet Simple

```
@Style = (
  FontSize: 16,
  TextColor: #ffffff,
  RenderBold: true
);
```

### Objets Imbriqués

```
@ButtonStyle = (
  Default: (
    Background: (TexturePath: "Button.png", Border: 12)
  ),
  Hovered: (
    Background: (TexturePath: "ButtonHovered.png", Border: 12)
  )
);
```

## Opérateur Spread

Utilisez `...` pour étendre/fusionner des objets :

```
@BaseStyle = (
  FontSize: 16,
  TextColor: #ffffff
);

@ExtendedStyle = (
  ...@BaseStyle,          // Hérite de toutes les propriétés de @BaseStyle
  RenderBold: true        // Ajoute/remplace des propriétés
);
```

Le spread fonctionne dans tout contexte d'objet :

```
Style: (
  ...$Common.@DefaultButtonStyle,
  Sounds: (
    ...$Sounds.@ButtonsLight,
    Activate: (Volume: 10)
  )
);
```

## Templates (Macros)

### Définir un Template

Les templates sont des définitions de widgets réutilisables avec paramètres :

```
@MyButton = TextButton {
  @Text = "";                    // Paramètre avec défaut
  @Anchor = Anchor();            // Paramètre avec défaut
  @Sounds = ();                  // Défaut vide

  Style: @DefaultTextButtonStyle;
  Anchor: (...@Anchor, Height: 44);
  Text: @Text;
};
```

### Instancier un Template

```
// Utiliser avec les défauts
@MyButton {}

// Remplacer les paramètres
@MyButton {
  @Text = "Valider";
  @Anchor = (Width: 200);
}

// Depuis un import
$Common.@TextButton {
  @Text = %ui.button.confirm;
}
```

## Déclarations de Widgets

### Widget Simple

```
WidgetType {
  Property: value;
}
```

### Widget avec ID

Les IDs commencent par `#` et permettent le ciblage depuis Java. Les IDs doivent être en format **UpperCamelCase** (pas de tirets ni underscores) :

```
Label #PlayerName {
  Text: "Inconnu";
}

// IDs valides
#MainPanel
#ConfirmButton
#PlayerHealthBar

// IDs invalides (causeront des erreurs)
#main-panel      // Pas de tirets
#confirm_button  // Pas d'underscores
#playerhealthbar // Doit être en UpperCamelCase
```

### Widgets Imbriqués

```
Group #Container {
  Label #Title {
    Text: "En-tête";
  }

  Group #Content {
    Label {
      Text: "Corps du texte";
    }
  }
}
```

### Widgets Anonymes

Les widgets sans ID sont anonymes :

```
Group {
  Label { Text: "Pas d'ID"; }
}
```

## Sélecteurs

Les sélecteurs sont des chaînes commençant par `#` utilisées pour cibler des éléments :

```java
// Dans le code Java
builder.set("#PlayerName", "Steve");
builder.append("#Container", "ui/child_template");
builder.clear("#Content");
```

## Clés de Traduction

Utilisez le préfixe `%` pour les chaînes localisées :

```
Label {
  Text: %server.ui.shop.title;
}

TextButton {
  Text: %client.button.confirm;
}
```

## Constructeurs Typés

Certains types complexes utilisent des constructeurs de style fonction :

```
// Constructeurs de styles
@Style = LabelStyle(FontSize: 16, TextColor: #fff);
@BtnStyle = ButtonStyle(Default: (...), Hovered: (...));

// Constructeurs de layout
@Pad = Padding(Full: 10);
@Anch = Anchor(Width: 100, Height: 50);

// Constructeurs visuels
@Bg = PatchStyle(TexturePath: "bg.png", Border: 12);
@Scroll = ScrollbarStyle(Size: 6, Spacing: 8);
```

## Exemple Complet

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