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

# Building dashboard layouts with containers and items

> Organize charts, text, filters, and controls inside grid or stack containers for precise positioning.

export const DashboardPageNavIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M4 8h16"></path><path d="M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z"></path><path d="M8 4v4"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardStackContainerIcon = ({label}) => {
  return <span>
      <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M4 5C4 4.73478 4.10536 4.48043 4.29289 4.29289C4.48043 4.10536 4.73478 4 5 4H19C19.2652 4 19.5196 4.10536 19.7071 4.29289C19.8946 4.48043 20 4.73478 20 5V9C20 9.26522 19.8946 9.51957 19.7071 9.70711C19.5196 9.89464 19.2652 10 19 10H5C4.73478 10 4.48043 9.89464 4.29289 9.70711C4.10536 9.51957 4 9.26522 4 9V5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M4 15C4 14.7348 4.10536 14.4804 4.29289 14.2929C4.48043 14.1054 4.73478 14 5 14H12C12.2652 14 12.5196 14.1054 12.7071 14.2929C12.8946 14.4804 13 14.7348 13 15V19C13 19.2652 12.8946 19.5196 12.7071 19.7071C12.5196 19.8946 12.2652 20 12 20H5C4.73478 20 4.48043 19.8946 4.29289 19.7071C4.10536 19.5196 4 19.2652 4 19V15Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardTextIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M4 20l3 0"></path><path d="M14 20l7 0"></path><path d="M6.9 15l6.9 0"></path><path d="M10.2 6.3l5.8 13.7"></path><path d="M5 20l6 -16l2 0l7 16"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardLayoutIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M4 7l16 0"></path><path d="M4 17l16 0"></path><path d="M7 4l0 16"></path><path d="M17 4l0 16"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardChartIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M3 3v18h18"></path><path d="M20 18v3"></path><path d="M16 16v5"></path><path d="M12 13v8"></path><path d="M8 16v5"></path><path d="M3 11c6 0 5 -5 9 -5s3 5 9 5"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardControlIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M3 3m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z"></path><path d="M3 11l8 -8"></path><path d="M3 17l14 -14"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardCatalogIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M10 19h-6a1 1 0 0 1 -1 -1v-14a1 1 0 0 1 1 -1h6a2 2 0 0 1 2 2a2 2 0 0 1 2 -2h6a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-6a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2z"></path><path d="M12 5v16"></path><path d="M7 7h1"></path><path d="M7 11h1"></path><path d="M16 7h1"></path><path d="M16 11h1"></path><path d="M16 15h1"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardAddItemIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M4 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z"></path><path d="M4 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z"></path><path d="M14 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z"></path><path d="M14 7l6 0"></path><path d="M17 4l0 6"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const DashboardPlaceholderIcon = ({label}) => {
  return <span>
      <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M4 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z"></path><path d="M14 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z"></path><path d="M4 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z"></path><path d="M14 17h6m-3 -3v6"></path></svg>
      {label && ` ${label}`}
    </span>;
};

export const WorkbookIcon = ({label}) => {
  return <span>
      <svg fill="none" height="1em" stroke-width="2" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg" style={{
    display: "inline",
    verticalAlign: "middle"
  }}><path d="M9.1875 3V15.375M21 15.375H3M7 21H17C19.2091 21 21 19.2091 21 17V7C21 4.79086 19.2091 3 17 3H7C4.79086 3 3 4.79086 3 7V17C3 19.2091 4.79086 21 7 21Z" stroke="currentColor"></path></svg>
      {label && ` ${label}`}
    </span>;
};

