Spaces:
Sleeping
Sleeping
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"/> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"/> | |
| <title>Create Account — ICH Screening</title> | |
| <!-- Favicon --> | |
| <link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" /> | |
| <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-192.png') }}" /> | |
| <link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='apple-touch-icon.png') }}" /> | |
| <meta name="description" content="Register for the ICH Screening AI platform."/> | |
| <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=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"/> | |
| <link rel="stylesheet" href="{{ url_for('static', filename='css/base.css') }}"/> | |
| <link rel="stylesheet" href="{{ url_for('static', filename='css/auth.css') }}"/> | |
| </head> | |
| <body> | |
| <div class="auth-page"> | |
| <!-- ── Left brand panel ── --> | |
| <aside class="auth-brand"> | |
| <div class="auth-brand-logo"> | |
| <div class="auth-brand-icon"> | |
| <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> | |
| <path d="M22 12h-4l-3 9L9 3l-3 9H2"/> | |
| </svg> | |
| </div> | |
| <span class="auth-brand-name">ICH Screening</span> | |
| </div> | |
| <div class="auth-headline"> | |
| <h2>Start Your <span class="grad">AI Screening</span> Journey</h2> | |
| <p>Join clinicians and researchers using AI-powered CT analysis for faster, more accurate hemorrhage detection.</p> | |
| </div> | |
| <ul class="auth-features"> | |
| <li> | |
| <span class="feat-icon"> | |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg> | |
| </span> | |
| Free to get started — no credit card needed | |
| </li> | |
| <li> | |
| <span class="feat-icon"> | |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg> | |
| </span> | |
| Your scans are private and isolated | |
| </li> | |
| <li> | |
| <span class="feat-icon"> | |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="20" x2="18" y2="10"/><line x1="12" y1="20" x2="12" y2="4"/><line x1="6" y1="20" x2="6" y2="14"/></svg> | |
| </span> | |
| Full calibration metrics and PDF reports | |
| </li> | |
| <li> | |
| <span class="feat-icon"> | |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg> | |
| </span> | |
| AI results delivered in seconds | |
| </li> | |
| </ul> | |
| <!-- Scan-Complete Illustration --> | |
| <div class="auth-illustration"> | |
| <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg"> | |
| <defs> | |
| <radialGradient id="regGlow" cx="50%" cy="50%" r="50%"> | |
| <stop offset="0%" stop-color="#34d399" stop-opacity=".15"/> | |
| <stop offset="100%" stop-color="#34d399" stop-opacity="0"/> | |
| </radialGradient> | |
| <clipPath id="regClip"> | |
| <circle cx="100" cy="100" r="96"/> | |
| </clipPath> | |
| </defs> | |
| <!-- Scanner frame --> | |
| <circle cx="100" cy="100" r="96" fill="#07101f" stroke="#243356" stroke-width="2"/> | |
| <!-- Brain tissue layers --> | |
| <circle cx="100" cy="100" r="80" fill="#0b1f1a"/> | |
| <circle cx="100" cy="100" r="64" fill="#0d2420"/> | |
| <circle cx="100" cy="100" r="46" fill="#0f2822"/> | |
| <circle cx="100" cy="100" r="26" fill="#091a14"/> | |
| <!-- Layer stroke rings --> | |
| <circle cx="100" cy="100" r="80" stroke="#163830" stroke-width="1"/> | |
| <circle cx="100" cy="100" r="64" stroke="#1a4035" stroke-width=".75"/> | |
| <!-- Crosshair guide lines (clipped) --> | |
| <g clip-path="url(#regClip)" opacity=".2"> | |
| <line x1="4" y1="100" x2="196" y2="100" stroke="#34d399" stroke-width=".75"/> | |
| <line x1="100" y1="4" x2="100" y2="196" stroke="#34d399" stroke-width=".75"/> | |
| <line x1="29" y1="29" x2="171" y2="171" stroke="#34d399" stroke-width=".4"/> | |
| <line x1="171" y1="29" x2="29" y2="171" stroke="#34d399" stroke-width=".4"/> | |
| </g> | |
| <!-- Full scan ring (all 360° — scan complete) --> | |
| <circle cx="100" cy="100" r="80" fill="none" stroke="#34d399" stroke-width="1.5" opacity=".35"/> | |
| <!-- Cardinal tick marks (green = complete) --> | |
| <line x1="100" y1="4" x2="100" y2="14" stroke="#34d399" stroke-width="2" stroke-linecap="round" opacity=".8"/> | |
| <line x1="100" y1="186" x2="100" y2="196" stroke="#34d399" stroke-width="2" stroke-linecap="round" opacity=".8"/> | |
| <line x1="4" y1="100" x2="14" y2="100" stroke="#34d399" stroke-width="2" stroke-linecap="round" opacity=".8"/> | |
| <line x1="186" y1="100" x2="196" y2="100" stroke="#34d399" stroke-width="2" stroke-linecap="round" opacity=".8"/> | |
| <!-- Outer scanner ring overlay --> | |
| <circle cx="100" cy="100" r="96" fill="none" stroke="#34d399" stroke-width="1" opacity=".35"/> | |
| <!-- Center reticle circle --> | |
| <circle cx="100" cy="100" r="22" fill="rgba(52,211,153,.1)" stroke="#34d399" stroke-width="1.5"/> | |
| <circle cx="100" cy="100" r="32" stroke="#34d399" stroke-width=".75" fill="none" opacity=".2"/> | |
| <!-- Checkmark inside reticle --> | |
| <polyline points="89,100 97,109 114,88" | |
| stroke="#34d399" stroke-width="2.5" | |
| stroke-linecap="round" stroke-linejoin="round"/> | |
| <!-- Glow overlay --> | |
| <circle cx="100" cy="100" r="96" fill="url(#regGlow)"/> | |
| </svg> | |
| </div> | |
| </aside> | |
| <!-- ── Right form panel ── --> | |
| <main class="auth-form-panel"> | |
| <div class="auth-card"> | |
| <div class="auth-card-header"> | |
| <h2>Create your account</h2> | |
| <p>Takes less than a minute to get started</p> | |
| </div> | |
| {% with messages = get_flashed_messages(with_categories=true) %} | |
| {% if messages %} | |
| <div class="auth-alerts"> | |
| {% for category, message in messages %} | |
| <div class="alert alert-{{ category }}"> | |
| {% if category == 'error' %} | |
| <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg> | |
| {% else %} | |
| <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg> | |
| {% endif %} | |
| {{ message }} | |
| </div> | |
| {% endfor %} | |
| </div> | |
| {% endif %} | |
| {% endwith %} | |
| <form method="POST" class="auth-form" id="registerForm"> | |
| <!-- Username --> | |
| <div class="form-group"> | |
| <label for="username">Username</label> | |
| <div class="input-wrap"> | |
| <svg class="input-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg> | |
| <input type="text" id="username" name="username" required autofocus | |
| placeholder="3–80 chars, letters/numbers/-/_" autocomplete="username"/> | |
| </div> | |
| <span class="form-hint">Letters, numbers, hyphens and underscores only (3–80 characters)</span> | |
| </div> | |
| <!-- Email --> | |
| <div class="form-group"> | |
| <label for="email">Email</label> | |
| <div class="input-wrap"> | |
| <svg class="input-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg> | |
| <input type="email" id="email" name="email" required | |
| placeholder="your@email.com" autocomplete="email"/> | |
| </div> | |
| </div> | |
| <!-- Full Name (optional) --> | |
| <div class="form-group"> | |
| <label for="full_name">Full Name <span style="color:#3d5482;font-weight:500;text-transform:none;letter-spacing:0">(optional)</span></label> | |
| <div class="input-wrap"> | |
| <svg class="input-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg> | |
| <input type="text" id="full_name" name="full_name" | |
| placeholder="Dr. Jane Smith" autocomplete="name"/> | |
| </div> | |
| </div> | |
| <!-- Password --> | |
| <div class="form-group"> | |
| <label for="password">Password</label> | |
| <div class="input-wrap"> | |
| <svg class="input-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg> | |
| <input type="password" id="password" name="password" required | |
| class="has-toggle" placeholder="Min. 8 chars with uppercase, lowercase & number" autocomplete="new-password"/> | |
| <button type="button" class="btn-pw-toggle" id="togglePw" aria-label="Toggle password visibility"> | |
| <svg id="eyeIcon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg> | |
| </button> | |
| </div> | |
| <div class="pw-strength-bar"><div class="pw-strength-fill" id="pwBar"></div></div> | |
| <span class="pw-strength-text" id="pwText"></span> | |
| </div> | |
| <!-- Confirm Password --> | |
| <div class="form-group"> | |
| <label for="confirm_password">Confirm Password</label> | |
| <div class="input-wrap"> | |
| <svg class="input-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg> | |
| <input type="password" id="confirm_password" name="confirm_password" required | |
| class="has-toggle" placeholder="Re-enter your password" autocomplete="new-password"/> | |
| <button type="button" class="btn-pw-toggle" id="togglePw2" aria-label="Toggle confirm password"> | |
| <svg id="eyeIcon2" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg> | |
| </button> | |
| </div> | |
| </div> | |
| <button type="submit" class="btn-auth-submit">Create Account</button> | |
| </form> | |
| <div class="auth-footer"> | |
| Already have an account? <a href="{{ url_for('auth.login') }}">Sign in instead</a> | |
| </div> | |
| </div> | |
| </main> | |
| </div> | |
| <script src="{{ url_for('static', filename='js/auth-shared.js') }}" defer></script> | |
| <script src="{{ url_for('static', filename='js/register.js') }}" defer></script> | |
| </body> | |
| </html> | |