Skip to content

Data Display Components ​

Components for displaying data in tables, lists, trees, and other structured formats.

Table ​

ui:table displays tabular data with columns, sorting, and pagination.

Basic Usage ​

xml
<ui:table data="{users}">
  <ui:column field="name" header="Name" />
  <ui:column field="email" header="Email" />
  <ui:column field="role" header="Role" />
</ui:table>

Attributes (ui:table) ​

AttributeTypeDefaultDescription
dataarrayrequiredArray of row objects
stripedbooleanfalseAlternate row colors
borderedbooleanfalseAdd borders
hoverablebooleantrueHighlight on hover
compactbooleanfalseReduce padding
selectablebooleanfalseEnable row selection
sortablebooleanfalseEnable column sorting
paginationbooleanfalseEnable pagination
pageSizenumber10Rows per page

Attributes (ui:column) ​

AttributeTypeDefaultDescription
fieldstringrequiredData field name
headerstringfieldColumn header text
widthstring"auto"Column width
sortablebooleanfalseEnable sorting
alignstring"left"Text alignment
formatstringnoneFormat type (date, currency, number)

With Sorting ​

xml
<ui:table data="{products}" sortable="true">
  <ui:column field="name" header="Product" sortable="true" />
  <ui:column field="price" header="Price" sortable="true" format="currency" />
  <ui:column field="stock" header="Stock" sortable="true" />
</ui:table>

With Pagination ​

xml
<ui:table data="{orders}" pagination="true" pageSize="20">
  <ui:column field="id" header="Order ID" />
  <ui:column field="customer" header="Customer" />
  <ui:column field="total" header="Total" format="currency" />
  <ui:column field="status" header="Status" />
</ui:table>

Custom Cell Rendering ​

xml
<ui:table data="{users}">
  <ui:column field="name" header="Name" />
  <ui:column field="status" header="Status">
    <ui:template>
      <ui:badge variant="{row.status == 'active' ? 'success' : 'secondary'}">
        {row.status}
      </ui:badge>
    </ui:template>
  </ui:column>
  <ui:column header="Actions">
    <ui:template>
      <ui:hbox gap="sm">
        <ui:button size="xs" on-click="editUser(row.id)">Edit</ui:button>
        <ui:button size="xs" variant="danger" on-click="deleteUser(row.id)">Delete</ui:button>
      </ui:hbox>
    </ui:template>
  </ui:column>
</ui:table>

With Row Selection ​

xml
<q:set name="selectedUsers" value='[]' type="array" />

<ui:table data="{users}" selectable="true" bind:selected="selectedUsers">
  <ui:column field="name" header="Name" />
  <ui:column field="email" header="Email" />
</ui:table>

<ui:text>{selectedUsers.length} users selected</ui:text>
<ui:button on-click="deleteSelected" disabled="{selectedUsers.length == 0}">
  Delete Selected
</ui:button>

Expandable Rows ​

xml
<ui:table data="{orders}" expandable="true">
  <ui:column field="id" header="Order ID" />
  <ui:column field="customer" header="Customer" />
  <ui:column field="total" header="Total" />

  <ui:expansion>
    <ui:vbox padding="md" gap="sm">
      <ui:text weight="bold">Order Items:</ui:text>
      <q:loop type="array" var="item" items="{row.items}">
        <ui:text>- {item.name} x {item.quantity}</ui:text>
      </q:loop>
    </ui:vbox>
  </ui:expansion>
</ui:table>

Empty State ​

xml
<ui:table data="{results}">
  <ui:column field="name" header="Name" />
  <ui:column field="value" header="Value" />

  <ui:empty>
    <ui:vbox align="center" padding="xl">
      <ui:icon name="inbox" size="xl" color="muted" />
      <ui:text color="muted">No results found</ui:text>
    </ui:vbox>
  </ui:empty>
</ui:table>

List ​

ui:list displays items in a list format.

Basic Usage ​

xml
<ui:list>
  <ui:listitem>First item</ui:listitem>
  <ui:listitem>Second item</ui:listitem>
  <ui:listitem>Third item</ui:listitem>
</ui:list>

Attributes ​

AttributeTypeDefaultDescription
typestring"none"Marker type (none, bullet, number, alpha)
gaptoken"sm"Space between items
dividersbooleanfalseShow dividers between items

List Types ​

xml
<!-- Bullet list -->
<ui:list type="bullet">
  <ui:listitem>Item one</ui:listitem>
  <ui:listitem>Item two</ui:listitem>
</ui:list>

<!-- Numbered list -->
<ui:list type="number">
  <ui:listitem>First step</ui:listitem>
  <ui:listitem>Second step</ui:listitem>
</ui:list>

