Skip to content

Board grid

The board grid is the table in WerkOS where your team keeps hiring projects, candidates and work permits: one row per item, one column per field, each value edited where you read it.

The grid at a glance

Projects
Employer
Positions
Stage
Start date
Country
Welders, Zagreb
Adria Steel Works
2
Sourcing
Nepal
CNC operators, Osijek
Neretva Farms
9
Interviews
India
Electricians, Dubrovnik
Sava Foods
16
Work permits
Bosnia and Herzegovina
Cooks, Karlovac
Kvarner Yards
23
Arriving
Philippines
Housekeepers, Split
Drava Plastics
7
On hold
Uzbekistan
Truck drivers, Pula
Lika Timber
14
Empty
Bangladesh
Warehouse operatives, Šibenik
Dalmatia Hotels
21
Interviews
Sri Lanka
Carpenters, Rijeka
Mosor Catering
5
Sourcing
Kyrgyzstan
Plumbers, Zadar
Velebit Build
12
Work permits
Indonesia
Waiters, Varaždin
Panonija Logistics
19
Arriving
Vietnam
Bricklayers, Zagreb
Adria Steel Works
3
Sourcing
Morocco
Care assistants, Osijek
Neretva Farms
10
Interviews
Serbia
Butchers, Dubrovnik
Sava Foods
17
Work permits
North Macedonia
Steel fixers, Karlovac
Kvarner Yards
24
Arriving
Nepal
Painters, Split
Drava Plastics
8
On hold
India
Forklift drivers, Pula
Lika Timber
15
Empty
Bosnia and Herzegovina
Bakers, Šibenik
Dalmatia Hotels
22
Interviews
Philippines
Pipe fitters, Rijeka
Mosor Catering
6
Sourcing
Uzbekistan
Roofers, Zadar
Velebit Build
13
Work permits
Bangladesh
Kitchen porters, Varaždin
Panonija Logistics
20
Arriving
Sri Lanka
Welders, Zagreb
Adria Steel Works
4
Sourcing
Kyrgyzstan
CNC operators, Osijek
Neretva Farms
11
Interviews
Indonesia
Electricians, Dubrovnik
Sava Foods
18
Work permits
Vietnam
Cooks, Karlovac
Kvarner Yards
2
Arriving
Morocco
Housekeepers, Split
Drava Plastics
9
On hold
Serbia
Truck drivers, Pula
Lika Timber
16
Empty
North Macedonia
Warehouse operatives, Šibenik
Dalmatia Hotels
23
Interviews
Nepal
Carpenters, Rijeka
Mosor Catering
7
Sourcing
India
Plumbers, Zadar
Velebit Build
14
Work permits
Bosnia and Herzegovina
Waiters, Varaždin
Panonija Logistics
21
Arriving
Philippines
Bricklayers, Zagreb
Adria Steel Works
5
Sourcing
Uzbekistan
Care assistants, Osijek
Neretva Farms
12
Interviews
Bangladesh
Butchers, Dubrovnik
Sava Foods
19
Work permits
Sri Lanka
Steel fixers, Karlovac
Kvarner Yards
3
Arriving
Kyrgyzstan
Painters, Split
Drava Plastics
10
On hold
Indonesia
Forklift drivers, Pula
Lika Timber
17
Empty
Vietnam
Bakers, Šibenik
Dalmatia Hotels
24
Interviews
Morocco
Pipe fitters, Rijeka
Mosor Catering
8
Sourcing
Serbia
Roofers, Zadar
Velebit Build
15
Work permits
North Macedonia
Kitchen porters, Varaždin
Panonija Logistics
22
Arriving
Nepal
Summary of Open projects
Sum526

When to use it

Use the board grid when your team adds, edits and compares items with the same fields, such as candidates, hiring projects or work permits.

When the figures are final and only need reading, use a report table. For a short run of items without columns, use a list.

Anatomy

Headers sit centered above their columns in the label ink, so the eye lands on the values. The name column comes first and is the widest, since people search by it.

Row and column rules
1 px
--border-rule
Column header
13 px, weight 500, centered, 40 px tall
--text-label
Name column
280 px, 560 px on the boards of a WerkOS module, at least 140 px
Checkboxes
14 px, select all in the name header
--brand-blue
Cell padding
8 px
--space-2
Group header
40 px
Summary footer
48 px
Trailing gutter
44 px, for adding a column and deleting a row
Frame
12 px radius, no border
--radius-xl

