feat: add operational Dashboard

This commit is contained in:
lussierj committed 2026-08-17 17:11:40 +00:00
1 parent 4a1959ecd6
commit b8b741ccee
23 files changed
+1278 -59

No files matched your search

+129
View File
@@ -1489,3 +1489,132 @@ button.map-position:hover {
.repair-search, .repair-filter-actions { grid-column: auto; }
.repair-table td { grid-template-columns: 90px minmax(0, 1fr); }
}
/* Dashboard */
.dashboard-status-band {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 12px;
}
.dashboard-status-band p { margin: 0; }
.dashboard-permission-note { color: var(--muted); font-size: 12px; }
.dashboard-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.dashboard-section {
min-width: 0;
border: 1px solid var(--line);
border-radius: 6px;
padding: 16px;
background: var(--surface);
}
.dashboard-section-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 12px;
}
.dashboard-section-head .eyebrow { margin: 0 0 3px; }
.dashboard-section h2 { margin: 0; font-size: 19px; }
.dashboard-section h3 { margin: 0 0 8px; font-size: 14px; }
.dashboard-section .object-link { white-space: nowrap; }
.dashboard-total {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 16px;
border-left: 4px solid var(--accent);
padding: 9px 11px;
background: #f6f8fa;
}
.dashboard-total span { color: var(--muted); font-weight: 700; }
.dashboard-total strong { font-size: 25px; }
.dashboard-dimension-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
margin-top: 16px;
}
.dashboard-count-list,
.dashboard-status-list {
display: grid;
gap: 0;
margin: 0;
}
.dashboard-count-list > div,
.dashboard-status-list > div {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 36px;
border-top: 1px solid #e3e7eb;
}
.dashboard-count-list dt,
.dashboard-status-list dt { color: #40505f; }
.dashboard-count-list dd,
.dashboard-status-list dd { margin: 0; font-weight: 800; }
.dashboard-status-list { margin-top: 10px; }
.dashboard-status-list a { font-weight: 700; }
.dashboard-boundary { margin: 13px 0 0; color: var(--muted); font-size: 12px; }
.attention-list { display: grid; gap: 7px; }
.attention-list a {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 42px;
border: 1px solid var(--line);
border-left-width: 4px;
border-radius: 5px;
padding: 8px 11px;
background: #fff;
text-decoration: none;
}
.attention-list a[data-state="offline"] { border-left-color: var(--danger); }
.attention-list a[data-state="unknown"] { border-left-color: #596675; }
.attention-list a[data-state="unstable"] { border-left-color: var(--warn); }
.attention-list a[data-state="repair"] { border-left-color: #6b4ca5; }
.attention-list span { font-weight: 750; }
.attention-list strong { font-size: 18px; }
.dashboard-location-counts {
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: 18px;
}
@media (max-width: 900px) {
.dashboard-grid { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
.dashboard-status-band,
.dashboard-section-head { align-items: flex-start; flex-direction: column; }
.dashboard-dimension-grid { grid-template-columns: 1fr; }
.dashboard-location-counts { grid-template-columns: 1fr; }
.dashboard-section { padding: 13px; }
.dashboard-section .object-link { white-space: normal; }
}
@media (prefers-reduced-motion: reduce) {
.dashboard-section *,
.attention-list * { scroll-behavior: auto; }
}