<!-- Alphabetic list -->
<ui:list type="alpha">
  <ui:listitem>Option A</ui:listitem>
  <ui:listitem>Option B</ui:listitem>
</ui:list>

Dynamic List ​

xml
<q:set name="tasks" value='[
  {"id": 1, "name": "Buy groceries", "done": false},
  {"id": 2, "name": "Walk the dog", "done": true},
  {"id": 3, "name": "Write code", "done": false}
]' />

<ui:list dividers="true">
  <q:loop type="array" var="task" items="{tasks}">
    <ui:listitem>
      <ui:hbox align="center" gap="md">
        <ui:checkbox checked="{task.done}" on-change="toggleTask(task.id)" />
        <ui:text decoration="{task.done ? 'line-through' : 'none'}">
          {task.name}
        </ui:text>
      </ui:hbox>
    </ui:listitem>
  </q:loop>
</ui:list>

List with Avatars ​

xml
<ui:list dividers="true">
  <q:loop type="array" var="user" items="{users}">
    <ui:listitem>
      <ui:hbox align="center" gap="md">
        <ui:avatar src="{user.avatar}" name="{user.name}" />
        <ui:vbox gap="none">
          <ui:text weight="bold">{user.name}</ui:text>
          <ui:text color="muted" size="sm">{user.email}</ui:text>
        </ui:vbox>
        <ui:spacer />
        <ui:badge variant="{user.role == 'admin' ? 'primary' : 'secondary'}">
          {user.role}
        </ui:badge>
      </ui:hbox>
    </ui:listitem>
  </q:loop>
</ui:list>

Tree ​

ui:tree displays hierarchical data.

Basic Usage ​

xml
<ui:tree data="{fileSystem}">
  <ui:treetemplate>
    <ui:hbox gap="sm">
      <ui:icon name="{node.type == 'folder' ? 'folder' : 'file'}" />
      <ui:text>{node.name}</ui:text>
    </ui:hbox>
  </ui:treetemplate>
</ui:tree>

Attributes ​

AttributeTypeDefaultDescription
dataarrayrequiredTree data structure
childKeystring"children"Key for child nodes
labelKeystring"name"Key for node label
expandedKeysarray[]Initially expanded nodes
selectablebooleanfalseEnable selection
multiSelectbooleanfalseAllow multiple selections
checkablebooleanfalseShow checkboxes
on-selectstringnoneSelection handler

Tree Data Structure ​

xml
<q:set name="categories" value='[
  {
    "id": 1,
    "name": "Electronics",
    "children": [
      {
        "id": 2,
        "name": "Phones",
        "children": [
          {"id": 3, "name": "iPhone"},
          {"id": 4, "name": "Android"}
        ]
      },
      {"id": 5, "name": "Laptops"}
    ]
  },
  {
    "id": 6,
    "name": "Clothing",
    "children": [
      {"id": 7, "name": "Shirts"},
      {"id": 8, "name": "Pants"}
    ]
  }
]' />

<ui:tree data="{categories}" />

Checkable Tree ​

xml
<q:set name="checkedNodes" value='[]' type="array" />

<ui:tree
  data="{permissions}"
  checkable="true"
  bind:checked="checkedNodes"
  on-check="handlePermissionChange"
/>

<ui:text>Selected: {checkedNodes.join(', ')}</ui:text>

Custom Node Template ​

xml
<ui:tree data="{fileSystem}">
  <ui:treetemplate>
    <ui:hbox align="center" gap="sm" padding="xs">
      <ui:icon
        name="{node.type == 'folder' ? 'folder' : 'file-text'}"
        color="{node.type == 'folder' ? 'warning' : 'muted'}"
      />
      <ui:text>{node.name}</ui:text>
      <ui:spacer />
      <q:if condition="node.size">
        <ui:text color="muted" size="xs">{formatSize(node.size)}</ui:text>
      </q:if>
    </ui:hbox>
  </ui:treetemplate>
</ui:tree>

Chart ​

ui:chart displays data visualizations. Currently supports bar charts.

Bar Chart ​

xml
<ui:chart type="bar" title="Monthly Sales">
  <ui:data>
    [
      {"label": "Jan", "value": 4500},
      {"label": "Feb", "value": 3200},
      {"label": "Mar", "value": 5100},
      {"label": "Apr", "value": 4800}
    ]
  </ui:data>
</ui:chart>

Attributes ​

AttributeTypeDefaultDescription
typestring"bar"Chart type (bar, line, pie)
titlestringnoneChart title
widthstring"100%"Chart width
heightstring"300px"Chart height
colorsarraytheme colorsBar/segment colors
showValuesbooleantrueShow value labels
showLegendbooleanfalseShow legend

Dynamic Chart Data ​

