> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreflux.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Display Components

> Read-only widgets: gauges, values, indicators, charts, tables, and alerts.

<Frame caption="A showcase panel mixing the display widgets on this page: a gauge, a value readout, an indicator, text, and a live chart">
  <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/other/display-showcase.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=348c7d4807b7d8847dcdae57138286c7" alt="A dashboard panel showing several display widgets: a temperature gauge, a pressure readout, a green machine status indicator, a status text line, and a live throughput chart" width="1665" height="715" data-path="images/dashboard/other/display-showcase.png" />
</Frame>

Display components show live data without accepting input. Each entry below opens with tabbed examples — the rendered result above the code that produces it — followed by the property reference.

<Tip>
  **Like instruments on a car dashboard.** Each one reads a signal and shows it its own way — a dial, a number, a warning light — and none of them lets you steer.
</Tip>

***

## Gauge

Circular (radial) or linear gauge for numeric values.

<Tabs>
  <Tab title="Basic">
    A radial gauge bound to a temperature topic:

    <Frame caption="A radial gauge bound to a temperature topic, reading 82.0 °C">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/gauge.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=9c3c9dd97bd0c144c93478b5cfbbebb4" alt="Radial gauge filled about two-thirds with an orange arc, reading 82.0 °C" width="538" height="363" data-path="images/dashboard/components/gauge.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "TempGauge" WITH TYPE "gauge"
        SET RANGE FROM 0 TO 100
        SET UNIT "°C"
        BIND VALUE TO TOPIC "sensor/temperature"
    ```
  </Tab>

  <Tab title="Full example">
    A gauge with a label, one decimal place, and two configured thresholds:

    <Frame caption="A labeled production-rate gauge with warning and critical thresholds configured">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/gauge-full.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=c2fff65712d01bc3505ca6ee6882f1f2" alt="Radial gauge labeled Production Rate showing the live production rate" width="535" height="361" data-path="images/dashboard/components/gauge-full.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "ProductionGauge" WITH TYPE "gauge"
        SET STYLE "radial"
        SET RANGE FROM 0 TO 100
        SET UNIT "units/hr"
        SET LABEL "Production Rate"
        SET DECIMALS 1
        BIND VALUE TO TOPIC "factory/production/rate"
        ADD THRESHOLD AT 75 WITH COLOR "warning" LABEL "High"
        ADD THRESHOLD AT 90 WITH COLOR "critical" LABEL "Critical"
    ```
  </Tab>
</Tabs>

| Property            | Type                    | Default    | Description      |
| ------------------- | ----------------------- | ---------- | ---------------- |
| `STYLE`             | `"radial"` / `"linear"` | `"radial"` | Gauge appearance |
| `RANGE FROM x TO y` | Numbers                 | required   | Min / max values |
| `UNIT`              | String                  | `""`       | Unit label       |
| `LABEL`             | String                  | `""`       | Display label    |
| `DECIMALS`          | Integer                 | `0`        | Decimal places   |

**Bind targets:** `VALUE`, `MIN`, `MAX`

## Value

The simplest read-only display: a number or string, with unit and formatting.

