Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <link rel="icon" type="image/png" href="/mathpulse_final_logo.png" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <meta name="description" content="MathPulse AI — AI-powered math tutoring platform for Filipino senior high school STEM students. Personalized learning paths, interactive lessons, AI chat tutor, and teacher analytics powered by DeepSeek." /> | |
| <meta name="theme-color" content="#9956DE" /> | |
| <meta name="robots" content="index, follow" /> | |
| <meta property="og:title" content="MathPulse AI" /> | |
| <meta property="og:description" content="AI-powered math tutoring for Filipino SHS STEM students with adaptive learning paths and teacher analytics." /> | |
| <meta property="og:type" content="website" /> | |
| <meta property="og:image" content="/mathpulse_final_logo.png" /> | |
| <meta name="twitter:card" content="summary_large_image" /> | |
| <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=Nunito:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" /> | |
| <title>MathPulse AI</title> | |
| <style> | |
| /* Pre-JS static loader — visible from first paint before any script runs */ | |
| *,*::before,*::after{box-sizing:border-box} | |
| html,body{margin:0;min-height:100%} | |
| body{min-height:100vh;font-family:'Nunito',ui-sans-serif,system-ui,sans-serif;background:#f8faff;color:#0a1628} | |
| @keyframes pp-spin{to{transform:rotate(360deg)}} | |
| #pp-static-loader{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:1rem;background:#f7f9fc} | |
| #pp-static-loader .pp-card{width:min(100%,24rem);padding:2rem;border-radius:2rem;border:1px solid #dde3eb;background:#fff;box-shadow:0 24px 40px rgba(56,189,248,.12);display:flex;flex-direction:column;align-items:center;gap:1.5rem} | |
| #pp-static-loader .pp-avatar-shell{width:8rem;height:8rem;border-radius:1.5rem;background:linear-gradient(135deg,#e0f2fe,#e0e7ff);box-shadow:0 12px 24px rgba(15,23,42,.12);display:flex;align-items:center;justify-content:center} | |
| #pp-static-loader .pp-avatar-shell img{width:5.5rem;height:5.5rem;object-fit:contain;filter:drop-shadow(0 8px 12px rgba(15,23,42,.2))} | |
| #pp-static-loader .pp-copy{text-align:center} | |
| #pp-static-loader .pp-title{margin:0;font-size:1.25rem;font-weight:700;color:#0a1628} | |
| #pp-static-loader .pp-row{margin-top:.5rem;display:flex;align-items:center;justify-content:center;gap:.5rem} | |
| #pp-static-loader .pp-spinner{width:1rem;height:1rem;border-radius:999px;border:2px solid #0284c7;border-top-color:transparent;animation:pp-spin 1.5s linear infinite} | |
| #pp-static-loader .pp-msg{margin:0;font-size:.875rem;font-weight:600;color:#64748b} | |
| </style> | |
| <script type="module" crossorigin src="/assets/index-BOwCDUuj.js"></script> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-react-B4AQeu28.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-firebase-core-D7GXCeNu.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-firebase-firestore-CNv3xXal.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-firebase-auth-T_wvTOvf.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-firebase-storage-Bi7H_66d.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-firebase-analytics-rHarj5hR.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-radix-C5nwdvGr.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-charts-CAmziV1y.js"> | |
| <link rel="modulepreload" crossorigin href="/assets/vendor-markdown-yqZQ_iQm.js"> | |
| <link rel="stylesheet" crossorigin href="/assets/vendor-markdown-CfVKi3_s.css"> | |
| <link rel="stylesheet" crossorigin href="/assets/index-Z9-hiUOE.css"> | |
| </head> | |
| <body> | |
| <div id="root"> | |
| <!-- Static pre-JS card loader: visible from first HTML paint, replaced by React on mount --> | |
| <div id="pp-static-loader" role="status" aria-live="polite" aria-busy="true" aria-label="Loading"> | |
| <div class="pp-card"> | |
| <div class="pp-avatar-shell"> | |
| <img src="/mathpulse_final_logo.png" alt="" /> | |
| </div> | |
| <div class="pp-copy"> | |
| <h2 class="pp-title">MathPulse AI</h2> | |
| <div class="pp-row"> | |
| <div class="pp-spinner"></div> | |
| <p class="pp-msg">Loading...</p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="modal-root"></div> | |
| </body> | |
| </html> | |