- React
- HTML
- HTML demos

import ’./Table.css’

# Examples

## Basic table

### Basic table example

### Basic table accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`role="grid"` | `.pf-v6-c-table` | Identifies the element that serves as the grid widget container. Required
`aria-label` | `.pf-v6-c-table` | Provides an accessible name for the table when a descriptive `<caption>` or `<h*>` is not available. Required in the absence of `<caption>` or `<h*>`
`data-label="[td description]"` | `<td>` | This attribute replaces table header in mobile viewport. It is rendered by `::before` pseudo element.

### Basic table usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table` | `<table>` | Initiates a table element. Required
`.pf-v6-c-table__thead` | `<tr>` | Initiates a table header. Required
`.pf-v6-c-table__tbody` | `<tr>` | Initiates a table body. Required
`.pf-v6-c-table__tfoot` | `<tr>` | Initiates a table footer.
`.pf-v6-c-table__tr` | `<tr>` | Initiates a table row. Required
`.pf-v6-c-table__th` | `<th>` | Initiates a table header cell. Required
`.pf-v6-c-table__td` | `<td>` | Initiates a table data cell. Required
`.pf-v6-c-table__caption` | `<caption>` | Initiates a table caption.
`.pf-m-center` | `<th>`, `<td>` | Modifies cell to center its contents.

## Responsive table behavior

### Responsive layout modifier usage

These classes can be used to ensure that the table changes between the tabular and grid-based layout at an appropriate screen width.

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-grid-md`, `.pf-m-grid-lg`, `.pf-m-grid-xl`, `.pf-m-grid-2xl` | `.pf-v6-c-table` | Changes tabular layout to responsive, grid based layout at optional breakpoint.
`.pf-m-grid` | `.pf-v6-c-table` | Changes tabular layout to responsive, grid based layout. This approach requires JavaScript to set this class at some prescribed viewport width value.

## Sortable

### Sortable example

### Sortable accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`aria-sort=[ascending or descending]` | `.pf-v6-c-table__sort` | Indicates if columns in a table are sorted in ascending or descending order. For each table, authors SHOULD apply aria-sort to only one header at a time. Required

### Sortable usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__sort` | `<th>` | Initiates a table header sort cell. Required for sortable table columns
`.pf-v6-c-table__button` | `<button>`, `<a>` | Initiates a table header sort cell button. If sorting a table row generates a unique URL that can be used as the `href` value for this element, use an `<a>`. Otherwise, use a `<button>`. Required for sortable table columns
`.pf-v6-c-table__button-content` | `<div>` | Initiates a table header sort cell button content container. Required for sortable table columns Note: this is only necessary because `<button>` does not support`display: grid`.
`.pf-v6-c-table__sort-indicator` | `.pf-v6-c-table__sort > .pf-v6-c-table__button > span` | Initiates a sort indicator. Required for sortable table columns
`.pf-m-selected` | `.pf-v6-c-table__sort` | Modifies for sort selected state. Required for sortable table columns
`.pf-m-help` | `.pf-v6-c-table__sort`, `.pf-v6-c-table th` | Modifies a sortable table header to accommodate a help tooltip. Required for sortable table columns with help tooltips
`.fa-arrows-alt-v` | `.pf-v6-c-table__sort > .pf-v6-c-table__button > .pf-v6-c-table__sort-indicator > .fas` | Initiates icon within unsorted, sortable table header. Required for sortable table columns
`.fa-long-arrow-alt-up` | `.pf-v6-c-table__sort > .pf-v6-c-table__button > .pf-v6-c-table__sort-indicator > .fas` | Initiates icon within ascending sorted and selected, sortable table header. Required for sortable table columns
`.fa-long-arrow-alt-down` | `.pf-v6-c-table__sort > .pf-v6-c-table__button > .pf-v6-c-table__sort-indicator > .fas` | Initiates icon within descending sorted and selected, sortable table header. Required for sortable table columns

### Overflow menu usage, desktop

### Overflow menu usage, overflow menu collapsed

### Overflow menu usage, mobile

## With checkboxes, radio select, and actions

### Checkboxes and actions example

### Single select radio example