<Tabs>
  <Tab title="Basic">
    A pressure readout with two decimals:

    <Frame caption="A numeric readout showing the live pump pressure in bar">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/value-basic.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=ce3c932fe08a63c8a6d1528570477a5d" alt="Numeric value readout showing 3.42 bar" width="535" height="361" data-path="images/dashboard/components/value-basic.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "PressureDisplay" WITH TYPE "value"
        BIND VALUE TO TOPIC "pump/pressure"
        SET UNIT "bar"
        SET DECIMALS 2
    ```
  </Tab>

  <Tab title="A JSON Data example">
    Extracting one field from a JSON MQTT payload — `JSON_PATH` and the label are the new parts:

    <Frame caption="The value widget showing 1284.50 Wh, extracted from a JSON payload field">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/value.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=548c92c9d46401efb14f5eb377c66b9d" alt="Large numeric value readout showing 1284.50 Wh extracted from a JSON payload" width="538" height="363" data-path="images/dashboard/components/value.png" />
    </Frame>

    ```lot wrap focus={3,5} theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "EnergyDisplay" WITH TYPE "value"
        BIND VALUE TO TOPIC "machines/pump1/data"
        SET JSON_PATH "$.energy_wh"
        SET UNIT "Wh"
        SET LABEL "Energy"
        SET DECIMALS 2
    ```
  </Tab>
</Tabs>

| Property    | Type    | Default | Description                      |
| ----------- | ------- | ------- | -------------------------------- |
| `UNIT`      | String  | `""`    | Unit label                       |
| `LABEL`     | String  | `""`    | Display label                    |
| `DECIMALS`  | Integer | `0`     | Decimal places                   |
| `JSON_PATH` | String  | —       | JSONPath to extract from payload |

**Bind targets:** `VALUE`, `MAX`

<Note>
  If your topic carries a JSON object rather than a plain number, set `JSON_PATH` to pick the field — otherwise the widget shows the raw payload. Inspect the payload first in the [Data Viewer](/hub/mqtt/data-viewer).
</Note>

## Text / Label

Dynamic or static text. `label` is an alias for `text`.

<Tabs>
  <Tab title="Basic">
    A static heading rendered at large size:

    <Frame caption="A static section heading rendered at large size">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/text-basic.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=4f14a1b82c246e6d1d6ef0fef794a6d4" alt="A large static text line reading Zone 1 Overview" width="535" height="98" data-path="images/dashboard/components/text-basic.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "SectionTitle" WITH TYPE "label"
        SET LABEL "Zone 1 Overview"
        SET SIZE "large"
    ```
  </Tab>

  <Tab title="Full example">
    Dynamic text whose content updates live from the broker — the `BIND CONTENT` line is what makes it live:

    <Frame caption="A large status line whose text updates live from the system message topic">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/text-live.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=2900e1241db40d85f0dcb642093e2b85" alt="A large text line showing a live status message from the system message topic" width="815" height="278" data-path="images/dashboard/components/text-live.png" />
    </Frame>

    ```lot wrap focus={2} theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "StatusText" WITH TYPE "text"
        BIND CONTENT TO TOPIC "system/message"
        SET SIZE "large"
    ```
  </Tab>
</Tabs>

| Property | Type                               | Default     | Description |
| -------- | ---------------------------------- | ----------- | ----------- |
| `SIZE`   | `"small"` / `"medium"` / `"large"` | `"medium"`  | Font size   |
| `COLOR`  | Color string                       | `"inherit"` | Text color  |

**Bind targets:** `CONTENT`, `COLOR`, `TITLE`, `LABEL`

## Indicator

Maps incoming values to colors — running/stopped/fault at a glance.

<Tabs>
  <Tab title="Basic">
    A pump-running dot — green when the bound topic reads `true`:

    <Frame caption="A status dot that turns green while the pump-running topic reads true">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/indicator-basic.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=74db3c3c0743e148f76a6c05d8234978" alt="A green pump status indicator dot" width="535" height="98" data-path="images/dashboard/components/indicator-basic.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "PumpIndicator" WITH TYPE "indicator"
        BIND STATE TO TOPIC "pump/running"
        SET ON_VALUE "true" WITH COLOR "success"
        SET ON_VALUE "false" WITH COLOR "muted"
    ```
  </Tab>

  <Tab title="Full example">
    Three states mapped to three colors, rendered large — the extra mapping and size are highlighted:

    <Frame caption="A large green dot for running; switches to red or yellow as the status topic changes">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/indicator-large.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=d03616ddc371adef4b1c5e5fe2c66780" alt="A large green machine status indicator dot for the running state" width="535" height="57" data-path="images/dashboard/components/indicator-large.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "MachineStatus" WITH TYPE "indicator"
        BIND STATE TO TOPIC "machine/status"
        SET ON_VALUE "running" WITH COLOR "green"
        SET ON_VALUE "stopped" WITH COLOR "red"
        SET ON_VALUE "maintenance" WITH COLOR "yellow"
        SET SIZE "large"
    ```
  </Tab>
