Patterns

Dashboard layout

A data-dense application shell combining a persistent side navigation, KPI summary strip, contextual alerts, and a sortable data table — the foundation for every policy management and reporting view in the product.

Pattern ws-kpi-card ws-table ws-badge ws-alert

Overview

The dashboard layout is the primary chrome for authenticated, data-heavy product areas. It is not a component — it is an assembly of existing components arranged according to the layout rules in Spacing & layout. Any team building a list, report, or management screen should start from this pattern rather than designing the shell from scratch.

The layout solves three problems at once: it orients the user inside the app (persistent side nav), gives them an at-a-glance read on their portfolio (KPI strip), and lets them drill into individual records without navigating away (table + badge + actions).

Live pattern

The complete assembled pattern rendered from ws-* components. Every element below is production-usable — copy the markup and swap in real data.

WS
Woodruff Sawyer / Platform
AJ

Policy portfolio

Active policies
284
↑ 12 from last quarter
Pending renewals
47
↑ 8 due in 30 days
Open quotes
31
Across 18 clients
Total premium
$6.2M
↑ 4.3% YoY
3 policies expire within 14 daysCoastal Retail Partners, Meridian Health Group, and TechFlow Systems need renewal action now.
Client Policy type Status Renewal date Premium Account exec
ACAcme Manufacturing Co.
General liability Active Dec 1, 2026 $128,400
AJ
CRCoastal Retail Partners
Property Expiring Aug 8, 2026 $94,200 BK
TFTechFlow Systems Inc.
Cyber Pending Sep 15, 2026 CL
MHMeridian Health Group
Professional liability Expiring Aug 12, 2026 $201,000 AJ
HFHarbor Freight Logistics
General liability Active Mar 3, 2027 $56,800 BK
Showing 1–5 of 284 policies
<!-- Shell -->
<div class="pat-topbar">…</div>
<div class="pat-body">
  <nav class="pat-sidenav">…</nav>
  <main>
    <nav class="ws-breadcrumb">…</nav>
    <div class="ws-kpi-row">
      <div class="ws-kpi-card">…</div>
      <!-- repeat × 4 -->
    </div>
    <div class="ws-alert ws-alert--warning">…</div>
    <!-- filter bar -->
    <table class="ws-table">…</table>
    <nav class="ws-pagination">…</nav>
  </main>
</div>

Anatomy

Seven distinct regions — each with a single responsibility. Understanding what each region owns prevents scope creep and keeps the layout coherent as content changes.

1
Global topbar

Brand identity, global search, user avatar, and theme toggle. Fixed to top. Never scroll it.

2
Side navigation

Persistent product navigation grouped by domain. The active item shows which area the user is in. Collapses to a hamburger icon below 960 px.

3
Page header

Breadcrumb for wayfinding, page title for context, and the primary action button(s) for this screen. Max two actions; primary on the right.

4
KPI strip

Four ws-kpi-card tiles summarising the most important numbers for this view. Collapse to 2-column at <900 px. Never add a 5th card — use a chart panel instead.

5
Contextual alert

One ws-alert rendered only when there is an actionable issue the user must address. Do not use this region for passive information — it loses impact if always populated.

6
Filter bar

Inline search input + 1–3 select filters. Keep it to a single row; overflow filters go into a "More filters" drawer, not a second filter row.

7
Data table + pagination

The primary content region. Use ws-table with sortable column headers, row-level badges for status, avatar for the assigned user, and an action button per row. Always pair with ws-pagination.

Component inventory

Every ws-* component used in this pattern, what region it appears in, and where to find its documentation.

ComponentRegionClassDocumentation
Avatar + statusTopbar, table rowsws-avatar, ws-avatar-wrapAvatars & media
KPI cardKPI stripws-kpi-cardThis pattern
AlertContextual alertws-alert ws-alert--warningFeedback & status
InputFilter barws-inputForms & inputs
SelectFilter barws-selectForms & inputs
TableData tablews-tableTables
BadgeTable — status columnws-badgeFeedback & status
ButtonPage header, table rowsws-btnButtons
PaginationBelow tablews-paginationNavigation
BreadcrumbPage headerws-breadcrumbNavigation
Media objectTable — client columnws-mediaAvatars & media

Responsive behavior

BreakpointChange
< 960 pxSide nav hides; hamburger toggle appears in topbar. Tap-opens as a full-height drawer over the content.
< 900 pxKPI strip collapses from 4-column to 2-column.
< 768 pxTable switches to a card-list view — each row becomes a ws-card with the same data fields stacked vertically.
< 480 pxFilter bar stacks vertically; search input spans full width. Page header actions move to a secondary "…" overflow menu.

Accessibility

ElementRequirement
Side navigationrole="navigation" with aria-label="Main navigation". Active link gets aria-current="page".
Table column sortSortable <th> elements use aria-sort="ascending" / "descending" / "none".
Select-all checkboxaria-label="Select all rows". When partially checked, add aria-checked="mixed".
KPI card numbersWrap the numeric value in an aria-label that includes units: aria-label="284 active policies".
PaginationWrap in <nav aria-label="Pagination">. Each page button gets aria-label="Page N" and aria-current="page" on the active one.
AlertAdd role="alert" so urgent content is announced by screen readers without requiring focus.