Documentation

Documentation versions (currently viewingVaadin 23)
New Acceleration Kits: Kubernetes Kit and Azure Cloud Kit. Read the blog post.

Tabs

Tabs are used to organize and group content into sections that the user can navigate between.

Open in a
new tab
<vaadin-tabs>
  <vaadin-tab>Details</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

Use Tabs when you want to allow in-place navigation within a certain part of the UI, instead of showing everything at once or forcing the user to navigate between different views.

Tab Sheet

Tabs are most conveniently used as part of a Tab Sheet that includes automatically switched content areas for each tab.

Open in a
new tab
<vaadin-tabsheet>
  <vaadin-tabs slot="tabs">
    <vaadin-tab id="dashboard-tab">Dashboard</vaadin-tab>
    <vaadin-tab id="payment-tab">Payment</vaadin-tab>
    <vaadin-tab id="shipping-tab">Shipping</vaadin-tab>
  </vaadin-tabs>

  <div tab="dashboard-tab">This is the Dashboard tab content</div>
  <div tab="payment-tab">This is the Payment tab content</div>
  <div tab="shipping-tab">This is the Shipping tab content</div>
</vaadin-tabsheet>

States

A Tab can be selected, unselected, or disabled.

Open in a
new tab
<vaadin-tabs>
  <vaadin-tab>Selected</vaadin-tab>
  <vaadin-tab>Unselected</vaadin-tab>
  <vaadin-tab disabled>Disabled</vaadin-tab>
</vaadin-tabs>

Disable a Tab to mark it as unavailable. Disabled Tabs can’t be focused and may be invisible to assistive technologies, such as screen readers.

Disabling can be preferable to hiding an element to prevent changes in layout when the element’s visibility changes. They can also make users aware of its existence even when unavailable.

Autoselect (Java Only)

The first tab you add to Tabs or Tab Sheet is automatically selected. Similarly, when a selected tab is removed, the next available tab is automatically selected. Autoselect is enabled by default, but you can disable this behavior if needed.

Open in a
new tab
Tabs tabs = new Tabs();
tabs.setAutoselect(false);

When using autoselect and tab selection change listeners, you should add selection change listeners before adding any tabs if you want the listeners to trigger for the automatically selected tab.

Orientation and Overflow

Tabs support two different orientations: horizontal (default) and vertical, which is not currently supported in Tab Sheets. Base your choice of orientation on the use case and the available space.

Horizontal

Horizontal tabs may be easier for users to understand and associate with their content. They are best suited for a small number of items, but provide scrolling on overflow.

Open in a
new tab
<vaadin-tabs style="max-width: 100%; width: 400px;">
  <vaadin-tab>Analytics</vaadin-tab>
  <vaadin-tab>Customers</vaadin-tab>
  <vaadin-tab>Dashboards</vaadin-tab>
  <vaadin-tab>Documents</vaadin-tab>
  <vaadin-tab>Orders</vaadin-tab>
</vaadin-tabs>

In horizontal orientation, scroll buttons are displayed by default in aid scrolling the tabs. These can be disabled by applying the hide-scroll-buttons theme variant.

Open in a
new tab
<vaadin-tabs theme="hide-scroll-buttons">
  <vaadin-tab>Analytics</vaadin-tab>
  <vaadin-tab>Customers</vaadin-tab>
  <vaadin-tab>Dashboards</vaadin-tab>
  <vaadin-tab>Documents</vaadin-tab>
  <vaadin-tab>Orders</vaadin-tab>
  <vaadin-tab>Products</vaadin-tab>
  <vaadin-tab>Tasks</vaadin-tab>
</vaadin-tabs>
Note

Hiding the scroll buttons isn’t recommended for UIs designed to be operated on non-touchscreen devices, as horizontal scrolling can be difficult without them.

Vertical

Vertical tabs can be a better choice for a large number of items. It’s easier for the user to scan a vertical list of options. However, they may not be easy to understand and associate with their content. Vertical tabs also provide scrolling on overflow, but no scroll buttons.

