MeshDD-Bot/static/css/style.css
ppfeiffer d3c3806ed5 feat: v0.3.6 - Node settings page, map in sidebar layout
Add /settings page showing device, LoRa, channels, position, power and
bluetooth/network config read from the Meshtastic node. Rebuild map page
with consistent sidebar layout instead of standalone fullscreen view.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 18:06:32 +01:00

254 lines
5.5 KiB
CSS

/* ── AdminLTE-style Layout ─────────────────────────── */
/* Top Navbar */
.top-navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 46px;
z-index: 1030;
background: var(--bs-body-bg);
border-bottom: 1px solid var(--bs-border-color);
font-size: .875rem;
}
/* Sidebar */
.sidebar {
position: fixed;
top: 46px;
left: 0;
bottom: 0;
width: 200px;
background: var(--bs-body-bg);
border-right: 1px solid var(--bs-border-color);
z-index: 1020;
overflow-y: auto;
transition: transform 0.2s ease;
}
.sidebar-nav {
display: flex;
flex-direction: column;
padding: 0.5rem 0;
}
.sidebar-link {
display: flex;
align-items: center;
gap: 0.6rem;
padding: 0.5rem 1rem;
color: var(--bs-body-color);
text-decoration: none;
font-size: .85rem;
border-left: 3px solid transparent;
transition: background 0.15s;
}
.sidebar-link:hover {
background: rgba(var(--bs-emphasis-color-rgb), 0.06);
color: var(--bs-body-color);
}
.sidebar-link.active {
background: rgba(var(--bs-info-rgb), 0.08);
border-left-color: var(--bs-info);
color: var(--bs-info);
font-weight: 600;
}
.sidebar-link i {
font-size: 1rem;
width: 1.25rem;
text-align: center;
}
/* Mobile sidebar */
.sidebar-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.4);
z-index: 1019;
}
@media (max-width: 991.98px) {
.sidebar {
transform: translateX(-100%);
}
.sidebar.open {
transform: translateX(0);
}
.sidebar.open ~ .sidebar-backdrop {
display: block;
}
.content-wrapper {
margin-left: 0 !important;
}
}
/* Content wrapper */
.content-wrapper {
margin-top: 46px;
margin-left: 200px;
padding: 0.75rem;
min-height: calc(100vh - 46px);
background: rgba(var(--bs-emphasis-color-rgb), 0.03);
}
/* ── Info Boxes (AdminLTE style) ──────────────────── */
.info-box {
display: flex;
align-items: stretch;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: 0.375rem;
min-height: 60px;
overflow: hidden;
}
.info-box-icon {
display: flex;
align-items: center;
justify-content: center;
width: 56px;
font-size: 1.4rem;
flex-shrink: 0;
}
.info-box-content {
display: flex;
flex-direction: column;
justify-content: center;
padding: 0.4rem 0.75rem;
line-height: 1.2;
}
.info-box-label {
font-size: .75rem;
color: var(--bs-secondary-color);
}
.info-box-number {
font-size: 1.25rem;
font-weight: 700;
}
/* ── Card outline (AdminLTE style) ────────────────── */
.card-outline {
border-top: 3px solid var(--bs-border-color);
}
.card-outline.card-info {
border-top-color: var(--bs-info);
}
.card-outline.card-warning {
border-top-color: var(--bs-warning);
}
.card-outline.card-success {
border-top-color: var(--bs-success);
}
.card-outline.card-primary {
border-top-color: var(--bs-primary);
}
.card-header {
font-weight: 600;
font-size: .875rem;
padding: 0.5rem 0.75rem;
}
/* ── Status dot ──────────────────────────────────── */
.status-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--bs-danger);
}
.status-dot.connected {
background: var(--bs-success);
box-shadow: 0 0 5px var(--bs-success);
}
/* ── Messages ────────────────────────────────────── */
.msg-item {
padding: 0.35rem 0.65rem;
border-bottom: 1px solid var(--bs-border-color-translucent);
font-size: .8rem;
}
.msg-item:last-child {
border-bottom: none;
}
.msg-bubble {
background: rgba(var(--bs-info-rgb), 0.06);
border-radius: 0.3rem;
padding: 0.2rem 0.45rem;
display: inline-block;
max-width: 100%;
word-break: break-word;
}
/* ── Map wrapper ─────────────────────────────────── */
.map-wrapper {
padding: 0 !important;
overflow: hidden;
}
.map-wrapper #map {
width: 100%;
height: calc(100vh - 46px);
}
.node-tooltip { font-size: 13px; line-height: 1.6; }
.node-tooltip strong { color: #0f3460; }
.node-tooltip .label { color: #666; }
.node-tooltip-wrap { padding: 0; }
.legend {
background: rgba(255, 255, 255, 0.95);
padding: 10px 14px;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
font-size: 13px;
line-height: 1.8;
}
.legend strong { display: block; margin-bottom: 4px; color: #333; }
.legend-item { display: flex; align-items: center; gap: 8px; }
.legend-dot {
width: 12px;
height: 12px;
border-radius: 50%;
border: 1px solid rgba(0,0,0,0.2);
flex-shrink: 0;
}
/* ── Scrollbar ───────────────────────────────────── */
.table-responsive::-webkit-scrollbar,
.card-body::-webkit-scrollbar {
width: 5px;
}
.table-responsive::-webkit-scrollbar-track,
.card-body::-webkit-scrollbar-track {
background: transparent;
}
.table-responsive::-webkit-scrollbar-thumb,
.card-body::-webkit-scrollbar-thumb {
background: var(--bs-border-color);
border-radius: 3px;
}