</Tabs>

| Property   | Type                               | Default    | Description                         |
| ---------- | ---------------------------------- | ---------- | ----------------------------------- |
| `ON_VALUE` | `"state" WITH COLOR "color"`       | required   | One or more value-to-color mappings |
| `SIZE`     | `"small"` / `"medium"` / `"large"` | `"medium"` | Indicator dot size                  |

**Bind targets:** `STATE`

## Realtime Chart

Live streaming chart — it receives **individual data points** from a topic and builds the trend itself.

<Tabs>
  <Tab title="Basic">
    One topic, one trace — every published value becomes a point:

    <Frame caption="A realtime-chart building a live trend point by point from the throughput topic">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/realtime-chart-basic.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=a44d88f1acd67db81e2173eb9de35619" alt="A realtime line chart labeled Line Throughput trending as values arrive" width="815" height="278" data-path="images/dashboard/components/realtime-chart-basic.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "ThroughputTrend" WITH TYPE "realtime-chart"
        SET LABEL "Line Throughput"
        BIND VALUE TO TOPIC "factory/throughput"
    ```
  </Tab>

  <Tab title="Full example">
    The same idea with an explicit chart type, a y-axis unit, and a series label — the additions are highlighted:

    <Frame caption="A fully configured realtime-chart trending the message count">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/realtime-chart-full.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=5b5353a0f8f39c764ece8f5bd1f10db2" alt="A realtime line chart labeled Message Count Trend building a live trend as points arrive" width="815" height="278" data-path="images/dashboard/components/realtime-chart-full.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "MessageCountTrend" WITH TYPE "realtime-chart"
        SET LABEL "Message Count Trend"
        SET CHART_TYPE "line"
        SET UNIT "msg"
        BIND VALUE TO TOPIC "kpi/operational/messageCount"
            SET SERIES_LABEL "Message Count"
    ```
  </Tab>
</Tabs>

<Note>
  **Multi-series is not working in the current HUB build.** Adding a second `BIND VALUE TO TOPIC` (each with its own indented `SET SERIES_LABEL`) is the documented syntax for multiple traces, but the chart currently renders a single trace and no legend. Use one chart per signal for now.
</Note>

| Property       | Type               | Description                                            |
| -------------- | ------------------ | ------------------------------------------------------ |
| `CHART_TYPE`   | `"line"` / `"bar"` | Trace style (the current build renders both as a line) |
| `UNIT`         | String             | Y-axis unit label                                      |
| `LABEL`        | String             | Chart heading                                          |
| `SERIES_LABEL` | String             | Series name — set **under the BIND, indented**         |

**Bind target:** `VALUE`

## Image

Static, dynamic, or camera-fed image.

<Tabs>
  <Tab title="Basic">
    A static image loaded from a URL:

    <Frame caption="An image component rendering a remote URL on the panel">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/image-url.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=da5b8a9d7ff2ff782a718deb9de8303a" alt="An image component on a dashboard panel rendering a remote picture" width="535" height="291" data-path="images/dashboard/components/image-url.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "ProductPhoto" WITH TYPE "image"
        SET SRC "https://picsum.photos/320/240"
        SET WIDTH 320
        SET HEIGHT 240
    ```
  </Tab>

  <Tab title="Full example">
    A live feed whose source URL is published over MQTT — the `BIND SRC` line replaces the static source:

    <Frame caption="The image swaps live whenever a new source is published to the snapshot topic">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/image-topic.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=cd78420f09d93731dfb671f9a6e6f0e3" alt="An image component rendering a picture whose URL was published to a camera snapshot topic" width="535" height="291" data-path="images/dashboard/components/image-topic.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "CameraFeed" WITH TYPE "image"
        BIND SRC TO TOPIC "camera/1/snapshot"
        SET WIDTH 320
        SET HEIGHT 240
    ```
  </Tab>
</Tabs>

| Property          | Type               | Description                    |
| ----------------- | ------------------ | ------------------------------ |
| `SRC`             | String / ENV / URL | Image source path or URL       |
| `FALLBACK`        | String             | Fallback image if source fails |
| `WIDTH`, `HEIGHT` | Integer            | Dimensions in pixels           |

