Skip to content

Admin dashboard

The back office of Grange, a shop that does not exist. A nav rail, a filter row, four figures, a table with an action on every row and a drawer of settings: all on one screen and all at the same size, which is the arrangement that shows whether a size ladder actually holds.

The source is one file: docs/.vitepress/demos/concepts/dashboard.tsx. The table is live: search, filter by channel, select rows, and the bulk actions appear.

What it is made of

BlockComponents usedWorth noticing
ShellPanes PaneThe split is the layout: a rail that keeps its width and a work area that takes what is left, draggable between them
Nav railList ListItem Icon Chiprender={<nav />} on the list, selected on the current row, and the unread count in the action slot
Rail footerPill Card ProgressLinearThe sync readout is a Pill with title and description; the quota is a bar inside a small Card
App barToolbar Breadcrumb Badge Avatar Tooltipposition="sticky" keeps the actions reachable while the table scrolls under it
AlertAlertOne thing needs attention, said once, at the top, with its own action
FiguresGridContainer Grid StatisticbetterWhen="down" is what makes a falling refund rate come out green
FiltersTextField Select DateRangePickerAt the same size the three are the same height, so the row keeps one baseline
Bulk actionsButton Dialog ToastThey appear only with a selection; the destructive one confirms in a Dialog first
TableTabs Table Checkbox Chip Menu ContextMenu PaginationSelect-all is an indeterminate checkbox in the header cell; every row carries a Menu, and the whole table a ContextMenu
Bottom rowCard ProgressLinear Timeline Switch ProgressCircularThree cards on the same grid: what is low, what happened, what is set

Notes

  • stickyHeader on the table keeps the column headings visible inside the scrolling pane.
  • The row menu's trigger is an IconButton with a label, so every row action has an accessible name that says which row it belongs to.
  • Filtering is ordinary React state. The table renders whatever it is given and shows empty when that is nothing.

Released under the MIT License