When including interactive elements in a table, the primary, descriptive cell in the corresponding row is a `<th>`, rather than a `<td>`. In this example, ‘Node 1’ and ‘Node 2 siemur/test-space’ are `<th>`s.

When header cells are empty or they contain interactive elements, `<th>` should be replaced with `<td>`.

### Checkboxes, radio select, and actions accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`aria-labelledby="[row_header_id]"` or `aria-label="[descriptive text]` | `.pf-v6-c-table__check input` | Provides an accessible name for the checkbox or radio input. Required
`id` | row header `<th> > *` | Provides an accessible description for the checkbox or radio. Required if using `aria-labelledby` for `.pf-v6-c-table__check input`

### Checkboxes, radio select, and actions usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__check` | `<th>`, `<td>` | Initiates a checkbox or radio input table cell.
`.pf-v6-c-table__action` | `<th>`, `<td>` | Initiates an action table cell.
`.pf-v6-c-table__inline-edit-action` | `<th>`, `<td>` | Initiates an inline edit action table cell.

## Expandable

Note: Table column widths will respond automatically when toggling expanded rows. To retain column widths between expanded and collapsed states, column header and/or data cell widths must be set.

### Expandable example

### Expandable with set width columns example

### Expandable with nested table example

Note: To apply padding to `.pf-v6-c-table__expandable-row`, wrap the content in `.pf-v6-c-table__expandable-row-content`. For no padding add `.pf-m-no-padding` to `.pf-v6-c-table__expandable-row` > `<td>`

### Expandable accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`hidden` | `.pf-v6-c-table__expandable-row` | Indicates that the expandable content is hidden. Required
`aria-expanded="true"` | `.pf-v6-c-table__toggle` > `.pf-v6-c-button` | Indicates that the row is visible. Required
`aria-label="[descriptive text]"` | `.pf-v6-c-table__toggle` > `.pf-v6-c-button` | Provides an accessible name for toggle button. Required
`aria-labelledby="[title_cell_id] [button_id]"` | `.pf-v6-c-table__toggle` > `.pf-v6-c-button` | Provides an accessible description for toggle button. Required
`id="[button_id]"` | `.pf-v6-c-table__toggle` > `.pf-v6-c-button` | Provides a reference for toggle button description. Required
`aria-controls="[id of element the button controls]"` | `.pf-v6-c-table__toggle` > `.pf-v6-c-button` | Identifies the expanded content controlled by the toggle button. Required

### Expandable usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__toggle-icon` | `<span>` | Initiates the table toggle icon wrapper.
`.pf-v6-c-table__expandable-row` | `<tr>` | Initiates an expandable row.
`.pf-v6-c-table__expandable-row-content` | `.pf-v6-c-table__expandable-row` > `<td>` > `<div>` | Initiates an expandable row content wrapper.
`.pf-m-expanded` | `.pf-v6-c-table__toggle` > `.pf-v6-c-button`, `.pf-v6-c-table__expandable-row` | Modifies for expanded state.
`.pf-m-no-padding` | `.pf-v6-c-table__expandable-row` > `<td>` | Modifies the expandable row to have no padding.

## Compound expansion

### Compound expansion example

### Compound expansion accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`hidden` | `.pf-v6-c-table__expandable-row` | Indicates that the expandable content is hidden. Required
`aria-expanded="true"` | `.pf-v6-c-table__compound-expansion-toggle` > `.pf-v6-c-button` | Indicates that the row is visible. Required
`aria-controls="[id of element the button controls]"` | `.pf-v6-c-table__compound-expansion-toggle` > `.pf-v6-c-button` | Identifies the expanded content controlled by the toggle button. Required

### Compound expansion usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__control-row` | `.pf-v6-c-table__expandable > <tr>` | Modifies a compound expandable table control row.
`.pf-m-expanded` | `<tbody>`, `.pf-v6-c-table__compound-expansion-toggle` > `.pf-v6-c-button` | Modifies a tbody with a row and an expandable row.
`.pf-v6-c-table__compound-expansion-toggle` | `<td>` | Modifies a `<td>` on active/focus.

## Compact variant

### Compact example

### Compact expandable example

### Compact Usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-compact` | `.pf-v6-c-table` | Modifies for a compact table.