Row heights

Compact is the default. Comfortable and tall give a row room for a second line. A status keeps its own height.

Projects
Stage
Welders, Zagreb
Sourcing
CNC operators, Osijek
Interviews
Electricians, Dubrovnik
Work permits
Cooks, Karlovac
Arriving
Housekeepers, Split
On hold
Compact, 36 px
Projects
Stage
Welders, Zagreb
Sourcing
CNC operators, Osijek
Interviews
Electricians, Dubrovnik
Work permits
Cooks, Karlovac
Arriving
Housekeepers, Split
On hold
Comfortable, 52 px
Projects
Stage
Welders, Zagreb
Sourcing
CNC operators, Osijek
Interviews
Electricians, Dubrovnik
Work permits
Cooks, Karlovac
Arriving
Housekeepers, Split
On hold
Tall, 76 px

Groups

A group gathers rows under a colored title and a count. Its color comes from the board's palette, a shade darker or lighter where needed, so the title reads in both themes.

Group title
14 px, weight 700, in the group color
Item count
12 px
--text-muted
Row marker
4 by 16 px, rounded ends
--radius-full
Projects
Positions
Stage
Welders, Zagreb
4
Sourcing
Truck drivers, Pula
16
Empty
Carpenters, Rijeka
7
Sourcing
Summary of New requests
Sum27
CNC operators, Osijek
11
Interviews
Electricians, Dubrovnik
18
Work permits
Cooks, Karlovac
2
Arriving
Summary of Hiring now
Sum31
Housekeepers, Split
9
On hold
Painters, Split
10
On hold
Summary of Paused
Sum19
Light
Projects
Positions
Stage
Welders, Zagreb
4
Sourcing
Truck drivers, Pula
16
Empty
Carpenters, Rijeka
7
Sourcing
Summary of New requests
Sum27
CNC operators, Osijek
11
Interviews
Electricians, Dubrovnik
18
Work permits
Cooks, Karlovac
2
Arriving
Summary of Hiring now
Sum31
Housekeepers, Split
9
On hold
Painters, Split
10
On hold
Summary of Paused
Sum19
Dark

States

Hover tints the row so you can follow it across a wide board. The active cell has a thin blue ring and a handle for filling down.

Projects
Employer
Positions
Stage
Bricklayers, Zagreb
Adria Steel Works
3
Sourcing
Care assistants, Osijek
Neretva Farms
10
Interviews
Butchers, Dubrovnik
Sava Foods
17
Work permits
Steel fixers, Karlovac
Kvarner Yards
24
Arriving
Painters, Split
Drava Plastics
8
On hold
Forklift drivers, Pula
Lika Timber
15
Empty
Click a cell and move with the arrow keys.
Hover
ink at 3 percent over the row, pointer devices only
Selected row
brand blue at 25 percent
--brand-blue
Range
brand blue at 15 percent per cell
--brand-blue
Active cell
1 px inset ring, the focus ring from the keyboard
--brand-blue
Fill handle
8 px square, bottom right
--brand-blue
Editing
a 28 px field over the cell
--surface-strong

Numbers in cells

Figures sit at the right edge of their cell in tabular digits, so units, tens and hundreds line up down the column while the header stays centered. A negative value takes a true minus sign and keeps the normal ink.

The footer sums each numeric column of the group, or shows its average, median, lowest or highest value.

Projects
Days to start
Hourly rate
Budget left
Time tracked
Welders, Zagreb
14
9.50EUR
1,250EUR
2 hours 30 minutes 9 seconds
CNC operators, Osijek
−3
8.75EUR
−380EUR
Electricians, Dubrovnik
0
11.20EUR
2,040EUR
Cooks, Karlovac
27
960EUR
Housekeepers, Split
8
10.40EUR
0EUR
Summary of Open projects
Average9.2
Average9.96EUR
Sum3,870EUR
Sum2h 30m
Figure
14 px, weight 400, tabular, right aligned
--text
Footer label
11 px, sentence case
--text-muted
Footer value
14 px, weight 500, tabular
--text

Keyboard

The grid behaves like a spreadsheet. Each action shown on hover, such as opening a project's chat, is also in the row menu, so the keyboard reaches it.