<Note>
  **Using a classic dashboard?** [Upgrade it](/visualize-present/dashboards/create#classic-dashboards) to use the features in this guide.
</Note>

Dashboards are built from two components:

* **Items** — The charts, text, filters, and controls you place on the dashboard
* **Containers** — The regions that hold and arrange items

Containers can be nested inside other containers, letting you group related items, control spacing, and build structured layouts that go beyond the flat grid of a classic dashboard.

## Requirements

Modifying dashboard layouts requires **Editor**, **Manager**, or **Owner** permissions on the document.

<h2 id="containers">
  Working with containers
</h2>

When you create a new dashboard or upgrade from a [classic dashboard](/visualize-present/dashboards/create#classic-dashboards), your existing items are placed into an initial container. From there, you can add more containers, configure how each arranges its items, and nest containers inside one another to shape your dashboard.

<h3 id="layout-type">
  Selecting a layout type
</h3>

When you add a container to your dashboard, you choose between two layout types:

| Type                                      | Description                                                          | Best for                                                      |
| ----------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------- |
| <Icon icon="grid-2" /> **Grid**           | Free-form positioning; items can be placed at any position           | Precise control over each item's position                     |
| <DashboardStackContainerIcon /> **Stack** | Arrange items in columns or rows; you control spacing and alignment. | Structured sections such as a row of filters, a sidebar, etc. |

To add a container, click <DashboardAddItemIcon /> **Add > Layout** and select a layout type.

**Stack layout settings**

In stack containers, you can control:

* **Direction** - `column` (vertical) or `row` (horizontal)
* **Gap** - Spacing between items
* **Padding** - Spacing inside the container edges
* **Wrap** - Controls whether items wrap to new lines when they exceed the container width (Yes = wrap, No = nowrap)
* **Align** - How items align perpendicular to the direction (start, center, end, stretch)
* **Justify** - How items are distributed along the direction (start, center, end, space between)

### Naming containers

Each container can have a name to help you identify it while editing. To rename a container, select it and edit the **Name** field in the properties panel on the right side of the screen.

### Nesting containers

Containers can be placed inside other containers to build nested layouts. For example, place a stack container (set to row direction) inside a grid container to create a horizontal row of filters within a larger free-form layout.

### Resizing items in stack containers

<Note>
  Resize handles are currently only available for items in **column** stacks. Row stacks do not support manual resizing yet.
</Note>

Items within column stack containers can be resized by dragging resize handles, similar to resizing items in grid containers. This allows you to set specific dimensions for individual items while maintaining the automatic flow of the stack layout.

<Steps>
  <Step noAnchor>
    Select the item you want to resize. Resize handles will display around the selected item.
  </Step>

  <Step noAnchor>
    Drag a resize handle to adjust the item's dimensions.
  </Step>

  <Step noAnchor>
    Release to apply the new size.
  </Step>
</Steps>

Resized items are sized in pixel values with a minimum size of 12px. Changes are previewed live as you drag and committed when you release the mouse.

To remove custom sizing, right-click the item and select **Reset sizing**. This removes all explicit sizing properties (width, height, and min/max constraints) and returns the item to its default automatic size.

<h3 id="lock-container">
  Locking container arrangements
</h3>

You can lock a container to prevent its contents from being rearranged. Containers are unlocked by default until you explicitly lock them.

When a container is locked:

* Items inside the locked container cannot be dragged, reordered, resized, or have new items dropped into the container
* All child containers are also locked, preventing any rearrangement throughout the nested structure
* The locked container can still be moved and resized if its parent container is unlocked

#### Locking a container

<Steps>
  <Step noAnchor>
    Select the container you want to lock.
  </Step>

  <Step noAnchor>
    In the properties panel on the right, locate the <Icon icon="lock" /> icon.
  </Step>

  <Step noAnchor>
    Click the <Icon icon="lock" /> icon to lock the container.
  </Step>
</Steps>

When you select an item inside a locked container, you'll see a lock indicator in the properties panel along with a message explaining that items in locked containers cannot be rearranged.

#### Unlocking a container

To unlock a container and allow its contents to be rearranged again, select the locked container and then click the <Icon icon="lock-open" /> icon in the properties panel.

<h2 id="items">
  Adding and organizing items
</h2>

Items can be added automatically — new queries from the workbook are placed on the first page, and page navigation appears when you create multiple pages — or manually from the dashboard's <DashboardAddItemIcon /> **Add** menu.

From there, you can move items between [containers](#containers), browse them in the <DashboardCatalogIcon /> **Catalog**, and edit their configuration without leaving the layout editor.

Dashboards currently support the following item types:

| Type                                         | Description                                                                                                                         |
| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| <DashboardChartIcon /> **Charts**            | [Visualizations](/visualize-present/dashboards/charts) from your workbook queries                                                   |
| <DashboardTextIcon /> **Text**               | Formatted text using [Markdown](/visualize-present/dashboards/text-markdown)                                                        |
| <Icon icon="filter" /> **Filters**           | [Interactive filters](/visualize-present/dashboards/filters) that control chart data                                                |
| <DashboardControlIcon /> **Controls**        | [Field controls](/visualize-present/dashboards/controls) that dynamically switch chart fields                                       |
| <DashboardPageNavIcon /> **Page navigation** | Inline page switcher for [multi-page dashboards](/visualize-present/dashboards/page-navigation)                                     |
| <DashboardPlaceholderIcon /> **Placeholder** | Wireframe element showing [placeholder content](/visualize-present/dashboards/placeholders) for queries, filters, controls, or text |
| <Icon icon="arrows-left-right" /> **Spacer** | Empty layout element for adding spacing between items                                                                               |
| <Icon icon="minus" /> **Divider**            | Separator line for creating visual divisions between items                                                                          |

### Adding items to a dashboard

Click <DashboardAddItemIcon /> **Add** in the toolbar to insert any item, a [layout container](#layout-type), or a new page.

Page navigation is automatically added when you create a second [dashboard page](/visualize-present/dashboards/pages), but you can also add it manually from the <DashboardLayoutIcon /> **Layout** submenu to place additional navigation or customize its position.

<Note>
  As pages are top-level elements, they can only be added from the toolbar <DashboardAddItemIcon /> **Add** menu, not from the **Add child** button in the properties panel.
</Note>

### Browsing items in the catalog

The catalog is a browsable library of all available items on your dashboard. Click the <DashboardCatalogIcon /> **Catalog** button in the toolbar to open it.

The catalog displays items in two groups:

* **Controls & filters** - All dashboard filters and controls, sorted alphabetically
* **Queries** - Charts and query visualizations

Use the search field at the top of the catalog to filter items by name. To place an item, click it in the catalog and then select the target container from the menu that appears.

The catalog is useful for finding items that haven't been placed yet or for quickly moving items into a specific container without selecting them on the canvas first.

<Note>
  New queries added to the workbook are automatically placed on the first page. If a query has been deleted, use the catalog to find and re-add it to the dashboard.
</Note>

### Placing items in containers

There are several ways to place items into a container:

#### From the catalog

1. Click the <DashboardCatalogIcon /> **Catalog** button in the toolbar.
2. Find the item you want to place. Use search to filter by name.
3. Click the item.
4. Select the target container from the placement menu.

<Tip>
  Quickly add an item into an existing container by selecting the container and then using the **Add** or **Catalog** menus. You'll see an **Adds inside selection** option in the dropdown menu:

  <img src="https://mintcdn.com/omni-e7402367/f5an5zp95HwbH2Ky/visualize-present/images/advanced-layout-add-inside-selection.png?fit=max&auto=format&n=f5an5zp95HwbH2Ky&q=85&s=2319416719cba6b85012eec607a7f2c8" alt="Alt text" width="293" height="180" data-path="visualize-present/images/advanced-layout-add-inside-selection.png" />

  To instead add the item to the page root, click the <Icon icon="x" /> icon.
</Tip>

#### Using the properties panel

1. Select the item you want to place on the canvas.
2. In the properties panel on the right, click **Place** (for unplaced items) or **Move** (for items already in a container).
3. A menu will appear showing all available containers.
4. Click the target container to move the item into it.

#### Repositioning items

You can drag items to reposition them within a container or move them between containers. This works for all [container layout types](#layout-type).

| Within a...                                                   | Description                                                                                                                                                                         |
| ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <Icon icon="grid-2" /> **Grid container**                     | Drag items to any position and resize by dragging their edges                                                                                                                       |
| <DashboardStackContainerIcon /> **Stack container**           | Drag items up or down (in column direction) or left and right (in row direction) to reorder them within the stack                                                                   |
| <Icon icon="arrow-right-arrow-left" /> **Between containers** | Drag items from one container to another, regardless of container layout type. This lets you quickly reorganize your dashboard layout without using the catalog or properties panel |

While dragging, Omni provides visual cues to help you place items:

* Containers that can accept the item show a **colored outline** when you hover over them
* Stack containers show a **drop indicator line** at the insertion point where the item will be placed
* The container you're dragging from shows an outline to indicate the active drag operation

#### Unplaced items

To re-add items to the dashboard, use the <DashboardCatalogIcon /> **Catalog**.

### Aligning filters and controls with tiles

When you place filters or controls directly on the page root alongside tile containers, Omni automatically applies a **Tile align** preset to ensure visual alignment. This preset adds padding to the filter or control that matches the outer spacing of tile containers, so they align cleanly as siblings on the grid.

#### Automatic preset behavior

<Note>
  The tile-align preset is only available for filters and controls. Charts and text items are not eligible for this preset.
</Note>

The tile-align preset is managed automatically based on where you place the item:

* **Auto-applied** — When you drag a filter or control into the page root grid (outside of any container), the preset is automatically applied
* **Auto-cleared** — When you move a filter or control into a tile container, the preset is automatically removed to prevent double spacing

When the preset is applied, Omni automatically adjusts the item's grid height (+1 unit) to account for the additional padding.

#### Manually changing the preset

To manually control the preset:

1. Select the filter or control on the canvas.
2. In the properties panel on the right, locate the **Preset** dropdown.
3. Select **Tile align** to apply the preset, or **None** to remove it.

<h3 id="duplicate-container-item">
  Duplicating containers and items
</h3>

<Note>
  Duplication is not available for:

  * Pages - Use the [duplicate page](/visualize-present/dashboards/pages#duplicate-page) action instead
  * Filter and control items
</Note>

Duplicate existing containers and items to quickly create copies with the same configuration and styling.

You can duplicate a container or item in three ways:

* **Context menu** - Right-click the container or item and select **Duplicate**
* **Properties panel** - Select the container or item, then click the menu icon in the properties panel header and select **Duplicate**
* **Keyboard shortcut** - Select the container or item and press `⌘` + `D` (Mac) or `Ctrl` + `D` (Windows)

Where the duplicate appears depends on the parent container type:

| Parent container                          | Placement                                                                                                               |
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| <DashboardStackContainerIcon /> **Stack** | The duplicate is inserted immediately after the original item                                                           |
| <Icon icon="grid-2" /> **Grid**           | The duplicate is placed directly below the original with the same dimensions, pushing down any items that would collide |

## Accessing the properties panel

When the properties panel is closed, right-click on a dashboard item and select **Edit** from the context menu to open it.

You can also use keyboard shortcuts (`⌘` + `\` on Mac, `Ctrl` + `\` on Windows) to open the properties panel.

## Undoing and redoing layout changes

<Note>
  Only layout changes can be undone. This includes actions like adding, moving, or resizing containers and items, or adjusting container properties.
</Note>

When editing a dashboard, you can undo and redo layout changes using the **Edit** menu, toolbar buttons, or keyboard shortcuts:

* **Edit menu** - Click **Edit** > **Undo** or **Edit** > **Redo**
* **Toolbar** - Click the <Icon icon="rotate-left" iconType="solid" /> (undo) or <Icon icon="rotate-right" iconType="solid" /> (redo) icons in the editing toolbar
* **Keyboard shortcuts** - Press `⌘Z` (Mac) or `Ctrl+Z` (Windows) to undo, `⇧⌘Z` (Mac) or `⇧Ctrl+Z` (Windows) to redo

### History clearing

Your undo/redo history is automatically cleared when you make non-layout changes to the dashboard, such as:

* Renaming the dashboard or items
* Editing filter configurations
* Updating query definitions
* Changing dashboard settings

After a non-layout change, you won't be able to undo past that point. This ensures that layout changes and content changes remain independent and prevents conflicts between different types of edits.

## Next steps

* Use [pages](/visualize-present/dashboards/pages) to create multi-page dashboards, where each page has its own layout, items, and filters.
* Customize [page navigation](/visualize-present/dashboards/page-navigation) to control how viewers move between pages, including custom tabs and dynamic labels.
* Configure [filters](/visualize-present/dashboards/filter-display-options) to display filters as button toggles, multi-select dropdowns, single-day pickers, and timeframe controls.
