bit Bheadless

Grid / TreeGrid

An interactive two-dimensional widget with roving cell focus, row selection, sorting and expandable rows.

Implementation: CSS Tailwind

Sortable data grid

WAI-ARIA Data Grid on a real <table> via As. One tab stop; arrows move between cells, Home / End, Ctrl + Home / End, PageUp / PageDown. Click a header or press Enter on it: OnActivate toggles the sort, Sort emits aria-sort, styled with group-aria-[sort=descending]:rotate-180.

Planet Type Diameter Moons
Earth Terrestrial 12,756 km 1
Jupiter Gas giant 142,984 km 95
Mars Terrestrial 6,792 km 2
Mercury Terrestrial 4,879 km 0
Neptune Ice giant 49,528 km 16
Saturn Gas giant 120,536 km 146
Uranus Ice giant 51,118 km 28
Venus Terrestrial 12,104 km 0

Multi-row selection

SelectionMode="BitBhGridSelectionMode.Multiple" + @bind-SelectedKeys. Click / Shift + click, Space, Shift + Space or Shift + Up / Down, Ctrl + A. Rows emit aria-selected: the boxes use group-aria-selected:; the header box toggles everything via OnActivate.

0 selected · total $0.00
Select all Invoice Customer Status Amount
INV-1042 Acme Corp Paid $1,250.00
INV-1043 Globex Pending $830.50
INV-1044 Initech Overdue $4,200.00
INV-1045 Umbrella Paid $615.75
INV-1046 Hooli Pending $2,980.00
INV-1047 Stark Industries Paid $12,400.00

Row activation

OnRowActivate fires with the row's Key on Enter or double click — open a message, navigate to a record. Unread rows are styled with data-[unread]:font-semibold.

From Subject Received
Ada Lovelace Notes on the Analytical Engine 09:24
Grace Hopper Found a bug (an actual moth) 08:51
Alan Turing Can machines think? Yesterday
Margaret Hamilton Priority displays Mon

Press Enter on a row, or double-click it, to open the message.

TreeGrid

TreeGrid="true" + per-row Level / HasChildren / ParentKey: collapsed descendants are hidden. Right / Left on the first cell expand / collapse; the chevron edits @bind-ExpandedKeys and rotates with group-data-[state=open]:rotate-90.

Name Kind Size
📂project Folder 502.1 KB
📂src Folder 23.6 KB
📄app.ts TypeScript 13.9 KB
📄router.ts TypeScript 6.7 KB
📄styles.css Stylesheet 3.1 KB
📄package.json JSON 1.2 KB
📄README.md Markdown 4.4 KB
📄notes.txt Text 1 KB

Selected: (none)

Div-based grid (calendar)

Without As the grid renders <div role="grid">, rows and cells — lay them out with grid-cols-[repeat(7,2.25rem)]. Arrows move by day / week; Enter or click calls the cell's OnActivate.

October 2026
Su
Mo
Tu
We
Th
Fr
Sa
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Picked: (none)

An unhandled error has occurred. Reload 🗙