Docs

Design

Component Patterns

Reusable UI component classes. Dashboard uses vanilla CSS classes; landing uses Tailwind.

Buttons

Dashboard Buttons

css
.btn {
  font-family: inherit;
  font-weight: 600;
  font-size: 13px;
  padding: 8px 14px;
  border: 1px solid var(--line-2);
  background: var(--panel);
  color: var(--ink);
  cursor: pointer;
  min-height: 44px;  /* touch target */
  border-radius: 0;  /* flat */
}
.btn:hover { border-color: var(--acc); color: var(--acc); }
.btn.acc { background: var(--acc); border-color: var(--acc); color: var(--on-acc); }
.btn.acc:hover { background: var(--acc-press); color: var(--on-acc); }
.btn.sm { padding: 6px 11px; font-size: 12px; }
.btn.ok { background: var(--green-bg); border-color: transparent; color: var(--green); }
.btn.ok:hover { background: var(--green); color: var(--bg); }
.btn.danger { background: var(--red-bg); border-color: transparent; color: var(--red); }
.btn.danger:hover { background: var(--red); color: var(--bg); }

Landing Buttons

ClassUsage
.btn-accPrimary CTA (accent bg, shimmer on hover)
.btn-darkSecondary (ink bg, white text)
.btn-ghostTertiary (surface bg, border)
.btn-smSmaller padding, 14px font

Cards

Dashboard Cards

css
.pcard {
  border: 1px solid var(--line);
  background: var(--panel);
  padding: 20px;
  position: relative;
  box-shadow: var(--sh);
  border-radius: 0;
}
.pcard.locked { opacity: 0.7; }  /* Pro/Enterprise gated */

Panel Box

css
.panel-box {
  border: 1px solid var(--line);
  background: var(--panel);
  padding: 20px;
  box-shadow: var(--sh);
  border-radius: 0;
}

KPI Cards

css
.kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
.kpi {
  border: 1px solid var(--line);
  background: var(--panel);
  padding: 16px;
  box-shadow: var(--sh);
}
.kpi .k { font-size: 12px; color: var(--faint); font-weight: 500; }
.kpi .v { font-size: 24px; color: var(--ink); font-weight: 700; letter-spacing: -0.02em; margin-top: 6px; }
.kpi .d { font-size: 11px; font-family: var(--mono); margin-top: 4px; }

Tables

Dashboard Tables

css
.tbl {
  border: 1px solid var(--line);
  background: var(--panel);
  box-shadow: var(--sh);
}
.tr {
  display: grid;
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--line);
}
.tr:last-child { border-bottom: none; }
.tr.head {
  color: var(--faint);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-weight: 600;
  background: var(--panel-2);
}
.tr.row { cursor: pointer; }
.tr.row:hover { background: var(--panel-2); }
.tr.row.kbsel { background: var(--panel-2); box-shadow: inset 3px 0 0 var(--acc); }

Table Grid Columns (per view)

ViewGrid Template
Traces92px 1.25fr 0.9fr 120px 78px 78px 80px 92px
Tools1.4fr 1fr 80px 90px 90px 110px
Audit78px 1.3fr 1.2fr 110px 1fr 90px
Sessions150px 1.2fr 90px 70px 80px 120px 90px

Badges

css
.badge {
  font-family: var(--mono);
  font-size: 11px;
  padding: 3px 8px;
  white-space: nowrap;
  display: inline-block;
  text-align: center;
}
.b-ok { background: var(--green-bg); color: var(--green); }
.b-warn { background: var(--amber-bg); color: var(--amber); }
.b-err { background: var(--red-bg); color: var(--red); }
.b-flag { background: var(--acc-bg); color: var(--acc-ink); }

Chips / Filter Bar

css
.fbar { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
.chip {
  font-size: 12px;
  font-weight: 600;
  padding: 6px 12px;
  border: 1px solid var(--line);
  background: var(--panel);
  color: var(--muted);
  cursor: pointer;
}
.chip:hover { color: var(--ink); }
.chip.on { background: var(--acc-bg); border-color: var(--acc-br); color: var(--acc-ink); }

Tabs

css
.tabs { display: flex; gap: 6px; margin-bottom: 14px; }
.tab {
  font-size: 13px;
  font-weight: 600;
  padding: 7px 14px;
  border: 1px solid var(--line);
  background: var(--panel);
  color: var(--muted);
  cursor: pointer;
}
.tab.on { background: var(--ink); color: var(--bg); border-color: var(--ink); }

Search Input

css
.search {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 8px;
  background: var(--panel-2);
  border: 1px solid var(--line);
  padding: 7px 11px;
  width: 280px;
  color: var(--muted);
}
.search input {
  background: none;
  border: none;
  outline: none;
  color: var(--ink);
  font-family: inherit;
  font-size: 13px;
  width: 100%;
}

Key-Value Pairs

css
.kv {
  display: flex;
  justify-content: space-between;
  padding: 7px 0;
  border-bottom: 1px dashed var(--line);
  font-size: 12.5px;
}
.kv .k { color: var(--faint); }
.kv .v { color: var(--ink); font-family: var(--mono); }

Approval Cards

css
.appr {
  border: 1px solid var(--line);
  background: var(--panel);
  padding: 16px 18px;
  margin-bottom: 10px;
  display: grid;
  grid-template-columns: 64px 1fr auto;
  gap: 16px;
  align-items: center;
  box-shadow: var(--sh);
}
.appr.high { border-left: 3px solid var(--red); }
.appr.med { border-left: 3px solid var(--amber); }

Receipt Card

css
.receipt {
  border: 1px solid var(--line);
  background: var(--panel);
  box-shadow: var(--sh);
  margin-top: 16px;
}
.rline {
  display: grid;
  grid-template-columns: 92px 1fr;
  gap: 12px;
  padding: 9px 0;
  border-bottom: 1px dashed var(--line);
  font-size: 12.5px;
}

Empty State

css
.empty { color: var(--faint); text-align: center; padding: 40px; font-size: 13px; }
.cleared {
  border: 1px dashed var(--line);
  background: var(--panel);
  padding: 40px;
  text-align: center;
  color: var(--faint);
}

Usage with @pagekit/ui

The design system is compatible with the @pagekit/ui component library:

bash
pnpm add @pagekit/ui
tsx
import { Button, Card, Badge } from "@pagekit/ui";

<Button variant="primary">Primary action</Button>
<Button variant="outline">Secondary</Button>
<Badge variant="default">Draft</Badge>