Programming
1. portfolio
/* Loanbook dashboard styles.
*
* Every selector is scoped under `.lb`, the wrapper the templates put around
* the dashboard. That means this file cannot touch your existing site: no bare
* `body`, `table` or `*` rules, no resets that fight your own CSS.
*
* Colour variables are injected per request from ReportSpec.brand in the
* template, so the palette lives in Python, not here.
*/
.lb, .lb *, .lb *::before, .lb *::after { box-sizing: border-box; }
.lb {
color: var(--ink);
font-family: var(--font-body);
font-size: 15px;
line-height: 1.55;
-webkit-font-smoothing: antialiased;
background: var(--paper);
}
.lb-wrap { max-width: 1240px; margin: 0 auto; padding: 0 28px; }
.lb .mono { font-family: var(--font-mono); }
.lb .muted { color: var(--muted); }
/* ---------- header ---------- */
.lb-header { background: var(--ink); color: #fff; border-bottom: 2px solid var(--gold); }
.lb-bar { display: flex; align-items: center; justify-content: space-between;
gap: 24px; min-height: 62px; flex-wrap: wrap; padding: 10px 0; }
.lb-brand { display: flex; align-items: center; gap: 12px; }
.lb-mark { width: 12px; height: 12px; background: var(--gold); display: block; }
.lb-name { font-family: var(--font-display); font-size: 18px; color: #fff; }
.lb-controls { display: flex; align-items: flex-end; gap: 14px; flex-wrap: wrap; margin: 0; }
.lb-controls label { display: flex; flex-direction: column; gap: 3px; margin: 0; }
.lb-controls label > span { font-family: var(--font-mono); font-size: 9px;
letter-spacing: .16em; text-transform: uppercase; color: #8E8A80; }
.lb-controls select {
background: #17171A; color: #fff; border: 1px solid #34343A; border-radius: 0;
padding: 5px 8px; font-family: var(--font-body); font-size: 13px; min-width: 118px;
height: auto; line-height: 1.4;
}
.lb-controls select:focus-visible, .lb-btn:focus-visible, .lb-tab:focus-visible {
outline: 2px solid var(--gold); outline-offset: 2px;
}
.lb-btn { background: var(--gold); color: var(--ink); text-decoration: none;
padding: 6px 14px; font-size: 13px; align-self: flex-end; border-radius: 0;
display: inline-block; }
.lb-btn:hover { background: var(--gold-deep); color: var(--ink); }
/* ---------- KPI strip ---------- */
.lb-kpis-strip { background: var(--ink); padding-bottom: 26px; }
.lb-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
gap: 1px; background: #26262A; }
.lb-kpi { background: var(--ink); padding: 16px; }
.lb-kpi .k { font-family: var(--font-mono); font-size: 9px; letter-spacing: .14em;
text-transform: uppercase; color: #8E8A80; }
.lb-kpi .v { font-family: var(--font-display); font-size: 26px; color: #fff; margin-top: 6px; }
.lb-kpi .d { font-size: 12px; margin-top: 2px; color: #8E8A80; }
.lb .up { color: #E6A6A6; }
.lb .down { color: #9FD3B6; }
/* ---------- tabs ---------- */
.lb-tabs { border-bottom: 1px solid var(--rule); position: sticky; top: 0;
background: var(--paper); z-index: 5; }
.lb-tabs .lb-wrap { display: flex; gap: 4px; overflow-x: auto; }
.lb-tab { appearance: none; background: none; border: none; cursor: pointer;
padding: 14px 16px; font-family: var(--font-body); font-size: 14px;
color: var(--muted); border-bottom: 2px solid transparent; white-space: nowrap;
border-radius: 0; margin: 0; }
.lb-tab:hover { color: var(--ink); }
.lb-tab.is-active { color: var(--ink); border-bottom-color: var(--gold); }
/* ---------- content ---------- */
.lb-lede { max-width: 82ch; color: var(--ink-soft); margin: 26px 0 6px; padding-left: 18px; }
.lb-lede li { margin-bottom: 5px; }
.lb-chart-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(460px, 1fr));
gap: 22px; padding: 22px 28px 8px; }
.lb-card { margin: 0; border: 1px solid var(--rule); background: #fff; padding: 16px 12px 8px; }
.lb-card figcaption { font-family: var(--font-display); font-size: 15px;
padding: 0 6px 8px; border-bottom: 1px solid var(--rule); margin-bottom: 10px; }
.lb-chart { min-height: 320px; }
.lb-chart-error { color: var(--bad); font-size: 13px; padding: 24px 6px; }
.lb-loading { padding: 60px 0; color: var(--muted); }
.lb-alerts { border-left: 2px solid var(--gold); background: #FCFAF4;
padding: 10px 0 10px 14px; margin: 22px 0 0; font-size: 13.5px; }
.lb-alerts b { font-family: var(--font-mono); font-size: 9px; letter-spacing: .14em;
text-transform: uppercase; color: var(--gold-deep); display: block; }
.lb-alerts ul { margin: 6px 0 0; padding-left: 18px; }
.lb .status-FAIL { color: var(--bad); font-weight: 600; }
.lb .status-WARN { color: var(--gold-deep); }
.lb .status-pass { color: var(--good); }
/* ---------- table ---------- */
.lb-table-block { padding: 34px 28px 10px; }
.lb-table-block h3 { font-family: var(--font-display); font-weight: 400; font-size: 18px;
margin: 0 0 10px; color: var(--ink); }
.lb-table { border-collapse: collapse; width: 100%; font-size: 13px; margin: 0; }
.lb-table th, .lb-table td { padding: 7px 10px; text-align: right;
border-bottom: 1px solid var(--rule); border-top: none; border-left: none;
border-right: none; background: transparent; }
.lb-table th { font-family: var(--font-mono); font-size: 9px; letter-spacing: .1em;
text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--ink);
font-weight: 400; }
.lb-table td:first-child, .lb-table th:first-child { text-align: left; }
.lb-table tbody tr:hover td { background: #FCFAF4; }
.lb-dl { font-size: 12px; color: var(--muted); }
.lb-dl a { color: var(--gold-deep); }
.lb-empty { padding: 80px 0; }
.lb-empty pre { background: #FAF8F2; border-left: 2px solid var(--gold);
padding: 14px 16px; overflow-x: auto; font-family: var(--font-mono); font-size: 13px; }
.lb-footer { background: var(--ink); color: #8E8A80; padding: 28px 0;
margin-top: 48px; font-size: 12px; }
@media (max-width: 860px) {
.lb-wrap { padding: 0 16px; }
.lb-chart-grid { grid-template-columns: 1fr; padding: 18px 16px 8px; }
}
@media (prefers-reduced-motion: reduce) { .lb * { transition: none !important; } }
PO
powerty
Author
· Staff
Aug. 26, 2026
Aug. 26, 2026
5
Views
0
Likes
4m
Read