# RandomLayout

> Sem arranjo automático — posicionamento manual (setBounds) ou relativo (setRelativeBounds).

Source: https://crossfly.dev/pt/docs/ui/layouts/random-layout — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# RandomLayout

Não arranja nada automaticamente: cada filho precisa de bounds. É o **layout padrão** quando você
chama `add(...)` sem definir um layout. Apesar do nome, é a base de **overlays e cards flutuantes**.

> 🔴 · **Pacote:** `dev.crossfly.ui.layout` · **Estende:** `Layout`

## Quando usar
- Overlays, cards flutuantes, posicionamento livre.
- Layouts custom onde você controla os bounds.

## Quando NÃO usar
- Telas normais → use um layout que arranja (Vertical/Horizontal/Grid).

## `add(...)`
```java
public Layout add(Object... params);   // apenas coleta os componentes; não os posiciona
```

## Duas formas de posicionar
1. **Manual (pixels — NÃO responsivo):** `filho.setBounds(x, y, w, h)`.
2. **Relativo (responsivo — recomendado):** `filho.setRelativeBounds(Relative x, Relative y, Relative w, Relative h)`.
   O `doLayout()` do `RandomLayout` chama `Relative.setBounds(c)` automaticamente para todo filho com
   bounds relativos.

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.graphics.*;

/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();

      // A própria Window usa RandomLayout por padrão (sem setLayout)
      Component card = new Component();
      card.setLayout(new VerticalLayout(Position.START, Position.START));
      card.add(LAY_AUTO, new Label("Cartão flutuante"));
      card.setRelativeBounds(
         Relative.CENTER,                            // x: centralizado
         Relative.CENTER,                            // y: centralizado
         Relative.ofScreen(0.8f, ScreenSize.MIN),   // largura: 80% do menor lado
         Relative.ofFont(10f)                       // altura: 10 linhas de fonte
      );
      add(card);                                     // RandomLayout resolve os bounds relativos
   }
}
```

> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

## Uso básico (card centralizado responsivo)
```java
Component overlay = new Component();          // sem setLayout → RandomLayout
Component card = new Component();
card.setRelativeBounds(
   Relative.CENTER,                            // x: centralizado
   Relative.CENTER,                            // y: centralizado
   Relative.ofScreen(0.8f, ScreenSize.MIN),   // largura: 80% do menor lado
   Relative.ofFont(10f)                       // altura: 10 linhas de fonte
);
overlay.add(card);                             // RandomLayout resolve os bounds relativos
```

## Boas práticas
- **Prefira `setRelativeBounds`** a `setBounds` — mantém a responsividade.
- Se **precisar** de `setBounds` fixo, recalcule em `Window.onReposition()` (chamado no resize).

## Erros comuns
- Usar `setBounds(x,y,w,h)` fixo e a UI quebrar em outra tela/densidade.
- Esquecer que sem bounds (nem fixos, nem relativos) o filho fica em `(0,0)` com tamanho 0.

## Veja também
- [Responsividade](/docs/ui/layouts/responsiveness) · [RelativeLayout](/docs/ui/layouts/relative-layout)
