Files
GopherGate/static/index.html
hobokenchicken 742cd9e921
Some checks failed
CI / Lint (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
fix: resolve login button TypeError and add favicon
Added id='login-btn' to index.html and created a placeholder favicon.ico.
2026-03-19 13:41:58 -04:00

184 lines
7.8 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GopherGate - Admin Dashboard</title>
<link rel="stylesheet" href="/css/dashboard.css?v=11">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
</head>
<body class="gruvbox-dark">
<!-- Auth Page -->
<div id="auth-page" class="auth-container">
<div class="auth-card">
<div class="auth-header">
<div class="auth-logo">
<div class="logo-icon-container">
<span class="logo-icon-text">GG</span>
</div>
</div>
<h1>GopherGate</h1>
<p>Secure LLM Gateway & Management</p>
</div>
<form id="login-form">
<div class="form-control">
<label for="username">Username</label>
<input type="text" id="username" name="username" required autocomplete="username">
</div>
<div class="form-control">
<label for="password">Password</label>
<input type="password" id="password" name="password" required autocomplete="current-password">
</div>
<button type="submit" id="login-btn" class="btn btn-primary btn-block">Sign In</button>
</form>
<div id="login-error" class="error-message" style="display: none;">
<i class="fas fa-exclamation-circle"></i>
<span></span>
</div>
</div>
</div>
<!-- Main Dashboard -->
<div id="dashboard" class="dashboard-container" style="display: none;">
<!-- Sidebar -->
<nav class="sidebar">
<div class="sidebar-header">
<div class="logo">
<div class="logo-icon-container small">
<span class="logo-icon-text">GG</span>
</div>
<span>GopherGate</span>
</div>
<button class="sidebar-toggle" id="sidebar-toggle">
<i class="fas fa-bars"></i>
</button>
</div>
<div class="sidebar-menu">
<div class="menu-section">
<h3 class="menu-title">MAIN</h3>
<ul class="menu-list">
<li class="menu-item active" data-page="overview">
<i class="fas fa-th-large"></i>
<span>Overview</span>
</li>
<li class="menu-item" data-page="analytics">
<i class="fas fa-chart-bar"></i>
<span>Analytics</span>
</li>
<li class="menu-item" data-page="costs">
<i class="fas fa-dollar-sign"></i>
<span>Costs & Billing</span>
</li>
</ul>
</div>
<div class="menu-section">
<h3 class="menu-title">MANAGEMENT</h3>
<ul class="menu-list">
<li class="menu-item" data-page="clients">
<i class="fas fa-users"></i>
<span>Clients</span>
</li>
<li class="menu-item" data-page="providers">
<i class="fas fa-server"></i>
<span>Providers</span>
</li>
<li class="menu-item" data-page="models">
<i class="fas fa-brain"></i>
<span>Models</span>
</li>
</ul>
</div>
<div class="menu-section">
<h3 class="menu-title">SYSTEM</h3>
<ul class="menu-list">
<li class="menu-item" data-page="monitoring">
<i class="fas fa-activity"></i>
<span>Live Monitoring</span>
</li>
<li class="menu-item" data-page="logs">
<i class="fas fa-list-alt"></i>
<span>Logs</span>
</li>
<li class="menu-item" data-page="users">
<i class="fas fa-user-shield"></i>
<span>Admin Users</span>
</li>
<li class="menu-item" data-page="settings">
<i class="fas fa-cog"></i>
<span>Settings</span>
</li>
</ul>
</div>
</div>
<div class="sidebar-footer">
<div class="user-info">
<div class="user-avatar">
<i class="fas fa-user"></i>
</div>
<div class="user-details">
<div class="user-name" id="display-username">Admin</div>
<div class="user-role" id="display-role">Administrator</div>
</div>
</div>
<button id="logout-btn" class="btn-icon" title="Logout">
<i class="fas fa-sign-out-alt"></i>
</button>
</div>
</nav>
<!-- Main Content -->
<main class="main-content">
<header class="top-bar">
<div class="page-title">
<h2 id="current-page-title">Overview</h2>
</div>
<div class="top-bar-actions">
<div id="connection-status" class="status-indicator">
<span class="status-dot"></span>
<span class="status-text">Disconnected</span>
</div>
<div class="theme-toggle" id="theme-toggle">
<i class="fas fa-moon"></i>
</div>
</div>
</header>
<div id="page-content" class="content-body">
<!-- Content will be loaded dynamically -->
<div class="loader-container">
<div class="loader"></div>
</div>
</div>
</main>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.3.0/build/global/luxon.min.js"></script>
<script src="/js/api.js?v=7"></script>
<script src="/js/auth.js?v=7"></script>
<script src="/js/charts.js?v=7"></script>
<script src="/js/websocket.js?v=7"></script>
<script src="/js/dashboard.js?v=7"></script>
<!-- Page Modules -->
<script src="/js/pages/overview.js?v=7"></script>
<script src="/js/pages/analytics.js?v=7"></script>
<script src="/js/pages/costs.js?v=7"></script>
<script src="/js/pages/clients.js?v=7"></script>
<script src="/js/pages/providers.js?v=7"></script>
<script src="/js/pages/models.js?v=7"></script>
<script src="/js/pages/monitoring.js?v=7"></script>
<script src="/js/pages/settings.js?v=7"></script>
<script src="/js/pages/logs.js?v=7"></script>
<script src="/js/pages/users.js?v=7"></script>
</body>
</html>