xml
<q:invoke name="stats" url="/api/stats" />
<ui:chart type="bar" title="Revenue by Region">
  <ui:data>{stats.regions}</ui:data>
</ui:chart>

Multiple Data Series ​

xml
<ui:chart type="bar" title="Comparison" showLegend="true">
  <ui:series name="2024" color="primary">
    [
      {"label": "Q1", "value": 100},
      {"label": "Q2", "value": 150},
      {"label": "Q3", "value": 120}
    ]
  </ui:series>
  <ui:series name="2025" color="success">
    [
      {"label": "Q1", "value": 130},
      {"label": "Q2", "value": 180},
      {"label": "Q3", "value": 160}
    ]
  </ui:series>
</ui:chart>

Text ​

ui:text displays formatted text content.

Basic Usage ​

xml
<ui:text>Regular text</ui:text>
<ui:text weight="bold">Bold text</ui:text>
<ui:text size="xl">Large text</ui:text>
<ui:text color="primary">Colored text</ui:text>

Attributes ​

AttributeTypeDefaultDescription
sizestring"md"Font size token
weightstring"normal"Font weight (normal, bold)
colorstring"text"Color token or value
alignstring"left"Text alignment
decorationstring"none"Text decoration
truncatebooleanfalseTruncate with ellipsis
linesnumbernoneMax lines before truncate

Text Variants ​

xml
<!-- Heading sizes -->
<ui:text size="2xl" weight="bold">Heading 1</ui:text>
<ui:text size="xl" weight="bold">Heading 2</ui:text>
<ui:text size="lg" weight="bold">Heading 3</ui:text>

<!-- Body text -->
<ui:text>Normal paragraph text</ui:text>
<ui:text color="muted">Secondary text</ui:text>
<ui:text size="sm" color="muted">Caption text</ui:text>

<!-- Semantic colors -->
<ui:text color="success">Success message</ui:text>
<ui:text color="danger">Error message</ui:text>
<ui:text color="warning">Warning message</ui:text>

Truncation ​

xml
<!-- Single line truncate -->
<ui:text truncate="true" width="200px">
  This is a very long text that will be truncated with an ellipsis
</ui:text>

<!-- Multi-line clamp -->
<ui:text lines="3">
  This paragraph will be clamped to a maximum of three lines.
  Any text beyond that will be hidden and shown with an ellipsis.
</ui:text>

Complete Data Display Example ​

xml
<q:application id="dashboard" type="ui" xmlns:q="https://quantum.lang/ns"
               xmlns:ui="https://quantum.lang/ui">

  <q:invoke name="users" url="/api/users" />

  <ui:window title="User Management">
    <ui:vbox padding="lg" gap="lg">

      <ui:header>
        <ui:hbox justify="between" align="center">
          <ui:text size="2xl" weight="bold">Users</ui:text>
          <ui:button variant="primary">Add User</ui:button>
        </ui:hbox>
      </ui:header>

      <q:if condition="users.loading">
        <ui:skeleton type="table" rows="5" />
      </q:if>

      <q:if condition="users.error">
        <ui:alert variant="danger">Failed to load users</ui:alert>
      </q:if>

      <q:if condition="!users.loading && !users.error">
        <ui:table
          data="{users}"
          sortable="true"
          pagination="true"
          pageSize="10"
          striped="true"
        >
          <ui:column field="id" header="ID" width="60px" />
          <ui:column field="name" header="Name" sortable="true" />
          <ui:column field="email" header="Email" sortable="true" />
          <ui:column field="role" header="Role">
            <ui:template>
              <ui:badge variant="{row.role == 'admin' ? 'primary' : 'secondary'}">
                {row.role}
              </ui:badge>
            </ui:template>
          </ui:column>
          <ui:column field="status" header="Status">
            <ui:template>
              <ui:badge variant="{row.status == 'active' ? 'success' : 'danger'}">
                {row.status}
              </ui:badge>
            </ui:template>
          </ui:column>
          <ui:column field="createdAt" header="Created" format="date" sortable="true" />
          <ui:column header="Actions" width="150px">
            <ui:template>
              <ui:hbox gap="xs">
                <ui:button size="xs" variant="ghost" on-click="editUser(row.id)">
                  Edit
                </ui:button>
                <ui:button size="xs" variant="ghost" color="danger" on-click="deleteUser(row.id)">
                  Delete
                </ui:button>
              </ui:hbox>
            </ui:template>
          </ui:column>

          <ui:empty>
            <ui:vbox align="center" padding="xl">
              <ui:text color="muted">No users found</ui:text>
              <ui:button variant="primary" on-click="addUser">Add First User</ui:button>
            </ui:vbox>
          </ui:empty>
        </ui:table>
      </q:if>

    </ui:vbox>
  </ui:window>

</q:application>

Quantum Framework - Simplicity over configuration