## Clickable

### Clickable example

### Clickable and expandable example

### Clickable accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`tabindex="0"` | `.pf-v6-c-table tbody.pf-m-clickable` | Inserts the clickable table element into the tab order of the page so that it is focusable. Required

### Clickable and selected usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-clickable` | `.pf-v6-c-table tbody`, `.pf-v6-c-table tr` | Modifies a tbody or tr table element to be clickable.
`.pf-m-selected` | `.pf-v6-c-table tbody`, `.pf-v6-c-table tr` | Modifies a selectable tbody or tr table element to be selected.

## Tree table

### Tree table basic

### Tree table with checkboxes

### Tree table with checkboxes and icons

### Tree with no children or indentation

### Tree table accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`role="treegrid"` | `.pf-v6-c-table.pf-m-tree-view` | Identifies the `table` as a treegrid. Place on the outermost `table` only
`role="row"` | `.pf-v6-c-table.pf-m-tree-view tr` | Identifies the `tr` element as a `row`. The row role is not an implicit semantic for the tr element when in a treegrid.
`role="gridcell"` | `.pf-v6-c-table.pf-m-tree-view tr` | Identifies the `td` as a gridcell. The `gridcell` role is not an implicit semantic for the td element when in a treegrid.
`tabindex="-1"` | `.pf-v6-c-table.pf-m-tree-view tr` | Makes the element with the treeitem role focusable without including it in the tab sequence of the page.
`tabindex="0"` | `.pf-v6-c-table.pf-m-tree-view tr` | Includes the element with the treeitem role in the tab sequence. Only one treeitem in the tree has tabindex=“0”. When the user moves focus in the tree, the element included in the tab sequence changes to the element with focus.
`aria-expanded="false"` | `.pf-v6-c-table.pf-m-tree-view tr` | For an expandable item, indicates the parent node is closed, i.e., the descendant elements are not visible.
`aria-expanded="true"` | `.pf-v6-c-table.pf-m-tree-view tr.pf-m-expanded` | Indicates the parent node is open, i.e., the descendant elements are visible.
`aria-level="number"` | `.pf-v6-c-table.pf-m-tree-view tr` | Defines the level of the row in the hierarchical treegrid structure. Counting is one-based. Root rows have aria-level=“1”.
`aria-setsize="number"` | `.pf-v6-c-table.pf-m-tree-view tr` | Defines the number of rows in the set of rows that are in the same branch and at the same level within the hierarchy.
`aria-posinset="number"` | `.pf-v6-c-table.pf-m-tree-view tr` | Defines the position of the row within the set of other rows that are in the same branch and at the same level within the hierarchy. Counting is one-based, not zero-based.

### Tree table usage

Class | Applied | Outcome
--- | --- | ---
`.pf-v6-c-table__tree-view-main` | `<div>` | Initiates a tree view table main container. Required with tree view
`.pf-v6-c-table__tree-view-text` | `<div>` | Initiates a tree view table text element. Required with tree view
`.pf-v6-c-table__tree-view-icon` | `<span>` | Initiates a tree view icon wrapper. Required with tree view
`.pf-v6-c-table__tree-view-title-header-cell` | `<th>` | Initiates a tree view title header cell. Required with tree view
`.pf-v6-c-table__tree-view-details-toggle` | `<span>` | Initiates a tree view details toggle container.
`.pf-v6-c-table__tree-view-details-toggle-icon` | `<span>` | Initiates a tree view details toggle icon.
`.pf-m-treeview-details-expanded` | `<tr>` | Modifies a tbody with a row and an expandable row.
`.pf-m-no-inset` | `.pf-v6-c-table.pf-m-tree-view` , `.pf-v6-c-table.pf-m-tree-view <tr>` | Modifies a tree view `.pf-v6-c-table__tree-view-main` indentation.

## Borderless variant

### Borderless example

### Borderless compact example

### Borderless expandable example

### Borderless with compound expansion example

### Borderless usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-no-border-rows` | `.pf-v6-c-table.pf-m-compact` | Modifies to remove borders between rows. Note: Does not affect `.pf-v6-c-table__control-row`.
`.pf-m-expandable` | `.pf-v6-c-table.pf-m-compact` | Indicates that the table has expandable rows.