**Bind targets:** `SRC`, `VISIBLE`

## Table

Tabular data from a JSON array topic or a query result.

<Tabs>
  <Tab title="Basic">
    Each array element becomes a row; `COLUMNS` picks and orders the fields:

    <Frame caption="A four-column table populated from a JSON array topic">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/table.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=623c8fc914491f4a61a47c0e610b972e" alt="A table with time, barcode, product, and status columns showing recent scans" width="814" height="278" data-path="images/dashboard/components/table.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "ScanHistory" WITH TYPE "table"
        BIND DATA TO TOPIC "barcode/history"
        SET COLUMNS "time, barcode, product, status"
        SET MAX_ROWS 10
    ```
  </Tab>
</Tabs>

| Property   | Type    | Description                  |
| ---------- | ------- | ---------------------------- |
| `COLUMNS`  | String  | Comma-separated column names |
| `MAX_ROWS` | Integer | Maximum rows to display      |

**Bind targets:** `DATA`

## List

Scrollable list of items from a topic or model.

<Tabs>
  <Tab title="Basic">
    <Frame caption="A scrollable list of alarm entries from a topic">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/list.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=4995d6e427f28360e88a22108d9ba3b5" alt="A list widget showing alarm entries from the zone1 alarms topic" width="538" height="133" data-path="images/dashboard/components/list.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "AlarmLog" WITH TYPE "list"
        BIND DATA TO TOPIC "zone1/alarms"
    ```
  </Tab>
</Tabs>

**Bind targets:** `DATA`

## Alert

Banner for critical messages — typically bound to an alarm flag.

<Tabs>
  <Tab title="Basic">
    The banner appears while the alarm flag is true and shows the live message:

    <Frame caption="A banner that appears while the alarm flag is true and shows the live message">
      <img src="https://mintcdn.com/coreflux/ry-30sFxFVWzN72U/images/dashboard/components/alert.png?fit=max&auto=format&n=ry-30sFxFVWzN72U&q=85&s=e7dcc7473dfdd5371642458dddfb02f6" alt="An alert banner showing a pump pressure critical message" width="538" height="133" data-path="images/dashboard/components/alert.png" />
    </Frame>

    ```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
    ADD COMPONENT "AlarmBanner" WITH TYPE "alert"
        BIND VISIBLE TO TOPIC "pump/alarm_active"
        BIND CONTENT TO TOPIC "pump/alarm_message"
        SET VARIANT "critical"
    ```

    <Note>
      In the current HUB build the `critical` variant renders in a neutral/muted style rather than a strong red banner — the message and visibility behaviour work as shown.
    </Note>
  </Tab>
</Tabs>

| Property           | Type                                  | Description    |
| ------------------ | ------------------------------------- | -------------- |
| `TYPE` / `VARIANT` | `"critical"` / `"warning"` / `"info"` | Severity style |

**Bind targets:** `CONTENT`, `VISIBLE`

## Common mistakes

<AccordionGroup>
  <Accordion title="A property set with WITH is silently ignored">
    Properties use `SET`, never `WITH`. `WITH UNIT "msg"`, `WITH RANGE 0, 200`, and `WITH DECIMALS 2` are silently ignored — write `SET UNIT "msg"`, `SET RANGE FROM 0 TO 200`, `SET DECIMALS 2`.
  </Accordion>

  <Accordion title="The value widget shows a JSON blob instead of a number">
    The topic carries a JSON object — add `SET JSON_PATH "$.field"` to extract the field you want, and confirm the payload shape in the Data Viewer.
  </Accordion>
</AccordionGroup>

## Next Steps

<CardGroup cols={2}>
  <Card title="Input & control components" icon="sliders" href="/hub/dashboards/components/inputs">
    Buttons, toggles, sliders, and fields that write back to the broker.
  </Card>

  <Card title="Data binding" icon="plug" href="/latest/lot-language/panels/data-binding">
    Topics, models, queries, transformations, and JSON extraction.
  </Card>
</CardGroup>