Arrow keys
move the active cell
Shift with an arrow
extend the range
Tab, Shift Tab
next or previous cell, out of the grid after the last one
Home, End
start or end of the row, or of the board with Ctrl or Cmd
Enter, F2
edit the cell
Escape
close the editor, clear the range
Delete, Backspace
clear the cells
Ctrl or Cmd with C, V, D, A
copy, paste, fill down, select all
Ctrl or Cmd with Z
undo, and redo with Shift
Shift F10
open the row menu

On a phone

Below 640 px the grid becomes cards under the same pinned group titles, each with the name and one row of up to 4 fields. A tap on a status, a person, a date or a timeline opens a sheet.

Hiring now3

  • CNC operators, Osijek

    Stage
    Start date
    Country
    India
  • Electricians, Dubrovnik

    Stage
    Start date
    Country
    Bosnia and Herzegovina
  • Cooks, Karlovac

    Stage
    Start date
    Country
    Philippines

New requests3

  • Welders, Zagreb

    Stage
    Start date
    Country
    Nepal
  • Truck drivers, Pula

    Stage
    Start date
    Country
    Bangladesh
  • Carpenters, Rijeka

    Stage
    Start date
    Country
    Kyrgyzstan
The list

Hiring now3

  • CNC operators, Osijek

    Stage
    Start date
    Country
    India
  • Electricians, Dubrovnik

    Stage
    Start date
    Country
    Bosnia and Herzegovina
  • Cooks, Karlovac

    Stage
    Start date
    Country
    Philippines

New requests3

  • Welders, Zagreb

    Stage
    Start date
    Country
    Nepal
  • Truck drivers, Pula

    Stage
    Start date
    Country
    Bangladesh
  • Carpenters, Rijeka

    Stage
    Start date
    Country
    Kyrgyzstan
After a tap on a stage
Card
12 px radius, 12 px padding, a soft shadow
--radius-xl
Name
15 px, weight 500
--text
Field label
11 px, centered
--text-label
Field value
36 px tall
Sheet row
44 px, one per label

Empty, filtered and loading

An empty board shows a headline, one sentence and a button to add the first item.

When filters hide every row, a line and a Clear filters button take the place of the groups, so nobody mistakes a filter for lost work. A loading board draws its skeleton at its own row height.

This board is empty

Add your first project to get started.

Empty
Projects
Stage

No items match these filters

Filtered
Loading the board
Loading

Accessibility

Screen readers meet the board as a grid, with the project name as the header of its row. Of the cells, only the active one is in the tab order. Each group title is a button that folds its rows.

A status is read by its label, not its color. On touch screens the row checkbox keeps a 44 px target.

Permitted and not permitted

Permitted

  • Right align figures under a centered header

    The digits line up for comparison and the header matches the other columns.

  • Leave a cell blank when nobody has filled it

    Blank means not entered. Zero is a value and prints as 0.

Not permitted

  • Color negative numbers red

    The minus sign carries the meaning. Red reads as an error.

  • Send a board to an employer as a report

    A board is for your team's daily work. Anything that leaves WerkOS is a report table.

  • Stripe the rows

    The row rules already guide the eye. Stripes belong to report tables.

NextReport table

Board grid

The editable grid of WerkOS boards, where a team keeps hiring projects, candidates and work permits: one row per item, one column per field, edited in place.

  • Kind: data
  • Page: https://design.werklist.com/data/board-grid
  • Version: 2.1.2

When to use it

  • Items that share fields and that people add, edit and compare
  • Boards of hiring projects, candidates, companies and tasks, and the boards a team makes for itself

When not to use it

  • Final figures that are read or printed: use the report table
  • A short run of items without columns: use a list
  • Anything sent outside WerkOS: use a report table

Rules

  • Row and column rules in --border-rule, no stripes, no outer border
  • Headers are centered on every column, numeric ones included
  • Figures are right aligned, 14 px, weight 400, in tabular digits and in the reader's language. A negative takes the true minus sign (U+2212) and is never red
  • The column header and the group header stay pinned on every board, under the app header
  • A blank cell means nobody has filled it. Zero prints 0
  • Below 640 px the card list replaces the grid. A tap on a status, a person, a date or a timeline opens a sheet
  • The frozen name column is an option on each board, not the default