Open in a
new tab
<vaadin-tabs orientation="vertical" style="height: 240px; width: 240px;">
  <vaadin-tab>Analytics</vaadin-tab>
  <vaadin-tab>Customers</vaadin-tab>
  <vaadin-tab>Dashboards</vaadin-tab>
  <vaadin-tab>Documents</vaadin-tab>
  <vaadin-tab>Orders</vaadin-tab>
  <vaadin-tab>Products</vaadin-tab>
  <vaadin-tab>Tasks</vaadin-tab>
</vaadin-tabs>

Vertical orientation isn’t available for Tab Sheets.

Icons and Other Tab Content

Tabs can contain more than text.

Icons

Icons can be used to make tabs more prominent and easier to identify. They can be added next to, or above, the labels.

Horizontal Tabs work best with icons above the labels.

Open in a
new tab
<vaadin-tabs>
  <vaadin-tab theme="icon-on-top">
    <vaadin-icon icon="vaadin:user"></vaadin-icon>
    <span>Profile</span>
  </vaadin-tab>
  <vaadin-tab theme="icon-on-top">
    <vaadin-icon icon="vaadin:cog"></vaadin-icon>
    <span>Settings</span>
  </vaadin-tab>
  <vaadin-tab theme="icon-on-top">
    <vaadin-icon icon="vaadin:bell"></vaadin-icon>
    <span>Notifications</span>
  </vaadin-tab>
</vaadin-tabs>

Vertical Tabs work best with icons next to labels.

Open in a
new tab
<vaadin-tabs orientation="vertical">
  <vaadin-tab>
    <vaadin-icon icon="vaadin:user"></vaadin-icon>
    <span>Profile</span>
  </vaadin-tab>
  <vaadin-tab>
    <vaadin-icon icon="vaadin:cog"></vaadin-icon>
    <span>Settings</span>
  </vaadin-tab>
  <vaadin-tab>
    <vaadin-icon icon="vaadin:bell"></vaadin-icon>
    <span>Notifications</span>
  </vaadin-tab>
</vaadin-tabs>

Icon-only labels should provide a textual description using a Tooltip, or an aria-label attribute for assistive technologies.

Other Elements

Tabs can contain almost any UI elements, such as badges indicating the number of items per tab.

Open in a
new tab
<!--
  NOTE: You need import the 'lumo-badge' style sheets to use theme="badge"
-->
<vaadin-tabs>
  <vaadin-tab>
    <span>Open</span>
    <span theme="badge small contrast">24</span>
  </vaadin-tab>
  <vaadin-tab>
    <span>Completed</span>
    <span theme="badge small contrast">439</span>
  </vaadin-tab>
  <vaadin-tab>
    <span>Cancelled</span>
    <span theme="badge small contrast">5</span>
  </vaadin-tab>
</vaadin-tabs>

Theme Variants

Centered

By default, Tabs are left-aligned. They can be centered using the centered theme variant.

Open in a
new tab
<vaadin-tabs theme="centered">
  <vaadin-tab>Details</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

Usage Recommendations

  • Visual and stylistic preference.

  • Typically used for top-level navigation.

  • Use with caution: default left-aligned tabs are more discoverable.

Equal-Width Tabs

Apply the equal-width-tabs theme variant to make each Tab share equally the available space. This disables the ability to scroll, as the content never overflows.

Open in a
new tab
<vaadin-tabs theme="equal-width-tabs">
  <vaadin-tab>Details</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

Usage Recommendations

For a small number of tabs in a narrow space, such as:

  • Tabbed sidebar; and

  • Mobile (portrait) layouts.

Minimal

Reduces visual styles to a minimum.

Open in a
new tab
<vaadin-tabs theme="minimal">
  <vaadin-tab>Details</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