## Width modifiers

### Width modifiers examples

### Width modifiers usage

Width modifiers control the width of the columns. To control the responsive behavior of the table at different screen widths, see responsive table behavior.

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-width-[10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, or 90]` | `<th>`, `<td>` | Percentage based modifier for `th` and `td` widths. Recommended for sortable title cell
`.pf-m-width-max` | `<th>`, `<td>` | Percentage based modifier for `th` and `td` maximum width.
`.pf-m-fit-content` | `<th>`, `<td>` | Percentage based modifier for `th` and `td` minimum width with no text wrapping.

## Hidden/visible breakpoint modifiers

### Hidden/visible breakpoint modifiers example

### Hidden/visible breakpoint modifiers usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-hidden{-on-[breakpoint]}` | `.pf-v6-c-table tr > th`, `.pf-v6-c-table tr > td` | Hides a table cell at optional breakpoint, or hides it at all breakpoints with `.pf-m-hidden`. Note: Needs to apply to all cells in the column you want to hide.
`.pf-m-visible{-on-[breakpoint]}` | `.pf-v6-c-table tr > th`, `.pf-v6-c-table tr > td` | Shows a table cell at optional breakpoint.

## Text control modifiers

To better control table cell behavior, PatternFly provides a series of modifiers to help contextually control layout. By default, `thead` cells are set to truncate, whereas `tbody` cells are set to wrap. Both `th` and `td` cells use a set of shared css properties mapped to customizable css variable values. Because only the shared css variables are changed by the modifier selector and not the properties, the modifier can be applied to any parent element up until `.pf-v6-c-table` itself [`thead`, `tbody`, `tr`, `th`, `td`, `.pf-v6-c-table__text`].

### Text control example

By default, truncation and wrapping settings do not affect the grid layout, but text will fallback gracefully by passively wrapping long strings. Truncation and wrapping settings will persist with the addition of a `.pf-v6-c-table__text` wrapper on table cell content. In addition to `.pf-v6-c-table__text`, all PatternFly layouts can be used in table cells and contain table text elements.

### Text control using the table text element example

### Table with long strings in the content

Long strings in table cells will push that column wider and possible take from other columns. This can cause content or headers to be truncated.

### Width constrained

Add a width modifier to `thead th` to limit string length or add `.pf-m-truncate` to `tbody td`.

### Text control modifiers usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__text` | `th > *`, `td > *` | Initiates a table text element.
`.pf-m-wrap` | `thead`, `tbody`, `tr`, `th`, `td`, `.pf-v6-c-table__text` | Sets table cell content to wrap. If applied to `thead`, `tbody` or `tr`, then all child cells will be affected. This is the default behavior for `tbody` cells.
`.pf-m-truncate` | `thead`, `tbody`, `tr`, `th`, `td`, `.pf-v6-c-table__text` | Sets text to truncate based on a minimum width and available space adjacent table cells. If applied to `thead`, `tbody` or `tr`, then all child cells will be affected. This is the default behavior for `thead` cells.

`.pf-m-nowrap`

`thead`, `tbody`, `tr`, `th`, `td`, `.pf-v6-c-table__text`

Unsets min/max width and sets whitespace to nowrap. If applied to `thead`, `tbody` or `tr`, then all child cells will be affected. This is specifically beneficial for cell’s whose `thead th` cells are blank. The following example highlights link text that should display inline. Be careful with this modifier, it will prioritize its cell’s content above all other cell’s contents.

`.pf-m-fit-content` | `thead`, `tbody`, `tr`, `th`, `td`, `.pf-v6-c-table__text` | Fit column width to cell content. If applied to `thead`, `tbody` or `tr`, then all child cells will be affected.
`.pf-m-break-word` | `thead`, `tbody`, `tr`, `th`, `td`, `.pf-v6-c-table__text` | Breaks long strings to break wherever necessary as defined by the table layout. If applied to `thead`, `tbody` or `tr`, then all child cells will be affected.

## Sticky table modifiers

