| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"/> |
| <meta name="viewport" content="width=device-width, initial-scale=1"/> |
| <title>Create Account β ICH Screening</title> |
| |
| <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"> |
|
|
| |
| <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> |
|
|
| |
| <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> |
|
|
| |
| <circle cx="100" cy="100" r="96" fill="#07101f" stroke="#243356" stroke-width="2"/> |
|
|
| |
| <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"/> |
|
|
| |
| <circle cx="100" cy="100" r="80" stroke="#163830" stroke-width="1"/> |
| <circle cx="100" cy="100" r="64" stroke="#1a4035" stroke-width=".75"/> |
|
|
| |
| <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> |
|
|
| |
| <circle cx="100" cy="100" r="80" fill="none" stroke="#34d399" stroke-width="1.5" opacity=".35"/> |
|
|
| |
| <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"/> |
|
|
| |
| <circle cx="100" cy="100" r="96" fill="none" stroke="#34d399" stroke-width="1" opacity=".35"/> |
|
|
| |
| <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"/> |
|
|
| |
| <polyline points="89,100 97,109 114,88" |
| stroke="#34d399" stroke-width="2.5" |
| stroke-linecap="round" stroke-linejoin="round"/> |
|
|
| |
| <circle cx="100" cy="100" r="96" fill="url(#regGlow)"/> |
| </svg> |
| </div> |
| </aside> |
|
|
| |
| <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"> |
| |
| <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> |
|
|
| |
| <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> |
|
|
| |
| <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> |
|
|
| |
| <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> |
|
|
| |
| <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> |
|
|