# User page

# User page

The live page your setup shows in the **Panel** view. Lay out widgets in rows and
columns; it updates in real time.

```python
page("Heater test",
     layout=col(
       row(gauge(ch["/demo/temperature"]), toggle(ch["/demo/heater_on"])),
       row(start(step="heat_soak"),
           checklist(("Below 40 °C", lambda: ch["/demo/temperature"] < 40)),
           alarms(), log()),
     ))
```

| Widget | Shows |
|---|---|
| **`gauge`** / **`chart`** | a live value or trend, red past its limits |
| **`toggle`** / **`slider`** | a control that commands an output |
| **`start`** | a button that launches a [procedure](https://phloem.ai/docs/trellis/sequences/) |
| **`checklist`** | pass/fail rows, live |
| **`alarms`** | current [alarms](https://phloem.ai/docs/trellis/alerts/) and tripped bounds |
| **`verifications`** | the bounds of the running [recipe](https://phloem.ai/docs/trellis/recipes/), pass/fail live |
| **`readout`** / **`table`** | a value as a number / every channel under a prefix (`table("/dut/*")`) |
| **`log`** | the running event log |

Arrange with `row(...)` and `col(...)`. The page only shows things. The
[channels](https://phloem.ai/docs/trellis/channels/), [stop conditions](https://phloem.ai/docs/trellis/checks/) and
[interlocks](https://phloem.ai/docs/trellis/interlocks/) do the work.