Note: Sticky table headers and columns have a higher `z-index` than the `z-index` used for menus (dropdown, select, etc). The intent is that the contents of a scrollable table will scroll under the sticky header/column, including any expanded menus. However, there may be use cases where a menu needs to appear on top of a sticky header/column, such as an expanded menu in a toolbar above a table with a sticky header.

There are a few ways this can be handled:

- Manipulate the `z-index` of the menu and/or table headers/columns manually.
- Use the `menuAppendTo` prop in non-composable react components with menus to append the menu to an element outside of the table (e.g., the `<body>` element) so that the menu has a higher stacking context than - and can appear on top of - sticky headers/columns as well as appear outside of any scrollable content in the table.
- In the case where the menu is outside of the table (e.g., above the table in a toolbar, or below the table and the menu expands up), assign the entire table a lower `z-index` than the `z-index` of the menu. This creates a lower stacking context for the entire table compared to the menu, while preserving the stacking context of the elements inside of the table.

### Sticky header

### Sticky column

### Multiple sticky columns

### Sticky columns and header

### Sticky right column

### Sticky table usage

For sticky columns to function correctly, the parent table’s width must be controlled with `.pf-v6-c-scroll-inner-wrapper`. For sticky columns and sticky headers to function correctly, the parent table needs an inner and outer wrapper (`.pf-v6-c-scroll-outer-wrapper` and `.pf-v6-c-scroll-inner-wrapper`)

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-sticky-header` | `.pf-v6-c-table` | Makes the table cells in `<thead>` sticky to the top of the table on scroll.
`.pf-v6-c-scroll-outer-wrapper` | `<div>` | Initiates a table container sticky columns outer wrapper.
`.pf-v6-c-scroll-inner-wrapper` | `<div>` | Initiates a table container sticky columns inner wrapper.
`.pf-v6-c-table__sticky-cell` | `<th>`, `<td>` | Initiates a sticky table cell.
`.pf-m-right`, `.pf-m-inline-end` | `.pf-v6-c-table__sticky-cell` | Initiates a sticky, right-hand (in LTR) or left-hand (in RTL) table cell.
`.pf-m-left`, `.pf-m-inline-start` | `.pf-v6-c-table__sticky-cell` | Initiates a sticky, left-hand (in LTR) or right-hand (in RTL) table cell.

## Nested column headers

### Nested column headers and expandable rows

### Nested column headers example

### Nested column headers, sticky header

### Nested column header modifier usage

## Favorites

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-nested-column-header` | `<thead>` | Modifies a table header to handle nested header cells.
`.pf-m-border-right` | `<th>`, `<td>` | Modifies a table cell to show a right border.
`.pf-m-border-left` | `<th>`, `<td>` | Modifies a table cell to show a left border.

### Favorites examples

### Favorites sortable example

### Favorites accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`role="grid"` | `.pf-v6-c-table` | Identifies the element that serves as the grid widget container. Required
`aria-label` | `.pf-v6-c-table` | Provides an accessible name for the table when a descriptive `<caption>` or `<h*>` is not available. Required in the absence of `<caption>` or `<h*>`
`data-label="[td description]"` | `<td>` | This attribute replaces table header in mobile viewport. It is rendered by `::before` pseudo element.

### Favorites usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__favorite` | `td` | Initiates a favorite table body cell.
`.pf-m-favorited` | `.pf-v6-c-table__favorite` | Modifies a favorite cell for the favorited state.
`.pf-m-favorite` | `.pf-v6-c-table__sort` | Modifies a sortable table header cell for use with a favorites column.

## Draggable rows