Anatomy

  • Row: 36 px compact (the default), 52 px comfortable, 76 px tall, plus a 1 px rule
  • Row rule: 1 px under each row (--border-rule)
  • Column rule: 1 px on the left of each data, header and footer cell, none on the trailing gutter (--border-rule)
  • Column header: 13 px, weight 500, centered on every column, sentence case, 40 px plus its rule, 6 px between a title and its sort arrow. A title cut short shows in full in a tooltip (--text-label)
  • Name header: a select all checkbox at the start, always shown, mixed when some rows are chosen, and the board's word for an item centered in the rest (--brand-blue)
  • Name column: 280 px, 560 px on the boards of a WerkOS module, at least 140 px when resized
  • Name cell: 14 px text, 12 px padding, 8 px gap, cut short at the end (--text)
  • Data column: at least 60 px. Default widths: text 220, numbers 140, status 200, country 180, date 150, formula 160, timeline 220, time tracking 190 px
  • Data cell padding: 8 px (--space-2)
  • Figure: 14 px, weight 400, tabular digits, right aligned, with a currency code after it in 12 px muted ink (--text)
  • Group header row: 40 px, with a 14 px gap above it on module boards. Chevron 16 px, title 14 px weight 700 in the group color, count 12 px. Pinned while its rows scroll, on --surface-1 at 85 percent with a 12 px blur (--text-muted)
  • Row marker: 4 by 16 px, full radius, in the group color (--radius-full)
  • Summary footer: 48 px with a rule above and below. Label 11 px in sentence case, value 14 px weight 500 in tabular digits, right aligned (--text-muted)
  • Add item row: 40 px
  • Trailing gutter: 44 px, for adding a column and deleting a row
  • Frame: radius 12 px, no border, no shadow (--surface-1)
  • Row checkbox: 14 px box, radius 4 px, with a 1 px edge: ink at 55 percent on white in light, white at 20 percent on --surface-control in dark. Checked, it fills with --brand-blue and shows an 11 px white tick. It appears on row hover, stays while the row is selected and has a 44 px target on touch screens (--radius-sm)
  • Phone card: below 640 px. Radius 12 px, padding 12 px, 10 px gap, a soft shadow, no border. The name in 15 px weight 500, then one row of up to 4 fields: labels 11 px centered, values 36 px tall, a status in 12 px type (--surface-1)
  • Phone sheet: rises from the bottom on the raised glass, with 16 px top corners and a 40 by 4 px grab handle. The column title in 16 px weight 700 over the item name in 12 px. One 44 px row per label at full radius, 14 px weight 500, with a 16 px check on the chosen one (--glass-fill-raised)

Variants

  • Team board: A board a team makes for itself: the toolbar inside the grid, rows to add, column menus and a row height switch
  • Module board: A board of a WerkOS module, which holds its own toolbar: no add rows, no column menus, no row height switch
  • Frozen name column: An option on a board that scrolls sideways, off by default

Sizes

  • Compact: height 36 px
  • Comfortable: height 52 px
  • Tall: height 76 px

States

  • Hover: a row fill of ink at 3 percent in light and of white at 3 percent in dark, on pointer devices only
  • Selected row: brand blue at 25 percent over the row, with no hover on top. A frozen name cell mixes the tint into --surface-1 so it stays opaque (--brand-blue, --surface-1)
  • Range: brand blue at 15 percent per cell (--brand-blue)
  • Active cell: a 1 px inset ring of --brand-blue, or the 2 px focus ring while the keyboard is in the grid. An 8 px square fill handle at the bottom right, radius 1 px, ringed with 1 px of --surface-1 (--brand-blue, --focus-ring, --focus-ring-width, --surface-1)
  • Editing: an editor over the cell on --surface-strong, 4 px inside its edges, holding a 28 px field: radius 6 px, a fill of ink at 5 percent in light and of white at 6 percent in dark, an inset 1 px ring of light brand blue, no shadow (--surface-strong, --radius-md)
  • Group collapsed: the chevron points right and the rows and the footer are hidden
  • Empty board: a card in place of the grid, without the column header. A headline of 20 px, 26 px from 640 px, weight 700, tracking minus 0.02 em. One sentence of 14 px, 16 px from 640 px, in --text-muted. One 44 px primary button and no icon (--text-muted)
  • Filtered to nothing: the line No items match these filters in --text-muted and a quiet Clear filters button in place of the groups (--text-muted)
  • Loading: skeleton rows at the board's row height inside a 12 px frame, with --border-rule lines and a soft shimmer (--border-rule)

