/* ── 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; } .msg-bubble-sent { background: rgba(var(--bs-success-rgb), 0.10); border-left: 2px solid var(--bs-success); } .msg-sent { text-align: right; } .msg-sent .msg-bubble-sent { text-align: left; } /* ── 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; }