voice-trainer / static /admin.html
Voice Trainer deployment
Deploy Neck Analysis V1 with structured scoring and desktop/mobile integration
8c07d66
Raw History Blame Contribute Delete
7.79 kB
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#ffffff">
<title>ืœื•ื— ื ื™ื”ื•ืœ โ€” ืื™ืžื•ืŸ ืงื•ืœื™</title>
<link rel="stylesheet" href="style.css?v=11">
</head>
<body>
<header class="topbar">
<div class="topbar-inner">
<div class="brand">
<span class="brand-mark">๐Ÿ› </span>
<span class="brand-text">
<span class="brand-title">ืœื•ื— ื ื™ื”ื•ืœ</span>
<span class="brand-sub">ืื™ืžื•ืŸ ืงื•ืœื™ โ€” ื ื™ื”ื•ืœ ืžืฉืชืžืฉื™ื</span>
</span>
</div>
<div class="topbar-actions">
<div id="user-bar" class="user-bar-inline" hidden>
<span id="my-class-code" class="tag" hidden></span>
<span id="joined-class-info" class="tag" hidden></span>
<span class="user-chip">
<span class="user-chip-avatar">โ€ข</span>
<span id="user-name" class="user-email-nav"></span>
</span>
<a href="/" class="btn btn-ghost btn-sm">ื—ื–ืจื” ืœืืคืœื™ืงืฆื™ื”</a>
<a href="/admin" id="admin-link" class="btn btn-ghost btn-sm" hidden>ืœื•ื— ื ื™ื”ื•ืœ</a>
<button id="logout-btn" class="btn btn-ghost btn-sm">ื”ืชื ืชืงื•ืช</button>
</div>
</div>
</div>
</header>
<main class="app-shell">
<!-- Signed out -->
<div id="auth-bar" class="auth-screen admin-auth">
<section class="auth-card">
<h1 class="auth-heading">ื›ื ื™ืกืช ืžื ื”ืœ</h1>
<p class="auth-sub">ื ื“ืจืฉืช ื”ืจืฉืืช ื ื™ื”ื•ืœ ื›ื“ื™ ืœืฆืคื•ืช ื‘ืžืฉืชืžืฉื™ื ื•ื‘ืชื•ืฆืื•ืช.</p>
<div id="auth-forms" class="auth-form">
<label class="field">
<span class="field-label">ืื™ืžื™ื™ืœ</span>
<input type="text" id="auth-username" class="input auth-input" placeholder="name@example.com" autocomplete="username" />
</label>
<label class="field">
<span class="field-label">ืกื™ืกืžื”</span>
<input type="password" id="auth-password" class="input auth-input" placeholder="ืกื™ืกืžื”" autocomplete="current-password" />
</label>
<label class="field">
<span class="field-label">ืงื•ื“ ื›ื™ืชื” <span class="field-hint">(ืœื ื—ื•ื‘ื”)</span></span>
<input type="text" id="auth-class-code" class="input auth-input" placeholder="ืœืžืฉืœ ABC123" />
</label>
<label class="consent" id="auth-consent-wrap" style="display:none;">
<input type="checkbox" id="auth-consent" />
<span>ืงืจืืชื™ ื•ืื ื™ ืžืกื›ื™ื/ื” ืœ<a href="/terms.html" target="_blank">ืชื ืื™ ื”ืฉื™ืžื•ืฉ</a> ื•ืœ<a href="/privacy.html" target="_blank">ืžื“ื™ื ื™ื•ืช ื”ืคืจื˜ื™ื•ืช</a>.</span>
</label>
<div class="auth-actions">
<button id="login-btn" class="btn btn-primary btn-block">ื”ืชื—ื‘ืจื•ืช</button>
<button id="register-btn" class="btn btn-secondary btn-block">ื”ืจืฉืžื”</button>
</div>
<p id="auth-error" class="auth-error" role="alert"></p>
</div>
</section>
</div>
<!-- Access denied -->
<section class="empty-card" id="admin-denied" hidden>
<span class="empty-icon">๐Ÿ”’</span>
<h2>ืื™ืŸ ื”ืจืฉืืช ื ื™ื”ื•ืœ</h2>
<p>ื”ื—ืฉื‘ื•ืŸ ื”ืžื—ื•ื‘ืจ ืื™ื ื• ืžื ื”ืœ. ื”ืชื—ื‘ืจื• ืขื ื—ืฉื‘ื•ืŸ ืžื ื”ืœ ื›ื“ื™ ืœื”ืžืฉื™ืš.</p>
<a href="/" class="btn btn-secondary">ื—ื–ืจื” ืœืืคืœื™ืงืฆื™ื”</a>
</section>
<!-- Admin content -->
<section id="admin-content" hidden>
<div class="admin-toolbar">
<div id="admin-class-code-box" class="class-code-box" hidden>
<span class="class-code-caption">ืงื•ื“ ื”ื›ื™ืชื” ืฉืœืš</span>
<span id="admin-class-code-value" class="class-code-value"></span>
<button id="copy-class-code" class="small-btn" title="ื”ืขืชืง ืงื•ื“">๐Ÿ“‹</button>
</div>
</div>
<div id="allowlist-box" class="card admin-section" hidden>
<h2 class="card-title">ื”ื•ืกืคืช ืžืฉืชืžืฉื™ื</h2>
<p class="subtitle">
ื”ื•ืกื™ืคื• ืื™ืžื™ื™ืœ ื›ื“ื™ ืœืชืช ื’ื™ืฉื” ืœืืคืœื™ืงืฆื™ื”. ื”ืžืฉืชืžืฉ ื ื›ื ืก ืขื ื”ืื™ืžื™ื™ืœ ืฉืœื•
ื•ื”ืกื™ืกืžื” <strong>qwertyui</strong> โ€” ื‘ื›ื ื™ืกื” ื”ืจืืฉื•ื ื” ื”ื•ื ืœื•ื—ืฅ
<strong>ื”ืจืฉืžื”</strong> ื•ืžืืฉืจ ืืช ืชื ืื™ ื”ืฉื™ืžื•ืฉ, ื•ืื– ื”ื•ื ืžืฉื•ื™ืš ืื•ื˜ื•ืžื˜ื™ืช ืœื›ื™ืชื” ืฉืœื›ื
ื•ื›ืœ ื”ื”ื™ืกื˜ื•ืจื™ื” ืฉืœื• ื ืฉืžืจืช ื›ืืŸ.
</p>
<div class="allowlist-add">
<input type="email" id="allow-email-input" class="input auth-input" placeholder="email@example.com" />
<input type="text" id="allow-name-input" class="input auth-input" placeholder="ืฉื ืžืœื (ืจืฉื•ืช)" />
<button id="allow-add-btn" class="btn btn-primary">ื”ื•ืกืฃ</button>
<span id="allow-msg" class="auth-error"></span>
</div>
<ul id="allowlist-list" class="allowlist-list"></ul>
</div>
<div class="card admin-section">
<div class="card-head">
<h2 class="card-title" id="users-title">ืžืฉืชืžืฉื™ื</h2>
</div>
<div id="class-tabs" class="tabs class-tabs" hidden>
<button class="tab class-tab active" data-filter="all">ื›ืœ ื”ืžืฉืชืžืฉื™ื</button>
<button class="tab class-tab" data-filter="no-class">ืœืœื ื›ื™ืชื”</button>
<!-- dynamic tabs per class are inserted here -->
</div>
<div class="table-wrapper">
<table class="admin-table" id="users-table">
<thead>
<tr>
<th>ืฉื ืžืฉืชืžืฉ</th>
<th>ืฉื ืžืœื</th>
<th>ืชืคืงื™ื“</th>
<th>ื›ื™ืชื”</th>
<th>ืชืืจื™ืš ื”ืจืฉืžื”</th>
<th>ื ื™ืชื•ื—ื™ื</th>
<th>G</th><th>R</th><th>B</th><th>A</th><th>S</th>
<th>ืคืขื•ืœื•ืช</th>
</tr>
</thead>
<tbody id="users-tbody"></tbody>
</table>
</div>
</div>
<section class="card admin-section" id="user-detail-panel" hidden>
<div class="card-head">
<h2 class="card-title" id="detail-title">ื”ื™ืกื˜ื•ืจื™ื™ืช ื ื™ืชื•ื—ื™ื</h2>
<button class="btn btn-ghost btn-sm" id="detail-close-btn">ืกื’ื•ืจ</button>
</div>
<div id="user-detail-content"></div>
</section>
</section>
</main>
<script src="auth.js?v=11"></script>
<script src="admin.js?v=11"></script>
</body>
</html>