| :root { |
| --bg: #0f172a; --bg2: #1e293b; --bg3: #334155; |
| --card: #1e293b; --border: #334155; --border-hi: #475569; |
| --accent: #f97316; --accent2: #fb923c; |
| --green: #10b981; --blue: #3b82f6; --purple: #8b5cf6; --cyan: #06b6d4; --red: #ef4444; |
| --txt: #f1f5f9; --txt2: #94a3b8; --txt3: #64748b; |
| --sans: 'Inter', system-ui, sans-serif; |
| --mono: 'JetBrains Mono', monospace; |
| } |
| * { margin: 0; padding: 0; box-sizing: border-box; } |
| body { font-family: var(--sans); background: var(--bg); color: var(--txt); } |
|
|
| .app-layout { display: flex; min-height: 100vh; } |
| .sidebar { width: 220px; background: var(--bg2); border-right: 1px solid var(--border); display: flex; flex-direction: column; position: fixed; top: 0; bottom: 0; z-index: 100; } |
| .sidebar-header { padding: 16px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid var(--border); } |
| .logo-mark { width: 32px; height: 32px; background: linear-gradient(135deg, var(--accent), #ea580c); border-radius: 8px; display: flex; align-items: center; justify-content: center; color: white; font-weight: 800; font-size: 12px; } |
| .logo-text { font-weight: 700; font-size: 15px; } |
| .sidebar-nav { flex: 1; padding: 12px 8px; display: flex; flex-direction: column; gap: 2px; } |
| .nav-link { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 8px; text-decoration: none; color: var(--txt3); font-size: 13px; font-weight: 500; transition: all 0.2s; } |
| .nav-link:hover { color: var(--txt); background: var(--bg3); } |
| .nav-link.active { color: var(--accent); background: rgba(249,115,22,0.1); } |
| .sidebar-footer { padding: 12px 16px; border-top: 1px solid var(--border); } |
| .system-status { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--green); } |
| .status-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--green); animation: pulse 2s infinite; } |
| @keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } } |
|
|
| .main-content { margin-left: 220px; flex: 1; padding: 24px; } |
| .page { max-width: 1400px; } |
| .page-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; flex-wrap: wrap; gap: 12px; } |
| .page-header h1 { font-size: 22px; font-weight: 700; } |
| .header-actions { display: flex; align-items: center; gap: 12px; } |
| .header-actions label { font-size: 12px; color: var(--txt2); display: flex; align-items: center; gap: 6px; } |
| .header-actions input[type="number"] { width: 60px; padding: 4px 8px; background: var(--bg3); border: 1px solid var(--border); border-radius: 6px; color: var(--txt); font-size: 12px; } |
|
|
| .btn { padding: 8px 16px; border-radius: 8px; font-size: 13px; font-weight: 600; border: none; cursor: pointer; display: flex; align-items: center; gap: 6px; transition: all 0.2s; } |
| .btn-primary { background: var(--accent); color: white; } |
| .btn-primary:hover { background: var(--accent2); } |
| .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; } |
|
|
| .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; } |
| .kpi-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 16px; display: flex; gap: 12px; transition: border-color 0.2s; } |
| .kpi-card:hover { border-color: var(--border-hi); } |
| .kpi-icon { width: 40px; height: 40px; border-radius: 10px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } |
| .kpi-value { font-size: 22px; font-weight: 700; } |
| .kpi-label { font-size: 12px; color: var(--txt2); margin-top: 2px; } |
| .kpi-trend { font-size: 11px; color: var(--txt3); margin-top: 4px; } |
|
|
| .charts-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; } |
| .chart-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 16px; } |
| .chart-card.full-width { grid-column: 1 / -1; } |
| .chart-card h3 { font-size: 13px; font-weight: 600; color: var(--txt2); margin-bottom: 12px; } |
|
|
| .metric-list { display: flex; flex-direction: column; gap: 10px; } |
| .metric-row { display: flex; justify-content: space-between; align-items: center; font-size: 13px; padding: 6px 0; border-bottom: 1px solid var(--border); } |
| .metric-row span { color: var(--txt2); } |
| .metric-row strong { color: var(--txt); } |
|
|
| .badge { font-size: 11px; padding: 4px 10px; border-radius: 20px; font-weight: 600; } |
| .badge-green { background: rgba(16,185,129,0.15); color: var(--green); } |
| .badge-yellow { background: rgba(251,191,36,0.15); color: #fbbf24; } |
| .badge-red { background: rgba(239,68,68,0.15); color: var(--red); } |
|
|
| .fleet-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; } |
| .fleet-card { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 14px; display: flex; gap: 12px; } |
| .fleet-icon { color: var(--blue); } |
| .fleet-name { font-size: 13px; font-weight: 600; } |
| .fleet-status { font-size: 11px; color: var(--green); } |
| .fleet-location { font-size: 11px; color: var(--txt3); display: flex; align-items: center; gap: 4px; margin-top: 4px; } |
|
|
| .table-container { overflow-x: auto; } |
| .data-table { width: 100%; border-collapse: collapse; font-size: 13px; } |
| .data-table th { text-align: left; padding: 10px 12px; background: var(--bg2); color: var(--txt2); font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); } |
| .data-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); } |
| .data-table tr:hover td { background: rgba(51,65,85,0.5); } |
| .mono { font-family: var(--mono); font-size: 11px; } |
| .status-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 500; } |
| .status-pending { background: rgba(251,191,36,0.15); color: #fbbf24; } |
| .status-in_transit { background: rgba(59,130,246,0.15); color: var(--blue); } |
| .status-delivered { background: rgba(16,185,129,0.15); color: var(--green); } |
| .status-failed { background: rgba(239,68,68,0.15); color: var(--red); } |
|
|
| .insight-list { display: flex; flex-direction: column; gap: 8px; } |
| .insight { font-size: 12px; padding: 8px 10px; border-radius: 6px; border-left: 3px solid var(--border); background: var(--bg); } |
| .insight-high { border-color: var(--red); } .insight-medium { border-color: var(--accent); } .insight-low { border-color: var(--green); } |
| .insight-type { font-size: 10px; text-transform: uppercase; font-weight: 600; color: var(--txt3); margin-right: 6px; } |
|
|
| .analytics-summary { display: grid; grid-template-columns: 1fr; gap: 16px; } |
| .summary-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 20px; } |
| .summary-card h4 { font-size: 14px; margin-bottom: 12px; color: var(--txt2); } |
|
|
| .error-state { padding: 20px; background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3); border-radius: 8px; color: var(--red); font-size: 13px; } |
| .empty-state { padding: 40px; text-align: center; color: var(--txt3); font-size: 14px; } |
| .loading-state { padding: 40px; text-align: center; color: var(--txt2); font-size: 14px; } |
| .spin { animation: spin 1s linear infinite; } |
| @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } |
| .brain-status { display: flex; align-items: center; gap: 8px; } |
|
|