Nexus-ai / study.html
malek391's picture
Update study.html
696d5cf verified
Raw
History Blame Contribute Delete
50.8 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<script>
(function () {
try {
var t = localStorage.getItem("nexus_theme");
if (!t) {
t = "light";
localStorage.setItem("nexus_theme", "light");
}
document.documentElement.setAttribute("data-theme", t);
} catch (e) {
document.documentElement.setAttribute("data-theme", "light");
}
document.documentElement.setAttribute("data-nexus-bg", "plain");
try {
var vp = localStorage.getItem("nexus_visual_performance");
if (vp === "reduced") {
vp = "full";
localStorage.setItem("nexus_visual_performance", "full");
}
if (!vp) vp = localStorage.getItem("nexus_fast_mode") === "on" ? "max" : "full";
if (vp !== "full" && vp !== "max") vp = "full";
document.documentElement.setAttribute("data-visual-performance", vp);
document.documentElement.setAttribute("data-fast-mode", vp === "max" ? "on" : "off");
} catch (e2) {}
try {
var tr = localStorage.getItem("nexus_trail_preset") || "default";
if (tr && tr !== "default") document.documentElement.setAttribute("data-trail-preset", tr);
else document.documentElement.removeAttribute("data-trail-preset");
} catch (e3) {}
try {
var hp = localStorage.getItem("nexus_hover_preset") || "default";
if (hp === "magneta") hp = "magenta";
if (hp && hp !== "default") document.documentElement.setAttribute("data-hover-preset", hp);
else document.documentElement.removeAttribute("data-hover-preset");
} catch (e4) {}
try {
var ap = localStorage.getItem("nexus_atom_preset") || "default";
if (ap === "magneta") ap = "magenta";
if (ap && ap !== "default") document.documentElement.setAttribute("data-atom-preset", ap);
else document.documentElement.removeAttribute("data-atom-preset");
} catch (e5) {}
try {
var fsz = localStorage.getItem("nexus_font_size");
if (!fsz) fsz = "small";
if (fsz !== "very-small" && fsz !== "small" && fsz !== "medium" && fsz !== "large") fsz = "small";
document.documentElement.setAttribute("data-font-size", fsz);
} catch (e6) {}
})();
</script>
<title>Nexus AI — The Intelligent Study Crew</title>
<link rel="icon" href="/favicon.ico" type="image/png" sizes="any" />
<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=Plus+Jakarta+Sans:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" crossorigin="anonymous" onerror="this.onerror=null;this.href='/static/vendor/katex.min.css'" />
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js" onerror="this.onerror=null;this.src='/static/vendor/marked.min.js'"></script>
<script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js" crossorigin="anonymous" onerror="this.onerror=null;this.src='/static/vendor/katex.min.js'"></script>
<script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" crossorigin="anonymous" onerror="this.onerror=null;this.src='/static/vendor/auto-render.min.js'"></script>
<script src="https://cdn.jsdelivr.net/npm/@emailjs/browser@4/dist/email.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<script src="https://accounts.google.com/gsi/client" async defer></script>
<script>
window.EMAILJS_PUBLIC_KEY = "{{EMAILJS_PUBLIC_KEY}}";
window.EMAILJS_SERVICE_ID = "{{EMAILJS_SERVICE_ID}}";
window.EMAILJS_TEMPLATE_ID = "{{EMAILJS_TEMPLATE_ID}}";
window.EMAILJS_RESET_TEMPLATE_ID = "{{EMAILJS_RESET_TEMPLATE_ID}}";
window.NEXUS_BLOB_ENABLED = false;
window.NEXUS_GOOGLE_CLIENT_ID = "{{GOOGLE_OAUTH_CLIENT_ID}}";
</script>
</head>
<body data-nexus-page="study" data-current-view="study" data-user-logged-in="false">
<canvas id="bg-canvas"></canvas>
<div id="bg-ambient" class="bg-ambient" aria-hidden="true">
<span class="bg-ambient-spin" aria-hidden="true"></span>
</div>
<div id="root" class="nexus-loading">
<header id="app-header" class="app-header app-header--study-glass">
<div class="app-header-brand-wrap">
<button type="button" id="study-app-sidebar-toggle" class="study-appbar-hamburger clean-hover" aria-label="Toggle study sidebar" aria-expanded="true" title="Menu">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16"/></svg>
</button>
<div class="header-atom assistant-atom atom-3d" aria-hidden="true">
<span class="atom-nucleus"></span>
<span class="atom-ring ring-x"><span class="atom-electron"></span></span>
<span class="atom-ring ring-y"><span class="atom-electron"></span></span>
<span class="atom-ring ring-z"><span class="atom-electron"></span></span>
</div>
<div class="app-header-brand">Nexus AI</div>
</div>
<nav class="header-center-nav" aria-label="Site pages">
<a href="/" id="header-home-btn" class="header-nav-pill clean-hover header-landing-bar-mobile-hide" title="Landing page">Landing Page</a>
<span class="header-nav-pill header-nav-pill--current header-loggedin-only" id="header-study-btn" title="Study hub">Study</span>
<a href="/about" class="header-nav-pill clean-hover header-nav--desktop-only" title="About Nexus AI">About Us</a>
<a href="/pricing" class="header-nav-pill clean-hover header-nav--desktop-only" title="Pricing and plans">Plans</a>
<div class="nexus-header-dropdown header-more-wrap header-nav--mobile-only">
<button type="button" id="header-more-btn" class="header-nav-pill header-more-btn clean-hover" aria-expanded="false" aria-haspopup="true" aria-controls="header-mobile-dropdown" title="More">
More
<svg class="header-more-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
</button>
<div id="header-mobile-dropdown" class="header-mobile-dropdown nexus-header-dropdown-panel" role="menu" aria-label="More navigation">
<button type="button" id="header-dropdown-landing-btn" class="header-mobile-dropdown-item header-mobile-dropdown-btn header-loggedin-only" role="menuitem">Landing Page</button>
<a href="/study" class="header-mobile-dropdown-item" role="menuitem">Study</a>
<a href="/flashcards" class="header-mobile-dropdown-item header-loggedin-only" role="menuitem">Flashcards</a>
<a href="/quiz" class="header-mobile-dropdown-item header-loggedin-only" role="menuitem">Quiz</a>
<a href="/about" class="header-mobile-dropdown-item" role="menuitem">About Us</a>
<a href="/pricing" class="header-mobile-dropdown-item" role="menuitem">Plans</a>
<button type="button" class="header-mobile-dropdown-item header-mobile-dropdown-btn header-loggedout-only" role="menuitem" id="header-mobile-auth-btn">Login/SignUp</button>
</div>
</div>
</nav>
<div class="app-header-end app-header-auth">
<button type="button" id="header-theme-toggle" class="header-icon-btn header-theme-toggle clean-hover" aria-label="Toggle light or dark theme" title="Theme">
<svg class="nexus-theme-icon-sun" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg class="nexus-theme-icon-moon hidden" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
</button>
</div>
</header>
<div id="nexus-command-palette" class="nexus-command-palette hidden" aria-hidden="true">
<div class="nexus-command-palette-inner">
<label class="nexus-command-label" for="nexus-command-input"><span class="nexus-command-prompt" aria-hidden="true">nexus@ai</span><span class="nexus-command-dollar">$</span></label>
<input type="text" id="nexus-command-input" class="nexus-command-input" autocomplete="off" spellcheck="false" aria-autocomplete="list" aria-controls="nexus-command-dropdown" aria-label="Command line" />
</div>
<p id="nexus-command-feedback" class="nexus-command-feedback" aria-live="polite"></p>
<div id="nexus-command-dropdown" class="nexus-command-dropdown hidden" role="listbox" aria-label="Suggestions">
<div class="nexus-command-dd-head">
<span class="nexus-command-dd-header"></span>
<span class="nexus-command-dd-type"></span>
</div>
<p class="nexus-command-dd-desc"></p>
<ul class="nexus-command-dd-list"></ul>
</div>
</div>
<div id="study-area" class="study-page-embed" aria-hidden="false">
<div class="study-shell">
<header class="study-chrome-header">
<button type="button" id="study-sidebar-toggle" class="study-panel-toggle clean-hover" aria-label="Show or hide study sidebar" aria-expanded="true" title="Sidebar">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16"/></svg>
</button>
<span class="study-chrome-title">Study hub</span>
<div class="study-chrome-end">
<button type="button" id="study-bar-theme" class="header-icon-btn study-bar-theme clean-hover" aria-label="Toggle theme" title="Theme">
<svg class="nexus-theme-icon-sun study-bar-theme-sun" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg class="nexus-theme-icon-moon study-bar-theme-moon hidden" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
</button>
<button type="button" id="study-close" class="study-close-soft clean-hover" aria-label="Close study hub" title="Close study hub"><span class="study-close-label">Close</span></button>
</div>
</header>
<div class="study-layout">
<aside id="study-sidebar-panel" class="study-sidebar" aria-label="Study sidebar">
<div class="study-sidebar-brand-row">
<span class="study-brand-atom assistant-atom atom-3d" aria-hidden="true">
<span class="atom-nucleus"></span>
<span class="atom-ring ring-x"><span class="atom-electron"></span></span>
<span class="atom-ring ring-y"><span class="atom-electron"></span></span>
<span class="atom-ring ring-z"><span class="atom-electron"></span></span>
</span>
<span class="study-brand-text">Study</span>
</div>
<button type="button" id="btn-new-chat" class="study-btn-new-chat clean-hover" title="Start a new chat conversation">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
New conversation
</button>
<div class="study-quick-links" role="group" aria-label="Study tools">
<a href="/flashcards" class="study-quick-link clean-hover" id="study-link-flashcards" title="Open flashcard decks">Flashcards</a>
<a href="/quiz" class="study-quick-link clean-hover" id="study-link-quiz" title="Open practice quizzes">Quiz</a>
</div>
<div class="study-sidebar-scroll">
<div id="study-sidebar-search-block" class="study-sidebar-extra-block">
<div class="study-section-label">Search conversations</div>
<div class="study-sidebar-search">
<svg class="study-search-icon" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
<input type="text" id="study-convo-search" class="study-search-input" placeholder="Filter conversation history…" autocomplete="off" />
</div>
</div>
<div class="study-section-label">Conversation history</div>
<div id="study-sidebar-conversations" class="study-conversations-list dash-conversations"></div>
<div id="study-sidebar-decks" class="study-sidebar-extra-block">
<div class="study-section-label">Flashcard decks</div>
<div id="study-sets-list" class="study-sets-list"></div>
</div>
</div>
<div class="study-sidebar-footer">
<div class="study-sidebar-stats study-sidebar-extra-block">
<div class="study-stat"><span id="study-stat-sets" class="study-stat-num">0</span><span class="study-stat-label">Decks</span></div>
<div class="study-stat"><span id="study-stat-cards" class="study-stat-num">0</span><span class="study-stat-label">Cards</span></div>
</div>
<div class="study-sidebar-footer-actions">
<button type="button" id="study-view-plans" class="study-footer-link-btn" title="View subscription plans">View plans</button>
<button type="button" id="btn-settings" class="study-footer-link-btn study-footer-link-btn--settings" title="Open settings">Settings</button>
</div>
</div>
</aside>
<main class="study-main">
<div class="study-main-inner">
<div id="study-welcome" class="study-welcome">
<div class="study-welcome-glow" aria-hidden="true"></div>
<div class="study-welcome-content">
<div class="study-welcome-icon-wrap">
<span class="study-welcome-icon-ring" aria-hidden="true"></span>
<div class="study-welcome-icon" aria-hidden="true">
<svg width="36" height="36" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M2 3h6a4 4 0 014 4v14a3 3 0 00-3-3H2z"/><path d="M22 3h-6a4 4 0 00-4 4v14a3 3 0 013-3h7z"/></svg>
</div>
</div>
<h2>Study with Nexus AI</h2>
<p>Your hub for decks, quizzes, and the study tutor.</p>
<div id="study-discover-blocks" class="study-discover-blocks" aria-live="polite">
<p class="study-hub-label">Quick actions</p>
<div class="study-quick-actions">
<button type="button" id="study-action-flashcards" class="study-action-tile" title="Create flashcards from chat">
<span class="study-action-icon" aria-hidden="true">
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="4" y="4" width="16" height="20" rx="2"/><path d="M8 2v4M16 2v4"/><path d="M4 10h16"/></svg>
</span>
<span class="study-action-title">Create flashcards</span>
<span class="study-action-desc">Describe a topic in chat — we’ll build a deck.</span>
</button>
<button type="button" id="study-action-quiz" class="study-action-tile" title="Take a generated quiz">
<span class="study-action-icon study-action-icon-quiz" aria-hidden="true">
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2"/><path d="M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/><path d="M9 12l2 2 4-4"/></svg>
</span>
<span class="study-action-title">Take a quiz</span>
<span class="study-action-desc">Generate a practice quiz on any topic.</span>
</button>
</div>
<p class="study-hub-label study-hub-label-topics">Popular topics</p>
<div class="study-topic-cards">
<button type="button" class="study-topic-card" title="Use this topic in chat">WW3</button>
<button type="button" class="study-topic-card" title="Use this topic in chat">Egyptian history</button>
<button type="button" class="study-topic-card" title="Use this topic in chat">Photosynthesis</button>
<button type="button" class="study-topic-card" title="Use this topic in chat">World War II</button>
<button type="button" class="study-topic-card" title="Use this topic in chat">Derivatives</button>
<button type="button" class="study-topic-card" title="Use this topic in chat">Python basics</button>
</div>
</div>
</div>
</div>
<div id="study-carousel-wrap" class="study-carousel-wrap hidden">
<div class="study-carousel-header">
<h3 id="study-deck-title" class="study-deck-title">Deck</h3>
<span id="study-card-counter" class="study-card-counter">0 / 0</span>
</div>
<div class="study-carousel-body">
<button type="button" id="study-nav-prev" class="study-carousel-nav study-nav-prev" aria-label="Previous card" title="Previous card">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 18l-6-6 6-6"/></svg>
</button>
<div id="study-carousel" class="study-carousel"></div>
<button type="button" id="study-nav-next" class="study-carousel-nav study-nav-next" aria-label="Next card" title="Next card">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18l6-6-6-6"/></svg>
</button>
</div>
<div id="study-carousel-dots" class="study-carousel-dots"></div>
</div>
<div class="study-chat-area" id="chat-input-area">
<div class="chat-file-drop-overlay" aria-hidden="true">
<div class="chat-file-drop-overlay__icon"></div>
<span>Drop files to attach</span>
</div>
<div id="chat-attachments" class="chat-attachments"></div>
<div id="chat-messages" class="study-chat-messages chat-messages"></div>
<div class="study-chat-composer-column">
<div class="nexus-youtube-tool" id="nexus-youtube-tool">
<button
type="button"
class="nexus-yt-toggle clean-hover"
id="nexus-yt-toggle"
aria-expanded="false"
aria-controls="nexus-yt-panel"
>
<span class="nexus-yt-toggle-icon" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 24 24" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="4" width="23" height="16" rx="3.2" fill="#FF0000" />
<path d="M9.5 8.5v7L17 12z" fill="#ffffff" />
</svg>
</span>
<span class="nexus-yt-toggle-label">YouTube</span>
<svg class="nexus-yt-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
</button>
<div class="nexus-yt-panel" id="nexus-yt-panel" role="region" aria-label="YouTube link" hidden>
<label class="nexus-yt-label" for="nexus-yt-url">Video link</label>
<input
type="url"
id="nexus-yt-url"
class="nexus-yt-url-input"
placeholder="https://www.youtube.com/watch?v=…"
inputmode="url"
autocomplete="off"
spellcheck="false"
/>
<div class="nexus-yt-actions">
<button type="button" class="nexus-yt-open-web clean-hover" id="nexus-yt-open-web" title="Open this video on YouTube">
Open YouTube
</button>
<button type="button" class="nexus-yt-copy clean-hover" id="nexus-yt-copy" title="Copy watch link">
Copy link
</button>
</div>
<p class="nexus-yt-hint">
Paste a link here, type what you want below (e.g. summarize, teach, quiz), then send. If the main box mentions a different video than the field, the message’s link is used for that turn.
</p>
</div>
</div>
<div class="study-chat-input-row">
<div class="study-chat-input-wrap" id="chat-input-wrap">
<button type="button" id="btn-upload" class="study-upload-btn clean-hover" aria-label="Attach PDF, image, audio, or video" title="Upload PDF, images, MP3, MP4, or other common video formats">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><rect x="4" y="4" width="16" height="16" rx="2"/><path d="M12 8v8M8 12h8"/></svg>
</button>
<input type="file" id="file-input" accept=".pdf,application/pdf,.png,.jpg,.jpeg,.gif,.webp,.heic,.heif,image/*,image/heic,image/heic-sequence,video/*,audio/*,.mp3,.mp4,.mov,.webm,.m4v,.mkv,.mpeg,.mpg,.avi,.3gp,.wmv,.ogv,.f4v" multiple hidden />
<input type="text" id="chat-input" class="study-chat-input chat-input" placeholder="What should Nexus do? (e.g. summarize, teach, explain)…" autocomplete="off" />
<button type="button" id="chat-send" class="study-send-btn clean-hover chat-input-btn" aria-label="Send message" title="Send">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</button>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</div>
</div>
<!-- ============ ABOUT US MODAL ============ -->
<div id="modal-about" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-about-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass modal-about-card">
<h2 id="modal-about-title">About Nexus AI</h2>
<p class="modal-about-subhead">Empowering Developers to Dream and Build</p>
<div class="modal-about-body">
<p>Nexus AI was born from a simple belief: every developer deserves intelligent tools that amplify their creativity rather than replace it. Our platform combines cutting-edge language models with deep code understanding to deliver a seamless, context-aware coding companion.</p>
<p>From solo learners to enterprise teams, we provide the AI infrastructure that makes writing, refactoring, and shipping code faster, safer, and more enjoyable. Our mission is to lower the barrier to great software&mdash;one commit at a time.</p>
</div>
<div class="modal-actions">
<button type="button" id="modal-about-close" class="primary-btn clean-hover">Close</button>
</div>
</div>
</div>
<div id="auth-modal" class="modal" role="dialog" aria-modal="true" aria-labelledby="auth-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass auth-modal-card">
<div class="auth-aurora-clip" aria-hidden="true">
<canvas id="auth-aurora-canvas" class="auth-aurora-canvas"></canvas>
</div>
<div id="auth-panel" class="auth-panel-inner">
<h2 id="auth-title">Welcome to Nexus AI</h2>
<p class="modal-note">Log in or sign up to continue.</p>
<div class="auth-tabs">
<button type="button" class="auth-tab active" data-mode="login">Login</button>
<button type="button" class="auth-tab" data-mode="signup">Sign up</button>
</div>
<form id="auth-form" class="auth-form">
<div id="auth-signup-names" class="auth-names-row hidden">
<input type="text" id="auth-first-name" placeholder="First name" autocomplete="given-name" />
<input type="text" id="auth-second-name" placeholder="Second name" autocomplete="family-name" />
</div>
<div id="auth-country-wrap" class="hidden">
<span class="auth-country-label" id="auth-country-label-text">Choose a country:</span>
<p id="auth-country-error" class="auth-country-error hidden" role="alert"></p>
<div class="auth-country-select-shell" id="auth-country-root">
<select id="country" class="auth-country-native-select" name="country" autocomplete="country" tabindex="-1" aria-hidden="true">
<option value="" selected disabled data-flag="" data-label="">Select a country</option>
</select>
<button
type="button"
id="auth-country-trigger"
class="auth-country-custom-trigger"
aria-haspopup="listbox"
aria-expanded="false"
aria-controls="auth-country-dropdown"
aria-labelledby="auth-country-label-text auth-country-trigger-label"
>
<span id="auth-country-trigger-label" class="auth-country-custom-text is-placeholder">Select a country</span>
<span class="auth-country-select-chevron" aria-hidden="true">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
</span>
</button>
<div id="auth-country-dropdown" class="auth-country-dropdown hidden" role="listbox" aria-labelledby="auth-country-label-text">
<div class="auth-country-dropdown-search-wrap">
<input
type="search"
id="auth-country-search"
class="auth-country-dropdown-search"
placeholder="Search countries…"
autocomplete="off"
aria-label="Search countries"
/>
</div>
<div id="auth-country-options" class="auth-country-dropdown-options"></div>
</div>
</div>
</div>
<input type="email" id="auth-email" placeholder="Email" required autocomplete="email" />
<div class="auth-password-wrap">
<input type="password" id="auth-password" placeholder="Password (min 6)" required autocomplete="current-password" minlength="6" />
<button type="button" id="auth-password-toggle" class="auth-password-toggle" aria-label="Show password">
<svg class="icon-eye" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><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>
<svg class="icon-eye-off hidden" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/></svg>
</button>
</div>
<label class="auth-remember-row" id="auth-remember-row">
<input type="checkbox" id="auth-remember-me" checked />
<span>Remember me</span>
</label>
<div id="auth-forgot-block" class="auth-forgot-block">
<p class="auth-forgot-row" id="auth-forgot-row">
<button type="button" id="auth-forgot-trigger" class="auth-forgot-link clean-hover">Forgot password?</button>
</p>
<div id="auth-forgot-panel" class="auth-forgot-panel hidden">
<p id="auth-forgot-intro" class="modal-note">We’ll email you a link to set a new password.</p>
<button type="button" id="auth-forgot-submit" class="primary-btn clean-hover">Send reset link</button>
<button type="button" id="auth-forgot-resend" class="secondary-btn clean-hover hidden" aria-label="Resend reset email">Resend email</button>
<button type="button" id="auth-forgot-back" class="secondary-btn clean-hover">Back to login</button>
<p id="auth-forgot-status" class="status-text" role="status"></p>
</div>
</div>
<button type="submit" id="auth-submit" class="primary-btn clean-hover">Continue</button>
</form>
<p id="auth-error" class="status-text"></p>
<div class="auth-social-divider"><span>or continue with</span></div>
<div class="auth-social-row auth-social-row-single">
<button type="button" id="auth-google-btn" class="auth-social-btn auth-google-btn" title="Continue with Google">
<svg width="20" height="20" viewBox="0 0 24 24"><path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4"/><path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/><path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/><path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/></svg>
<span>Continue with Google</span>
</button>
</div>
</div>
<div id="verify-panel" class="hidden auth-panel-inner">
<h2>Verify your email</h2>
<p id="verify-email-display" class="modal-note"></p>
<div id="otp-grid" class="otp-grid">
<input type="text" class="otp-input" inputmode="numeric" maxlength="1" />
<input type="text" class="otp-input" inputmode="numeric" maxlength="1" />
<input type="text" class="otp-input" inputmode="numeric" maxlength="1" />
<input type="text" class="otp-input" inputmode="numeric" maxlength="1" />
<input type="text" class="otp-input" inputmode="numeric" maxlength="1" />
<input type="text" class="otp-input" inputmode="numeric" maxlength="1" />
</div>
<div class="verify-actions">
<button type="button" id="verify-submit" class="primary-btn clean-hover">Verify</button>
<button type="button" id="verify-resend" class="secondary-btn clean-hover">Resend code</button>
<button type="button" id="verify-back" class="secondary-btn clean-hover">Back</button>
</div>
<p id="verify-error" class="status-text"></p>
</div>
</div>
</div>
<div id="modal-new-convo" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-new-convo-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass">
<h2 id="modal-new-convo-title">New conversation</h2>
<input type="text" id="modal-new-convo-name" class="modal-input" placeholder="Name (optional — auto after 5 messages)" maxlength="80" title="Leave blank to auto-name from your topic after five messages" />
<div class="modal-actions">
<button type="button" id="modal-new-convo-cancel" class="secondary-btn clean-hover">Cancel</button>
<button type="button" id="modal-new-convo-confirm" class="primary-btn clean-hover">Create</button>
</div>
</div>
</div>
<div id="modal-delete-convo" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-delete-convo-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass">
<h2 id="modal-delete-convo-title">Delete conversation?</h2>
<p id="modal-delete-convo-message" class="modal-note">This action cannot be undone.</p>
<div class="modal-actions">
<button type="button" id="modal-delete-convo-cancel" class="secondary-btn clean-hover">Cancel</button>
<button type="button" id="modal-delete-convo-confirm" class="danger-btn clean-hover">Delete</button>
</div>
</div>
</div>
<div id="modal-bulk-delete-convos" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-bulk-delete-convos-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass">
<h2 id="modal-bulk-delete-convos-title">Delete selected conversations?</h2>
<p id="modal-bulk-delete-convos-message" class="modal-note">This will permanently remove the selected chats. This cannot be undone.</p>
<div class="modal-actions">
<button type="button" id="modal-bulk-delete-convos-cancel" class="secondary-btn clean-hover">Cancel</button>
<button type="button" id="modal-bulk-delete-convos-confirm" class="danger-btn clean-hover">Delete all selected</button>
</div>
</div>
</div>
<div id="modal-rename-convo" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-rename-convo-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass">
<h2 id="modal-rename-convo-title">Rename conversation</h2>
<input type="text" id="modal-rename-convo-name" class="modal-input" placeholder="New name" maxlength="80" />
<div class="modal-actions">
<button type="button" id="modal-rename-convo-cancel" class="secondary-btn clean-hover">Cancel</button>
<button type="button" id="modal-rename-convo-confirm" class="primary-btn clean-hover">Rename</button>
</div>
</div>
</div>
<div id="modal-settings" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-settings-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass">
<h2 id="modal-settings-title">Settings</h2>
<p class="modal-note">Customize account, identity, and appearance.</p>
<div class="settings-sections">
<div class="settings-section">
<label class="settings-row">
<span>Font size</span>
<select id="settings-font-size" class="settings-select">
<option value="very-small">Very small</option>
<option value="small" selected>Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
</select>
</label>
<label class="settings-row">
<span>Reading mode</span>
<select id="settings-reading-mode" class="settings-select">
<option value="off">Off</option>
<option value="on">On (wider bubbles, smaller text)</option>
</select>
</label>
<label class="settings-row">
<span>Theme</span>
<select id="settings-theme" class="settings-select" title="Light or dark appearance">
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</label>
<label class="settings-row">
<span>Visual performance</span>
<select id="settings-visual-performance" class="settings-select">
<option value="full">Full (default animations)</option>
<option value="max">Maximum (minimal motion &amp; effects; best for lag)</option>
</select>
</label>
</div>
<div class="settings-section">
<h3 class="settings-section-title">Speak</h3>
<p class="settings-hint">Speech uses Gemini TTS on the server. Language follows your text automatically unless you turn auto-detect off.</p>
<label class="settings-row settings-row-checkbox">
<span>Auto-detect speak language</span>
<input type="checkbox" id="settings-tts-voice-auto" class="settings-checkbox" checked />
</label>
<label class="settings-row" id="settings-tts-lang-row">
<span>Manual voice language</span>
<select id="settings-tts-voice-lang" class="settings-select">
<option value="en">English</option>
<option value="ar">Arabic</option>
<option value="fr">French</option>
<option value="es">Spanish</option>
<option value="de">German</option>
<option value="hi">Hindi</option>
<option value="pt">Portuguese</option>
<option value="it">Italian</option>
</select>
</label>
<label class="settings-row">
<span>Voice gender</span>
<select id="settings-tts-voice-gender" class="settings-select" title="Used for Gemini TTS and browser fallback">
<option value="auto">Auto (server default)</option>
<option value="female">Female</option>
<option value="male">Male</option>
</select>
</label>
</div>
<div class="settings-section" id="settings-subscription">
<h3 class="settings-section-title">Manage subscription</h3>
<p class="settings-hint">Pick a plan or change your subscription on the checkout page.</p>
<div class="settings-plan-row">
<a class="settings-plan-link" href="/buy.html?plan=basic">Basic</a>
<a class="settings-plan-link settings-plan-link-featured" href="/buy.html?plan=standard">Standard</a>
<a class="settings-plan-link" href="/buy.html?plan=premium">Premium</a>
</div>
<button type="button" id="settings-open-plans-landing" class="secondary-btn clean-hover settings-plans-cta">Compare all plans</button>
</div>
<div class="settings-section">
<h3 class="settings-section-title">Account</h3>
<div class="settings-grid">
<button type="button" id="settings-hide-email" class="secondary-btn clean-hover">Hide email</button>
<button type="button" id="settings-hide-avatar" class="secondary-btn clean-hover">Hide avatar</button>
</div>
</div>
<div class="settings-section">
<h3 class="settings-section-title">Data</h3>
<div class="settings-grid">
<button type="button" id="settings-clear-chat" class="secondary-btn clean-hover">Clear chat view</button>
<button type="button" id="settings-export-session" class="secondary-btn clean-hover">Export session (.txt)</button>
<button type="button" id="settings-delete-account" class="danger-btn clean-hover">Delete my account and all data</button>
</div>
<p class="settings-hint">Deleting your account removes your profile, conversations, and saved progress. This cannot be undone.</p>
</div>
</div>
<div class="modal-actions">
<button type="button" id="settings-logout" class="danger-btn settings-logout-btn neon-red-logout">Log out</button>
<button type="button" id="settings-close" class="primary-btn clean-hover">Close</button>
</div>
</div>
</div>
<div id="modal-quiz" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-quiz-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass quiz-modal-card">
<div class="modal-quiz-head">
<h2 id="modal-quiz-title">Quiz generator</h2>
<button type="button" id="quiz-close" class="modal-quiz-x" aria-label="Close quiz">×</button>
</div>
<div id="quiz-setup-panel">
<div class="quiz-topic-section">
<label class="quiz-section-label" for="quiz-topic">Topic</label>
<input type="text" id="quiz-topic" class="modal-input quiz-topic-input" placeholder="Topic, or a YouTube URL — we load the video and quiz you on that content" autocomplete="off" />
<div class="quiz-upload-row">
<button type="button" id="quiz-upload-btn" class="secondary-btn clean-hover quiz-upload-btn-inline">Upload file</button>
<input type="file" id="quiz-file-input" accept=".pdf,application/pdf,.png,.jpg,.jpeg,.gif,.webp" hidden />
<span id="quiz-file-name" class="quiz-file-label"></span>
</div>
</div>
<div class="quiz-type-section">
<span class="quiz-section-label">Question types</span>
<div class="quiz-type-grid" id="quiz-type-grid">
<label class="quiz-chip"><input type="checkbox" name="quiz-type" value="correct-answer" checked /><span>Multiple choice</span></label>
<label class="quiz-chip"><input type="checkbox" name="quiz-type" value="true-false" /><span>True / false</span></label>
<label class="quiz-chip"><input type="checkbox" name="quiz-type" value="complete" /><span>Fill in the blank</span></label>
<label class="quiz-chip"><input type="checkbox" name="quiz-type" value="scientific-term" /><span>Scientific term</span></label>
<label class="quiz-chip"><input type="checkbox" name="quiz-type" value="short-answer" /><span>Short answer</span></label>
<label class="quiz-chip"><input type="checkbox" name="quiz-type" value="matching" /><span>Matching</span></label>
</div>
</div>
<div class="quiz-count-section">
<span class="quiz-section-label">Number of questions</span>
<div id="quiz-count-row" class="quiz-count-row">
<button type="button" class="quiz-count-btn" data-count="5">5</button>
<button type="button" class="quiz-count-btn" data-count="10">10</button>
<button type="button" class="quiz-count-btn active" data-count="20">20</button>
<button type="button" class="quiz-count-btn" data-count="30">30</button>
<button type="button" class="quiz-count-btn quiz-count-ai" data-count="ai">AI picks</button>
</div>
</div>
<button type="button" id="quiz-generate" class="primary-btn clean-hover quiz-generate-btn nexus-btn-primary-gradient">Generate quiz</button>
</div>
<div id="quiz-loading" class="quiz-loading hidden">
<div class="quiz-loading-atom assistant-atom atom-3d" aria-hidden="true">
<span class="atom-nucleus"></span>
<span class="atom-ring ring-x"><span class="atom-electron"></span></span>
<span class="atom-ring ring-y"><span class="atom-electron"></span></span>
</div>
<p>Generating your quiz…</p>
</div>
<div id="quiz-display" class="quiz-display hidden"></div>
<div id="quiz-results" class="quiz-results hidden"></div>
<div class="quiz-modal-actions">
<button type="button" id="quiz-submit" class="primary-btn clean-hover hidden nexus-btn-primary-gradient">Submit answers</button>
<button type="button" id="quiz-retry" class="secondary-btn clean-hover hidden">Try again</button>
</div>
</div>
</div>
<div id="modal-delete-account" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-delete-account-title">
<div class="modal-backdrop"></div>
<div class="modal-card glass modal-delete-account-card">
<h2 id="modal-delete-account-title">Delete account permanently</h2>
<p class="modal-note">
This permanently deletes your profile, conversations, and saved data. This action cannot be undone.
</p>
<label for="modal-delete-account-input" class="modal-note">
Type <strong>DELETE MY ACCOUNT</strong> to confirm:
</label>
<input
type="text"
id="modal-delete-account-input"
class="modal-input"
placeholder="DELETE MY ACCOUNT"
autocomplete="off"
spellcheck="false"
/>
<p id="modal-delete-account-error" class="modal-note hidden" role="alert"></p>
<div class="modal-actions">
<button type="button" id="modal-delete-account-cancel" class="secondary-btn clean-hover">Cancel</button>
<button type="button" id="modal-delete-account-confirm" class="danger-btn clean-hover" disabled>Delete account</button>
</div>
</div>
</div>
<button type="button" id="admin-monitor-fab" class="admin-monitor-fab hidden" aria-label="Open admin monitor" title="Developer monitor"></button>
<div id="admin-monitor" class="admin-monitor admin-monitor--fabbed hidden" aria-label="Admin Monitor">
<div id="admin-monitor-handle" class="admin-monitor-handle">
<span>Admin Monitor</span>
<button type="button" id="admin-monitor-close" aria-label="Close monitor">×</button>
</div>
<div class="admin-monitor-body">
<div class="admin-stat"><span>Thinking Timer</span><strong id="admin-thinking-seconds">0.00s</strong></div>
<div class="admin-stat"><span>File Status</span><strong id="admin-file-status">N/A</strong></div>
<div class="admin-stat"><span>File Error</span><strong id="admin-file-error">-</strong></div>
<div class="admin-stat"><span>Active Users</span><strong id="admin-active-users">0</strong></div>
<div class="admin-stat"><span>Total Users</span><strong id="admin-total-users">0</strong></div>
<div class="admin-stat"><span>API Latency</span><strong id="admin-api-latency">0ms</strong></div>
<div class="admin-stat"><span>Quiz Submit</span><strong id="admin-quiz-submit">idle</strong></div>
<div class="admin-stat"><span>KV Storage</span><strong id="admin-kv-status">unknown</strong></div>
<div class="admin-stat"><span>KV Error</span><strong id="admin-kv-error">-</strong></div>
<div class="admin-stat admin-blob-block">
<span>Blob (client)</span>
<strong id="admin-blob-client-error" class="admin-blob-client-error" title="">-</strong>
</div>
<div class="admin-stat"><span>Gemini last err</span><strong id="admin-gemini-error" class="admin-gemini-error" title="">-</strong></div>
<div class="admin-stat admin-stat-wide"><span>Gemini Files API</span><strong id="admin-gemini-compress" class="admin-gemini-compress" title="">-</strong></div>
<div class="admin-stat"><span>Secret Key</span><strong id="admin-secret-key-status">unknown</strong></div>
<div class="admin-stat admin-tts-block">
<span>Gemini TTS</span>
<strong id="admin-tts-status">idle</strong>
<span class="admin-tts-error-label">Last error:</span>
<strong id="admin-tts-error" class="admin-tts-error" title="">-</strong>
<span class="admin-tts-error-label">Detail:</span>
<strong id="admin-tts-detail" class="admin-tts-error" title="">-</strong>
</div>
<div id="admin-activity-feed" class="admin-activity-feed"></div>
</div>
<div id="admin-monitor-resize" class="admin-monitor-resize" aria-hidden="true"></div>
</div>
</div>
<div id="account-created-overlay" class="account-created-overlay hidden" aria-live="polite" aria-hidden="true">
<div class="account-created-inner">
<div class="account-created-mark-wrap">
<svg class="account-created-svg" viewBox="0 0 120 120" aria-hidden="true">
<circle class="account-created-circle" cx="60" cy="60" r="44" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" />
<path class="account-created-check" fill="none" stroke="currentColor" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" d="M38 62 L54 78 L86 46" />
</svg>
</div>
<p class="account-created-title">Account created</p>
</div>
</div>
<div id="nexus-theme-transition" class="nexus-theme-transition" aria-hidden="true">
<div class="nexus-theme-transition__bg" aria-hidden="true"></div>
<div class="nexus-theme-transition__orb" aria-hidden="true">
<svg class="nexus-theme-transition__svg" viewBox="0 0 120 120" aria-hidden="true">
<g class="nexus-theme-transition__sun" fill="none" stroke-width="3" stroke-linecap="round">
<circle cx="60" cy="60" r="18" fill="#fff" stroke="#0f172a" />
<path stroke="#0f172a" d="M60 28v-10M60 102v-10M28 60h-10M102 60h-10M38 38l-7-7M89 89l-7-7M38 82l-7 7M89 31l-7 7" />
</g>
<path
class="nexus-theme-transition__moon"
fill="#f8fafc"
stroke="#0f172a"
stroke-width="2.5"
d="M72 38a22 22 0 1 0 0 44 18 18 0 1 1 0-44z"
/>
</svg>
</div>
</div>
<script src="/nexus-subpage.js"></script>
<script src="animations.js"></script>
<script src="app.js"></script>
</body>
</html>