Usage Recommendations

  • To reduce visual clutter.

  • Use with caution, as this reduces the visual distinction of selected tabs to color only. This can be difficult to discern for many users.

Small

The small theme variant can be used to make the Tabs smaller. This can be good when space is limited.

Open in a
new tab
<vaadin-tabs theme="small">
  <vaadin-tab>Details</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

Bordered

The bordered theme variant adds a border around the Tab Sheet component.

Open in a
new tab
<vaadin-tabsheet theme="bordered">
  <vaadin-tabs slot="tabs">
    <vaadin-tab id="dashboard-tab">Dashboard</vaadin-tab>
    <vaadin-tab id="payment-tab">Payment</vaadin-tab>
    <vaadin-tab id="shipping-tab">Shipping</vaadin-tab>
  </vaadin-tabs>

  <div tab="dashboard-tab">This is the Dashboard tab content</div>
  <div tab="payment-tab">This is the Payment tab content</div>
  <div tab="shipping-tab">This is the Shipping tab content</div>
</vaadin-tabsheet>

Prefix and Suffix

Custom content can be placed before or after the tabs in a Tab Sheet by placing it in the prefix and suffix slots.

Open in a
new tab
<vaadin-button slot="prefix">Close all</vaadin-button>

<vaadin-button slot="suffix" theme="icon" aria-label="Add tab">
  <vaadin-icon icon="vaadin:plus"></vaadin-icon>
</vaadin-button>

Focus and Keyboard

Tab focus is rendered differently when focused by keyboard.

Open in a
new tab
<vaadin-tabs>
  <vaadin-tab focus-ring>Details</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

Once a tab is focused, arrow keys can be used to move the focus between tabs. Press Enter or Space to select the focused tab.

Common Cases

Content Switching without Tab Sheet

Using the integrated content areas in Tab Sheet is the easiest way to switch between the different content for each tab. Sometimes, such as when the tabs need to be separated structurally from their content areas, it may be necessary to use the stand-alone Tabs component and implement content switching, manually.

Open in a
new tab
<vaadin-tabs @selected-changed="${this.selectedChanged}">
  <vaadin-tab>Dashboard</vaadin-tab>
  <vaadin-tab>Payment</vaadin-tab>
  <vaadin-tab>Shipping</vaadin-tab>
</vaadin-tabs>

<vaadin-vertical-layout theme="padding">
  <p>${this.content}</p>
</vaadin-vertical-layout>

Lazy Initialization of Tab Contents

Sometimes it can be desirable to initialize the contents for a tab, lazily. That is to say, delay its initialization until the tab is selected.

Open in a
new tab
@state()
private visitedTabs = new Set<number>();

private selectedTabChanged(event: TabSheetSelectedChangedEvent) {
  this.visitedTabs = new Set([...this.visitedTabs, event.detail.value]);
}

protected override render() {
  return html`
    <vaadin-tabsheet @selected-changed=${this.selectedTabChanged}>
      <vaadin-tabs slot="tabs">
        <vaadin-tab id="dashboard-tab">Dashboard</vaadin-tab>
        <vaadin-tab id="payment-tab">Payment</vaadin-tab>
        <vaadin-tab id="shipping-tab">Shipping</vaadin-tab>
      </vaadin-tabs>

      ${this.visitedTabs.has(0)
        ? html`<div tab="dashboard-tab">This is the Dashboard tab content</div>`
        : ''}
      ${this.visitedTabs.has(1)
        ? html`<div tab="payment-tab">This is the Payment tab content</div>`
        : ''}
      ${this.visitedTabs.has(2)
        ? html`<div tab="shipping-tab">This is the Shipping tab content</div>`
        : ''}
    </vaadin-tabsheet>
  `;
}
Component Usage recommendations

Accordion

An accordion is a vertically stacked set of expandable panels.

Details

The Details component is an expandable panel for showing and hiding content to make the UI less crowded.

D66CE920-3532-41D6-9EB3-C2B91F77CC40