:root { --bg-base: #0d1117; --bg-surface: #161b22; --bg-card: #1c2230; --border: #30363d; --text-primary: #e6edf3; --text-muted: #8b949e; --accent: #4f8ef7; --accent-hover: #6aa3ff; } html, body { height: 100%; } body { background: var(--bg-base); color: var(--text-primary); font-family: system-ui, -apple-system, sans-serif; } /* ── Modal ── */ .modal-content { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; } .modal-header { border-bottom-color: var(--border); } .modal-footer { border-top-color: var(--border); } .modal-title { color: var(--text-primary); font-size: 0.95rem; font-weight: 600; } .modal-backdrop { background-color: #000; } .sidebar { background: var(--bg-surface); border-right: 1px solid var(--border); width: 240px; min-height: 100vh; padding: 1.25rem 1rem; position: fixed; top: 0; left: 0; bottom: 0; z-index: 1040; display: flex; flex-direction: column; } .sidebar .brand { display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; padding-bottom: 1.25rem; margin-bottom: 0.5rem; border-bottom: 1px solid var(--border); } .sidebar .brand img { width: 120px; height: auto; object-fit: contain; } .sidebar .brand span { font-weight: 600; font-size: 0.95rem; color: var(--text-primary); } .nav-link-custom { display: flex; align-items: center; gap: 0.6rem; color: var(--text-muted); text-decoration: none; padding: 0.55rem 0.75rem; border-radius: 8px; font-size: 0.9rem; transition: background 0.15s, color 0.15s; } .nav-link-custom:hover, .nav-link-custom.active { background: rgba(79, 142, 247, 0.12); color: var(--accent); } .nav-link-custom i { flex-shrink: 0; opacity: 0.7; width: 1rem; text-align: center; } .nav-link-custom.active i, .nav-link-custom:hover i { opacity: 1; } /* ── Bottom nav (mobile) ── */ .bottom-nav { display: none; position: fixed; bottom: 0; left: 0; right: 0; background: var(--bg-surface); border-top: 1px solid var(--border); z-index: 1040; flex-direction: row; gap: 0.75rem; align-items: stretch; padding: 0.5rem max(0.5rem, env(safe-area-inset-left)) calc(0.5rem + env(safe-area-inset-bottom)) max(0.5rem, env(safe-area-inset-right)); } .bottom-nav a { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0.5rem 0.25rem; color: var(--text-muted); text-decoration: none; font-size: 0.68rem; transition: color 0.15s; white-space: nowrap; } .bottom-nav a i { font-size: 1.15rem; } .bottom-nav a.active, .bottom-nav a:hover { color: var(--accent); } /* ── Top bar (mobile) ── */ .topbar { display: none; background: var(--bg-surface); border-bottom: 1px solid var(--border); padding: 0.75rem 1rem; position: sticky; top: 0; z-index: 1030; align-items: center; gap: 0.75rem; } /* ── Main ── */ .main { margin-left: 240px; padding: 1.75rem 2rem; min-height: 100vh; } .main-inner { max-width: 960px; margin: 0 auto; } /* ── Page header ── */ .page-header { margin-bottom: 1.5rem; } .page-header h1 { font-size: 1.25rem; font-weight: 700; color: var(--text-primary); margin: 0; } .page-header p { color: var(--text-muted); font-size: 0.875rem; margin: 0.25rem 0 0; } /* ── Cards ── */ .card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 2px 12px rgba(0,0,0,0.3); } .card h5 { color: var(--text-primary); font-size: 0.95rem; font-weight: 600; margin-bottom: 1rem; } /* ── Stat cards ── */ .stat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 1.1rem; text-align: center; } .stat-card .stat-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 0.3rem; } .stat-card .stat-value { font-size: 1.9rem; font-weight: 700; color: var(--text-primary); line-height: 1; } /* ── Forms ── */ .form-control, .form-select { background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-primary); border-radius: 8px; } .form-control:focus, .form-select:focus { background: var(--bg-surface); border-color: var(--accent); color: var(--text-primary); box-shadow: 0 0 0 3px rgba(79, 142, 247, 0.18); } .form-control::placeholder { color: var(--text-muted); } .form-control[type="file"] { color: var(--text-muted); } /* ── Tables ── */ .table { color: var(--text-primary); font-size: 0.875rem; --bs-table-bg: transparent; --bs-table-striped-bg: rgba(255,255,255,0.03); --bs-table-border-color: var(--border); } .table th { color: var(--text-muted); font-weight: 500; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.04em; border-color: var(--border); } .table td { border-color: var(--border); vertical-align: middle; } .table-responsive { border-radius: 8px; } /* ── Buttons ── */ .btn { border-radius: 8px; } .btn-primary { background: var(--accent); border-color: var(--accent); color: #fff; } .btn-primary:hover, .btn-primary:focus { background: var(--accent-hover); border-color: var(--accent-hover); } .btn-secondary { background: var(--bg-surface); border-color: var(--border); color: var(--text-muted); } .btn-secondary:hover, .btn-secondary:focus { background: rgba(255,255,255,0.05); border-color: var(--border); color: var(--text-primary); } .btn-danger { background: rgba(220, 53, 69, 0.12); border-color: transparent; color: #f87171; } .btn-danger:hover, .btn-danger:focus { background: rgba(220, 53, 69, 0.22); border-color: transparent; color: #f87171; } .btn-accent { background: rgba(79, 142, 247, 0.12); border-color: transparent; color: var(--accent); } .btn-accent:hover, .btn-accent:focus { background: rgba(79, 142, 247, 0.22); border-color: transparent; color: var(--accent-hover); } .btn-success { border-radius: 8px; } /* ── Hamburger toggle ── */ .hamburger { background: none; border: 1px solid var(--border); color: var(--text-primary); border-radius: 8px; padding: 0.35rem 0.6rem; cursor: pointer; line-height: 1; font-size: 1rem; display: flex; align-items: center; } /* ── Offcanvas dark sidebar (mobile) ── */ .offcanvas { background: var(--bg-surface) !important; border-right: 1px solid var(--border) !important; } .offcanvas-header { border-bottom: 1px solid var(--border); } /* ── Badge ── */ .badge-failed { background: rgba(220,53,69,0.18); color: #f87171; border-radius: 6px; font-size: 0.8rem; padding: 0.2em 0.55em; } .badge-delivered { background: rgba(34,197,94,0.15); color: #4ade80; border-radius: 6px; font-size: 0.8rem; padding: 0.2em 0.55em; } /* ── Dropzone ── */ .dropzone { background: var(--bg-surface); border: 2px dashed var(--border); border-radius: 10px; color: var(--text-muted); min-height: 120px; display: flex; align-items: center; justify-content: center; transition: border-color 0.15s, background 0.15s; margin-bottom: 1rem; cursor: pointer; } .dropzone:hover, .dropzone.dz-drag-hover { border-color: var(--accent); background: rgba(79, 142, 247, 0.06); } .dropzone .dz-message { display: flex; flex-direction: column; align-items: center; gap: 0.4rem; margin: 0; pointer-events: none; } .dropzone .dz-message .dz-icon { font-size: 1.75rem; color: var(--text-muted); } .dropzone .dz-message span { font-size: 0.875rem; } .dropzone .dz-preview .dz-filename span, .dropzone .dz-preview .dz-size { color: var(--text-primary); } .dropzone .dz-preview .dz-progress .dz-upload { background: var(--accent); } /* ── Section header ── */ .section-title { font-size: 1.05rem; font-weight: 600; color: var(--text-primary); margin-bottom: 1.25rem; } /* ── Chat bubble tail override when sitting on --bg-surface ── */ .bubble-on-surface .from-them:after { background: var(--bg-surface); } /* ── Responsive ── */ @media (max-width: 767.98px) { .sidebar { display: none; } .bottom-nav { display: flex; } .topbar { display: flex; padding-left: max(1rem, env(safe-area-inset-left)); padding-right: max(1rem, env(safe-area-inset-right)); } .main { margin-left: 0; padding-top: 1rem; padding-left: max(1rem, env(safe-area-inset-left)); padding-right: max(1rem, env(safe-area-inset-right)); padding-bottom: calc(4rem + max(0.5rem, env(safe-area-inset-bottom))); } }