Keyboard

  • Arrow keys: Move the active cell. The first press lands on the first cell
  • Shift with an arrow: Extend the range
  • Tab, Shift Tab: Next or previous cell, wrapping to the next row. After the last cell, Tab leaves the grid
  • Home, End: First or last cell of the row
  • Ctrl or Cmd with Home, End: First or last cell of the board
  • Enter, F2: Edit the active cell
  • Escape: Close the editor and clear the range
  • Delete, Backspace: Clear the range
  • Ctrl or Cmd with C, V, D, A: Copy, paste, fill down, select all
  • Ctrl or Cmd with Z: Undo
  • Ctrl or Cmd with Shift Z, or with Y: Redo
  • Shift F10, the menu key: Open the row menu, which holds each action shown on hover

Accessibility

  • The board is a grid named by its title, with aria-rowcount and aria-colcount
  • Each row has role row and its aria-rowindex
  • The name cell is the row header
  • Column headers carry aria-sort on the sorted column
  • Cells are grid cells, with aria-selected inside a range and aria-readonly on read only columns
  • Of the cells, only the active one is in the tab order
  • Each group title is a button with aria-expanded that folds its rows
  • A group header is a row whose header names the group and its count
  • A status is read by its label, never its color. An empty status shows a hyphen on gray and is read as Empty
  • Scroll padding matches the pinned headers, so a focused cell never hides behind them
  • 44 px targets on touch screens

Content

  • Headers are short nouns in sentence case with no end punctuation
  • The empty board reads This board is empty and Add your first project to get started. Its button reads Add your first project, with the board's own word for an item
  • When filters hide every row, the line reads No items match these filters and the button reads Clear filters
  • Footer labels name the aggregate in sentence case: Sum, Average, Median, Lowest, Highest

Tokens

  • --border-rule
  • --text
  • --text-label
  • --text-muted
  • --surface-1
  • --surface-strong
  • --brand-blue
  • --focus-ring
  • --focus-ring-width
  • --radius-xl
  • --radius-sm
  • --radius-full
  • --space-2
  • --space-3
  • --radius-md
  • --surface-control
  • --glass-fill-raised
  • --overlay
  • --layer-sticky

JSON

