Tables are used to list all information from a data set. The base style establishes preferred padding, font-size, and font-weight treatments. To enhance or customize the look of the table, apply any additional classes listed below.
Default style
The default table style is a bordered cell layout with a stylized header row.
By default, tables are outlined, have borders on all cells, and have a styled header. Depending on the size and complexity of a table, these can all be configured.
Horizontal borders
Shows only horizontal table cell borders. Good for tables with lots of data that can be sorted and filtered.
<tableclass="s-table s-table__bx"> … </table>
First name
Last name
Username
1
Aaron
S.
@aarons
2
Joshua
H.
@joshuah
3
Paweł
L.
@pawełl
4
Ted
G.
@so-ted
Simple borders
Removes most of the default borders and backgrounds. Good for tables without much data that don't need to be sorted or filtered.
A table’s padding can be changed to be more or less condensed.
Small
<tableclass="s-table s-table__sm"> … </table>
First Name
Last Name
Username
1
Aaron
S.
@aarons
2
Joshua
H.
@joshuah
Default
<tableclass="s-table"> … </table>
First Name
Last Name
Username
1
Paweł
L.
@pawełl
2
Ted
G.
@so-ted
Large
<tableclass="s-table s-table__lg"> … </table>
First Name
Last Name
Username
1
Aaron
S.
@aarons
2
Joshua
H.
@joshuah
Cell widths
Table columns will size themselves based on their content. To set a specific width, you can use one of the following table cell classes to specify the width for any column.
Text alignment can be changed at a table or cell level by using atomic text alignment classes. Columns containing copy should be left-aligned. Columns containing numbers should be right-aligned.
To indicate that the user can sort a table by different columns, add the s-table__sortable class to the table.
The <th> cells should include arrows to indicate sortability or the currently applied sorting. In addition, the column that is currently sorted should be indicated with the is-sorted class on its <th>.
Stacks provides built-in functionality for letting the user sort a table by the values in a column through clicking the column header. This requires the complete data to already exist in the table (e.g. it is not going to work if the table is paged and requires a call to the server to update data on sorting). See the JavaScript introduction for general information about JS in Stacks.
To make your table user-sortable, do the following:
Style the table as sortable as explained in the section above.
Set data-controller="s-table" on the <table> element.
Set data-target="s-table.column" and data-action="click->s-table#sort" on each of the <th> elements that control sorting.
Add the three icons for showing ascending sort, descending sort, and unsorted to each of these header cells, hiding the first two with a d-none class. Add the js-sorting-indicator class to each of the icons, and add js-sorting-indicator-asc, js-sorting-indicator-desc, and js-sorting-indicator-none to the appropriate icon.
Note: Using js-… classes is not really the optimal way of doing this, and will probably replaced with something better eventually. When that happens, the js-… mechanism will be deprecated but continue to be supported for a while, so you have ample time to update things.
By default, the data is sorted by the content of the cell. If you need to use a different value, for example because your cell contains a human-readable date, add a data-s-table-sort-val attribute to the cell.
If a column contains any data that is not an integer, the data will be sorted lexicographically. Otherwise it will be sorted numerically, with empty cells being considered the lowest number.
If the table contains rows that should not be sorted, but rather always be at the top or always be at the bottom, add data-s-table-sort-to="top" or data-s-table-sort-to="bottom" to the <tr> element.
JavaScript data attributes
Attribute
Applied to
Description
data-controller="s-table"
table
Wires up the table to the JS controller
data-target="s-table.column"
th
Marks this is a sortable column for the purpose of modifying arrow icons
data-action="click->s-table#sort"
th
Causes a click on the header cell to sort by this column
data-s-table-sort-to="top"
tr
Forces the sorting of a row to the top
data-s-table-sort-to="bottom"
tr
Forces the sorting of a row to the bottom
data-s-table-sort-val="[x]"
td
Optionally use a custom value for sorting instead of the cell’s text content
JavaScript example
<tableclass="s-table s-table__sortable"data-controller="s-table"> <thead> <tr> <thdata-target="s-table.column"data-action="click->s-table#sort"> Season @Svg.ArrowUpSm.With("js-sorting-indicator js-sorting-indicator-asc d-none") @Svg.ArrowDownSm.With("js-sorting-indicator js-sorting-indicator-desc d-none") @Svg.ArrowUpDownSm.With("js-sorting-indicator js-sorting-indicator-none") </th> <thdata-target="s-table.column"data-action="click->s-table#sort"> Starts in month … </th> <thdata-target="s-table.column"data-action="click->s-table#sort"> Typical temperature in °C … </th> </tr> </thead> <tbody> <tr><td>Winter</td><tddata-s-table-sort-val="12">December</td><td>2</td></tr> <tr><td>Spring</td><tddata-s-table-sort-val="3">March</td><td>13</td></tr> <tr><td>Summer</td><tddata-s-table-sort-val="6">June</td><td>25</td></tr> <tr><td>Fall</td><tddata-s-table-sort-val="9">September</td><td>13</td></tr> <trdata-s-table-sort-to="bottom"class="fw-bold"> <tdcolspan="2">Average temperature</td> <td>13</td> </tr> </tbody> </table>
Season
Starts in month
Typical temperature in °C
Winter
December
2
Spring
March
13
Summer
June
25
Fall
September
13
Average temperature
13
Bar graphs
To help users, you can add data visualizations into table cells. These are useful to help visualize the reported data and calling extra attention to the table cell. These graphs should always be paired with a number.
For tables that include inactive or disabled rows, such as inactive users or teams, .is-disabled can be applied to any <tr>. Additionally, .is-enabled can be applied to any <th> or <td> that you’d like to ignoring the parent disabled styling (such as a persistent link to reactivate a disabled account).