### Draggable rows example

    <div
      id="table-draggable-rows-help"
    >Activate the reorder button and use the arrow keys to reorder the list or use your mouse to drag/reorder. Press escape to cancel the reordering.</div>
    <table
      class="pf-v6-c-table pf-m-grid-md"
      role="grid"
      aria-label="This is a table with draggable rows example"
      id="table-draggable-rows"
    >
      <caption class="pf-v6-c-table__caption">This is the table caption</caption>

      <thead class="pf-v6-c-table__thead">
        <tr class="pf-v6-c-table__tr" role="row">
          <th
            class="pf-v6-c-table__th pf-v6-c-table__cell-empty"
            role="columnheader"
            scope="col"
          >
            <span class="pf-v6-screen-reader">Drag row</span>
          </th>

          <th class="pf-v6-c-table__th" role="columnheader" scope="col">Repositories</th>

          <th class="pf-v6-c-table__th" role="columnheader" scope="col">Branches</th>

          <th
            class="pf-v6-c-table__th"
            role="columnheader"
            scope="col"
          >Pull requests</th>

          <th class="pf-v6-c-table__th" role="columnheader" scope="col">Workspaces</th>

          <th class="pf-v6-c-table__th" role="columnheader" scope="col">Last commit</th>
        </tr>
      </thead>

      <tbody class="pf-v6-c-table__tbody" role="rowgroup">
        <tr class="pf-v6-c-table__tr" role="row">
          <td class="pf-v6-c-table__td pf-v6-c-table__draggable" role="cell">
            <button
              class="pf-v6-c-button pf-m-plain"
              type="button"
              disabled
              aria-pressed="false"
              aria-label="Reorder"
              aria-describedby="table-draggable-rows-help"
              id="table-draggable-rows-row-1-draggable-button"
              aria-labelledby="table-draggable-rows-row-1-draggable-button table-draggable-rows-row-1-node"
            >
              <span class="pf-v6-c-button__icon">
                <i class="fas fa-grip-vertical" aria-hidden="true"></i>
              </span>
            </button>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Repository name">
            <span id="table-draggable-rows-row-1-node">Draggable icon disabled</span>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Branches">10</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Pull requests">25</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Workspaces">5</td>
          <td
            class="pf-v6-c-table__td"
            role="cell"
            data-label="Last commit"
          >2 days ago</td>
        </tr>

        <tr class="pf-v6-c-table__tr" role="row">
          <td class="pf-v6-c-table__td pf-v6-c-table__draggable" role="cell">
            <button
              class="pf-v6-c-button pf-m-plain"
              type="button"
              aria-pressed="false"
              aria-label="Reorder"
              aria-describedby="table-draggable-rows-help"
              id="table-draggable-rows-row-2-draggable-button"
              aria-labelledby="table-draggable-rows-row-2-draggable-button table-draggable-rows-row-2-node"
            >
              <span class="pf-v6-c-button__icon">
                <i class="fas fa-grip-vertical" aria-hidden="true"></i>
              </span>
            </button>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Repository name">
            <span id="table-draggable-rows-row-2-node">Table cell</span>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Branches">10</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Pull requests">25</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Workspaces">5</td>
          <td
            class="pf-v6-c-table__td"
            role="cell"
            data-label="Last commit"
          >2 days ago</td>
        </tr>

        <tr class="pf-v6-c-table__tr pf-m-ghost-row" role="row">
          <td class="pf-v6-c-table__td pf-v6-c-table__draggable" role="cell">
            <button
              class="pf-v6-c-button pf-m-plain"
              type="button"
              disabled
              aria-pressed="false"
              aria-label="Reorder"
              aria-describedby="table-draggable-rows-help"
              id="table-draggable-rows-row-3-draggable-button"
              aria-labelledby="table-draggable-rows-row-3-draggable-button table-draggable-rows-row-3-node"
            >
              <span class="pf-v6-c-button__icon">
                <i class="fas fa-grip-vertical" aria-hidden="true"></i>
              </span>
            </button>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Repository name">
            <span id="table-draggable-rows-row-3-node">Ghost row</span>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Branches">10</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Pull requests">25</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Workspaces">5</td>
          <td
            class="pf-v6-c-table__td"
            role="cell"
            data-label="Last commit"
          >2 days ago</td>
        </tr>

        <tr class="pf-v6-c-table__tr" role="row">
          <td class="pf-v6-c-table__td pf-v6-c-table__draggable" role="cell">
            <button
              class="pf-v6-c-button pf-m-plain"
              type="button"
              aria-pressed="false"
              aria-label="Reorder"
              aria-describedby="table-draggable-rows-help"
              id="table-draggable-rows-row-4-draggable-button"
              aria-labelledby="table-draggable-rows-row-4-draggable-button table-draggable-rows-row-4-node"
            >
              <span class="pf-v6-c-button__icon">
                <i class="fas fa-grip-vertical" aria-hidden="true"></i>
              </span>
            </button>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Repository name">
            <span id="table-draggable-rows-row-4-node">Table cell</span>
          </td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Branches">10</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Pull requests">25</td>
          <td class="pf-v6-c-table__td" role="cell" data-label="Workspaces">5</td>
          <td
            class="pf-v6-c-table__td"
            role="cell"
            data-label="Last commit"
          >2 days ago</td>
        </tr>
      </tbody>
    </table>
    <div
      class="pf-v6-screen-reader"
      aria-live="assertive"
    >This is the aria-live section that provides real-time feedback to the user.</div>

