# `Alaja.Components.Table`
[🔗](https://github.com/Lorenzo-SF/alaja/blob/2.1.0/lib/alaja/components/table.ex#L1)

Component for rendering formatted tables with advanced layout.

Supports tables with:
- Optional headers separated from rows
- Per-cell, per-row, or per-column formatting
- Per-cell and full-table alignment
- Colors and effects
- Customizable borders (normal, rounded, double, none, custom)
- Configurable padding
- Border formatting (color, effects)
- Full-table alignment (left, center, right)

## Options

### Data
- `:headers` — List of headers (if not included in data)
- `:rows` — List of rows (if not included in data)

### Header Formatting
- `:headers_color` — Header color (atom, hex, or list per column)
- `:headers_effects` — Header effects (list, or list of lists per column)
- `:headers_align` — Header alignment (:left, :center, :right, or list)

### Row Formatting
- `:rows_color` — Row color (atom, hex, or list per column)
- `:rows_effects` — Row effects (list, or list of lists per column)
- `:rows_align` — Row alignment (:left, :center, :right, or list)

### Specific Row Formatting
- `:rows_0_color` — Row 0 color (atom, hex, or list per column)
- `:rows_0_effects` — Row 0 effects
- `:rows_0_align` — Row 0 alignment (:left, :center, :right, or list)
- (Repeat for rows_1_, rows_2_, etc.)

### Border Formatting
- `:border_color` — Border color
- `:border_effects` — Border effects

### Table Style
- `:table_border` — Border style (:normal, :rounded, :double, :none, :custom)
- `:table_border_custom` — Map with custom border characters
- `:padding` — Inner cell padding (default: 1)
- `:table_align` — Full table alignment (:left, :center, :right)

## Examples

    # Headers separated from rows
    Alaja.Components.Table.print(
      headers: ["ID", "Name", "Email"],
      rows: [
        ["1", "Jake", "jake@nypd.com"],
        ["2", "Rosa", "rosa@nypd.com"]
      ],
      headers_color: :cyan,
      headers_effects: [:bold],
      rows_color: :white,
      table_border: :rounded,
      padding: 1
    )

    # Per-column formatting
    Alaja.Components.Table.print(
      headers: ["Name", "Age", "City"],
      rows: [["Jake", "35", "NYC"]],
      headers_color: [:cyan, :yellow, :magenta],
      headers_align: [:center, :right, :left]
    )

    # Specific row formatting
    Alaja.Components.Table.print(
      headers: ["Service", "Status"],
      rows: [["td-ai", "OK"], ["td-auth", "ERROR"]],
      rows_0_color: [:white, :green],
      rows_1_color: [:white, :red]
    )

    # Without headers
    Alaja.Components.Table.print(
      rows: [
        ["1", "Jake", "jake@nypd.com"],
        ["2", "Rosa", "rosa@nypd.com"]
      ],
      table_border: :double
    )

    # Border formatting
    Alaja.Components.Table.print(
      headers: ["ID", "Name"],
      rows: [["1", "Jake"]],
      border_color: :cyan,
      border_effects: [:bold]
    )

    # Table centered in terminal
    Alaja.Components.Table.print(
      headers: ["A", "B"],
      rows: [["1", "2"]],
      table_align: :center,
      table_border: :rounded
    )

# `align`

```elixir
@type align() :: :left | :center | :right
```

# `border_style`

```elixir
@type border_style() :: :normal | :rounded | :double | :none | :custom
```

# `color`

```elixir
@type color() :: atom() | String.t() | {integer(), integer(), integer()}
```

# `effects`

```elixir
@type effects() :: [atom()]
```

# `print`

```elixir
@spec print(
  list() | keyword(),
  keyword()
) :: :ok
```

Prints a table to the terminal.

If `:page_size` is set, enables interactive pagination:
- `n` / `→` — next page
- `p` / `←` — previous page
- `g` — go to page (prompts for number)
- `f` / `l` — first / last page
- `q` / `Esc` — quit

# `render`

```elixir
@spec render(
  list() | keyword(),
  keyword()
) :: Alaja.Buffer.t()
```

Renders a table to an `Alaja.Buffer.t/0` without printing.

This is the Cell-engine render. Returns a composable `Buffer` that
can be overlaid on other buffers or passed to `Alaja.Components.Box`.

See `render_buffer/2` for the implementation.

# `render_buffer`

```elixir
@spec render_buffer(
  list(),
  keyword()
) :: Alaja.Buffer.t()
```

Renders a table into an `Alaja.Buffer.t/0` (Cell engine, v0.3.0).

Supports column widths, alignment, header/row colors, and the same
border styles as `render/2`. Pagination is NOT supported here — for
interactive tables, use `print/2`.

## Options

Same as `render/2` but limited to layout-level options. Per-cell /
per-row / per-column formatting is supported via the same keywords.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
