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
| Class | Usage |
|---|---|
.btn-acc | Primary CTA (accent bg, shimmer on hover) |
.btn-dark | Secondary (ink bg, white text) |
.btn-ghost | Tertiary (surface bg, border) |
.btn-sm | Smaller 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)
| View | Grid Template |
|---|---|
| Traces | 92px 1.25fr 0.9fr 120px 78px 78px 80px 92px |
| Tools | 1.4fr 1fr 80px 90px 90px 110px |
| Audit | 78px 1.3fr 1.2fr 110px 1fr 90px |
| Sessions | 150px 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>