### Draggable rows accessibility

Attribute | Applied to | Outcome
--- | --- | ---
`aria-pressed="true or false"` | `.pf-v6-c-table__draggable .pf-v6-c-button` | Indicates whether the button is currently pressed or not.
`aria-live` | `[element with live text]` | To give screen reader users live feedback about what’s happening during interaction with the table, both during drag and drop interactions and keyboard interactions. Highly Recommended
`aria-describedby="[id value of applicable content]"` | `.pf-v6-c-table__draggable .pf-v6-c-button` | Gives the draggable button an accessible description by referring to the textual content that describes how to use the button to drag elements. The example here uses a `<div id="table-draggable-rows-help"></div>`. Highly recommended
`aria-labelledby="[id of .pf-v6-c-table__draggable .pf-v6-c-button] [id of row title text]"` | `.pf-v6-c-table__draggable .pf-v6-c-button` | Provides an accessible name for the draggable button.
`id="[]"` | `.pf-v6-c-table__draggable .pf-v6-c-button`, `[element with row title text]` | Gives the button and the text element accessible IDs.

### Draggable rows usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-v6-c-table__draggable` | `<td>` | Initiates a draggable table cell.
`.pf-m-drag-over` | `.pf-v6-c-table` | Modifies the table to indicate that a draggable item is being dragged over the table.

## Striped

Basic striped table rows are supported on tables with a single `<tbody>` element and expandable tables by applying `.pf-m-striped` to the `.pf-v6-c-table` element, which applies striped styling to odd table rows. For more complex tables, `.pf-m-striped` can be applied directly to the `<tbody>` and `<tr>` elements. The class `.pf-m-striped-even` can be applied to `<tbody>` elements to apply striped styling to the even rows in the table body. This is for use in tables with multiple `<tbody>` elements where even row striping may be needed to ensure visual consistency.

### Striped table example

### Striped expandable table example

### Striped multiple tbody example

### Striped tr example

### Striped table usage

Class | Applied to | Outcome
--- | --- | ---
`.pf-m-striped` | `.pf-v6-c-table`, `tbody`, `tr` | Modifies odd table rows to be striped.
`.pf-m-striped-even` | `tbody` | Modifies even table rows to be striped. For use in tables with multiple `tbody` elements where adjacent `tbody` elements need even row striping to maintain visual consistency.

## Documentation

### Overview

Because the table component is not used for layout and presents tabular data only, it requires the use of `role="grid"`. Expandable table content (`.pf-v6-c-table__expandable-content`) is placed within a singular `<td>` per expandable row, that can span multiple columns.

### Role=“grid”

Applying `role="grid"` to tables enhances accessible interaction while in table layout, however the responsive, css grid based layout can cause unexpected interactions. Therefore, for css grid layout, it is recommended that `role="grid"` be removed.

### Sortable tables

Table columns may shift when expanding/collapsing. To address this, set `.pf-m-fit-content`, or assign a width `.pf-m-width-[width]` to the corresponding `<th>` defining the column or `<td>` within the column. Width values are `[10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90]` or `max`.

### Table header cells

By default, all table header cells are set to `white-space: nowrap`. If a `<th>`’s content needs to wrap, apply `.pf-m-wrap`.

### Implementation support

- One expandable toggle button, positioned in the first cell of a non-expandable row, preceding an expandable row.
- One checkbox or radio input, positioned in the first or second cell of a non-expandable row.
- One action button, positioned in the last cell of a non-expandable row.
- Tabular data.
- Compact presentation modifier (not compatible with expandable table).

##
CSS variables