Niveus/examples/dashboard/app.css
Nexoniarz 23b8dd376d Niveus: a tactile, adaptive interface language
Bevelled controls with light falling across them, fields as wells, solid
windows, and glass kept for the chrome that floats over everything else.
Warm graphite in dark, soft paper in light, one brand color driving both.
Ships its own fonts (Instrument Sans, JetBrains Mono; OFL).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 17:47:03 +02:00

153 lines
3.6 KiB
CSS

/* ==========================================================================
Northwire Ops — dashboard layout
--------------------------------------------------------------------------
Layout only. A data-dense view is where a design system is tested hardest:
there are more things on screen than anywhere else, so any inconsistency in
spacing or weight shows up immediately. Nothing here restates the language —
even the chart draws itself in semantic colors.
========================================================================== */
html, body { block-size: 100%; }
.app {
display: grid;
grid-template-columns: 15rem 1fr;
min-block-size: 100svh;
}
@media (max-width: 62rem) {
.app { grid-template-columns: 1fr; }
.app__sidebar { display: none; }
}
.app__main {
min-inline-size: 0;
display: flex;
flex-direction: column;
}
.app__content {
flex: 1;
padding: var(--nv-space-6) var(--nv-layout-gutter) var(--nv-space-12);
display: flex;
flex-direction: column;
gap: var(--nv-space-6);
max-inline-size: 80rem;
inline-size: 100%;
margin-inline: auto;
}
.page-head {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
gap: var(--nv-space-4);
}
/* --- Stat tiles -------------------------------------------------------------- */
.stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
gap: var(--nv-space-4);
}
.stat__value {
display: block;
margin-block: var(--nv-space-2) var(--nv-space-1);
font-size: var(--nv-font-size-3xl);
font-weight: var(--nv-font-weight-semibold);
letter-spacing: var(--nv-letter-spacing-tighter);
color: var(--nv-color-text-primary);
font-variant-numeric: tabular-nums;
}
/* --- Chart --------------------------------------------------------------------
Drawn in semantic colors, so it follows the brand and both appearances with
no second palette to maintain. */
.chart {
inline-size: 100%;
block-size: 14rem;
display: block;
overflow: visible;
}
.chart__grid {
stroke: var(--nv-color-border-subtle);
stroke-width: 1;
}
.chart__line {
fill: none;
stroke: var(--nv-color-accent);
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
vector-effect: non-scaling-stroke;
}
.chart__line--compare {
stroke: var(--nv-color-border-strong);
stroke-dasharray: 4 4;
}
.chart__area {
fill: url(#chart-fill);
}
.chart__labels {
display: flex;
justify-content: space-between;
margin-block-start: var(--nv-space-2);
}
/* --- Layout of the lower half --------------------------------------------------- */
.split {
display: grid;
gap: var(--nv-space-6);
align-items: start;
}
@media (min-width: 70rem) {
.split { grid-template-columns: 1.6fr 1fr; }
}
.activity {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
}
.activity li {
display: flex;
gap: var(--nv-space-3);
padding-block: var(--nv-space-3);
border-block-end: var(--nv-border-width) solid var(--nv-color-border-subtle);
}
.activity li:last-child { border-block-end: 0; }
.activity__mark {
inline-size: var(--nv-space-2);
block-size: var(--nv-space-2);
border-radius: var(--nv-radius-full);
margin-block-start: 0.45em;
flex: none;
background-color: var(--nv-color-border-strong);
}
.activity__mark--danger { background-color: var(--nv-color-danger); }
.activity__mark--success { background-color: var(--nv-color-success); }
.activity__mark--accent { background-color: var(--nv-color-accent); }
.activity__mark--warning { background-color: var(--nv-color-warning); }
.service-name {
display: flex;
align-items: center;
gap: var(--nv-space-2-5);
}