{
  "title": "Board grid",
  "path": "/data/board-grid",
  "url": "https://design.werklist.com/data/board-grid",
  "text": "https://design.werklist.com/agent/data/board-grid",
  "summary": "The editable table of WerkOS boards: its rows, rules, states, keys and phone view.",
  "version": "2.1.2",
  "kind": "data",
  "name": "Board grid",
  "purpose": "The editable grid of WerkOS boards, where a team keeps hiring projects, candidates and work permits: one row per item, one column per field, edited in place.",
  "use": [
    "Items that share fields and that people add, edit and compare",
    "Boards of hiring projects, candidates, companies and tasks, and the boards a team makes for itself"
  ],
  "avoid": [
    "Final figures that are read or printed: use the report table",
    "A short run of items without columns: use a list",
    "Anything sent outside WerkOS: use a report table"
  ],
  "anatomy": [
    {
      "part": "Row",
      "measure": "36 px compact (the default), 52 px comfortable, 76 px tall, plus a 1 px rule"
    },
    {
      "part": "Row rule",
      "measure": "1 px under each row",
      "token": "--border-rule"
    },
    {
      "part": "Column rule",
      "measure": "1 px on the left of each data, header and footer cell, none on the trailing gutter",
      "token": "--border-rule"
    },
    {
      "part": "Column header",
      "measure": "13 px, weight 500, centered on every column, sentence case, 40 px plus its rule, 6 px between a title and its sort arrow. A title cut short shows in full in a tooltip",
      "token": "--text-label"
    },
    {
      "part": "Name header",
      "measure": "a select all checkbox at the start, always shown, mixed when some rows are chosen, and the board's word for an item centered in the rest",
      "token": "--brand-blue"
    },
    {
      "part": "Name column",
      "measure": "280 px, 560 px on the boards of a WerkOS module, at least 140 px when resized"
    },
    {
      "part": "Name cell",
      "measure": "14 px text, 12 px padding, 8 px gap, cut short at the end",
      "token": "--text"
    },
    {
      "part": "Data column",
      "measure": "at least 60 px. Default widths: text 220, numbers 140, status 200, country 180, date 150, formula 160, timeline 220, time tracking 190 px"
    },
    {
      "part": "Data cell padding",
      "measure": "8 px",
      "token": "--space-2"
    },
    {
      "part": "Figure",
      "measure": "14 px, weight 400, tabular digits, right aligned, with a currency code after it in 12 px muted ink",
      "token": "--text"
    },
    {
      "part": "Group header row",
      "measure": "40 px, with a 14 px gap above it on module boards. Chevron 16 px, title 14 px weight 700 in the group color, count 12 px. Pinned while its rows scroll, on --surface-1 at 85 percent with a 12 px blur",
      "token": "--text-muted"
    },
    {
      "part": "Row marker",
      "measure": "4 by 16 px, full radius, in the group color",
      "token": "--radius-full"
    },
    {
      "part": "Summary footer",
      "measure": "48 px with a rule above and below. Label 11 px in sentence case, value 14 px weight 500 in tabular digits, right aligned",
      "token": "--text-muted"
    },
    {
      "part": "Add item row",
      "measure": "40 px"
    },
    {
      "part": "Trailing gutter",
      "measure": "44 px, for adding a column and deleting a row"
    },
    {
      "part": "Frame",
      "measure": "radius 12 px, no border, no shadow",
      "token": "--surface-1"
    },
    {
      "part": "Row checkbox",
      "measure": "14 px box, radius 4 px, with a 1 px edge: ink at 55 percent on white in light, white at 20 percent on --surface-control in dark. Checked, it fills with --brand-blue and shows an 11 px white tick. It appears on row hover, stays while the row is selected and has a 44 px target on touch screens",
      "token": "--radius-sm"
    },
    {
      "part": "Phone card",
      "measure": "below 640 px. Radius 12 px, padding 12 px, 10 px gap, a soft shadow, no border. The name in 15 px weight 500, then one row of up to 4 fields: labels 11 px centered, values 36 px tall, a status in 12 px type",
      "token": "--surface-1"
    },
    {
      "part": "Phone sheet",
      "measure": "rises from the bottom on the raised glass, with 16 px top corners and a 40 by 4 px grab handle. The column title in 16 px weight 700 over the item name in 12 px. One 44 px row per label at full radius, 14 px weight 500, with a 16 px check on the chosen one",
      "token": "--glass-fill-raised"
    }
  ],
  "variants": [
    {
      "name": "Team board",
      "use": "A board a team makes for itself: the toolbar inside the grid, rows to add, column menus and a row height switch"
    },
    {
      "name": "Module board",
      "use": "A board of a WerkOS module, which holds its own toolbar: no add rows, no column menus, no row height switch"
    },
    {
      "name": "Frozen name column",
      "use": "An option on a board that scrolls sideways, off by default"
    }
  ],
  "sizes": [
    {
      "name": "Compact",
      "height": "36 px"
    },
    {
      "name": "Comfortable",
      "height": "52 px"
    },
    {
      "name": "Tall",
      "height": "76 px"
    }
  ],
  "states": [
    {
      "name": "Hover",
      "change": "a row fill of ink at 3 percent in light and of white at 3 percent in dark, on pointer devices only"
    },
    {
      "name": "Selected row",
      "change": "brand blue at 25 percent over the row, with no hover on top. A frozen name cell mixes the tint into --surface-1 so it stays opaque",
      "tokens": [
        "--brand-blue",
        "--surface-1"
      ]
    },
    {
      "name": "Range",
      "change": "brand blue at 15 percent per cell",
      "tokens": [
        "--brand-blue"
      ]
    },
    {
      "name": "Active cell",
      "change": "a 1 px inset ring of --brand-blue, or the 2 px focus ring while the keyboard is in the grid. An 8 px square fill handle at the bottom right, radius 1 px, ringed with 1 px of --surface-1",
      "tokens": [
        "--brand-blue",
        "--focus-ring",
        "--focus-ring-width",
        "--surface-1"
      ]
    },
    {
      "name": "Editing",
      "change": "an editor over the cell on --surface-strong, 4 px inside its edges, holding a 28 px field: radius 6 px, a fill of ink at 5 percent in light and of white at 6 percent in dark, an inset 1 px ring of light brand blue, no shadow",
      "tokens": [
        "--surface-strong",
        "--radius-md"
      ]
    },
    {
      "name": "Group collapsed",
      "change": "the chevron points right and the rows and the footer are hidden"
    },
    {
      "name": "Empty board",
      "change": "a card in place of the grid, without the column header. A headline of 20 px, 26 px from 640 px, weight 700, tracking minus 0.02 em. One sentence of 14 px, 16 px from 640 px, in --text-muted. One 44 px primary button and no icon",
      "tokens": [
        "--text-muted"
      ]
    },
    {
      "name": "Filtered to nothing",
      "change": "the line No items match these filters in --text-muted and a quiet Clear filters button in place of the groups",
      "tokens": [
        "--text-muted"
      ]
    },
    {
      "name": "Loading",
      "change": "skeleton rows at the board's row height inside a 12 px frame, with --border-rule lines and a soft shimmer",
      "tokens": [
        "--border-rule"
      ]
    }
  ],
  "keys": [
    {
      "key": "Arrow keys",
      "action": "Move the active cell. The first press lands on the first cell"
    },
    {
      "key": "Shift with an arrow",
      "action": "Extend the range"
    },
    {
      "key": "Tab, Shift Tab",
      "action": "Next or previous cell, wrapping to the next row. After the last cell, Tab leaves the grid"
    },
    {
      "key": "Home, End",
      "action": "First or last cell of the row"
    },
    {
      "key": "Ctrl or Cmd with Home, End",
      "action": "First or last cell of the board"
    },
    {
      "key": "Enter, F2",
      "action": "Edit the active cell"
    },
    {
      "key": "Escape",
      "action": "Close the editor and clear the range"
    },
    {
      "key": "Delete, Backspace",
      "action": "Clear the range"
    },
    {
      "key": "Ctrl or Cmd with C, V, D, A",
      "action": "Copy, paste, fill down, select all"
    },
    {
      "key": "Ctrl or Cmd with Z",
      "action": "Undo"
    },
    {
      "key": "Ctrl or Cmd with Shift Z, or with Y",
      "action": "Redo"
    },
    {
      "key": "Shift F10, the menu key",
      "action": "Open the row menu, which holds each action shown on hover"
    }
  ],
  "accessibility": [
    "The board is a grid named by its title, with aria-rowcount and aria-colcount",
    "Each row has role row and its aria-rowindex",
    "The name cell is the row header",
    "Column headers carry aria-sort on the sorted column",
    "Cells are grid cells, with aria-selected inside a range and aria-readonly on read only columns",
    "Of the cells, only the active one is in the tab order",
    "Each group title is a button with aria-expanded that folds its rows",
    "A group header is a row whose header names the group and its count",
    "A status is read by its label, never its color. An empty status shows a hyphen on gray and is read as Empty",
    "Scroll padding matches the pinned headers, so a focused cell never hides behind them",
    "44 px targets on touch screens"
  ],
  "content": [
    "Headers are short nouns in sentence case with no end punctuation",
    "The empty board reads This board is empty and Add your first project to get started. Its button reads Add your first project, with the board's own word for an item",
    "When filters hide every row, the line reads No items match these filters and the button reads Clear filters",
    "Footer labels name the aggregate in sentence case: Sum, Average, Median, Lowest, Highest"
  ],
  "tokens": [
    "--border-rule",
    "--text",
    "--text-label",
    "--text-muted",
    "--surface-1",
    "--surface-strong",
    "--brand-blue",
    "--focus-ring",
    "--focus-ring-width",
    "--radius-xl",
    "--radius-sm",
    "--radius-full",
    "--space-2",
    "--space-3",
    "--radius-md",
    "--surface-control",
    "--glass-fill-raised",
    "--overlay",
    "--layer-sticky"
  ],
  "rules": [
    "Row and column rules in --border-rule, no stripes, no outer border",
    "Headers are centered on every column, numeric ones included",
    "Figures are right aligned, 14 px, weight 400, in tabular digits and in the reader's language. A negative takes the true minus sign (U+2212) and is never red",
    "The column header and the group header stay pinned on every board, under the app header",
    "A blank cell means nobody has filled it. Zero prints 0",
    "Below 640 px the card list replaces the grid. A tap on a status, a person, a date or a timeline opens a sheet",
    "The frozen name column is an option on each board, not the default"
  ]
}

Raw file: https://design.werklist.com/agent/data/board-grid