1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/assets/rival-logo-CQEkQZqC.png"/><title>Log into Rival</title><meta name="author" content="Lovable"/><meta property="og:title" content="Lovable App"/><meta property="og:description" content="Lovable Generated Project"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@Lovable"/><meta name="description" content="Build faster. Run smarter. Stay in full control."/><link rel="modulepreload" href="/assets/index-B906m9HQ.js"/><link rel="modulepreload" href="/assets/login-uVt7rsj5.js"/><link rel="modulepreload" href="/assets/index-eDmhgP_o.js"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600;700&
1family=JetBrains+Mono:wght@400;500&display=swap"/><link rel="stylesheet" href="/assets/styles-DHPTJQlQ.css"/>
1<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script>
1<meta name="twitter:title" content="Lovable App"><meta name="twitter:description" content="Lovable Generated Project"><meta property="og:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/dd8e1c2f-e75b-4584-9874-0bf690b182aa/id-preview-9a009dcd--3e2c8b87-2695-4d04-a4a1-37ef4756acb9.lovable.app-1776614289378.png"><meta name="twitter:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/dd8e1c2f-e75b-4584-9874-0bf690b182aa/id-preview-9a009dcd--3e2c8b87-2695-4d04-a4a1-37ef4756acb9.lovable.app-1776614289378.png"></head><body><!--$--><div style="position:absolute;inset:0;overflow-y:auto;background:radial-gradient(ellipse 800px 500px at 50% -10%, color-mix(in oklab, var(--blue) 8%, transparent) 0%, transparent 70%), var(--bg);display:flex;align-items:flex-start;justify-content:center;padding:56px 20px;font-family:var(--font-sans)"><div style="width:100%;max-width:460px;background:#fff;border:1px solid var(--border);border-radius:16px;padding:36px 36px 32px;box-shadow:0 8px 32px -12px rgba(10,21,48,0.12)"><div style="display:flex;justify-content:center"><a href="/"><img src="/assets/rival-logo-CQEkQZqC.png" alt="Rival" style="height:40px;width:auto;display:block"/></a></div><h1 style="font-size:28px;font-weight:700;letter-spacing:-0.02em;margin:20px 0 8px;text-align:center;color:var(--text)">Log into Rival</h1><p style="text-align:center;color:var(--text-3);margin:0 0 28px">Build faster. Run smarter. Stay in full control.</p><button type="button" style="width:100%;padding:11px 14px;border-radius:10px;border:1px solid var(--border);background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:10px;font-size:14px;font-weight:500;color:var(--text);margin-bottom:10px"><svg width="18" height="18" viewBox="0 0 18 18" aria-hidden="true"><path fill="#4285F4" d="M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.8 2.71v2.26h2.92c1.7-1.57 2.68-3.88 2.68-6.61z"></path><path fill="#34A853" d="M9 18c2.43 0 4.47-.81 5.96-2.18l-2.92-2.26c-.81.54-1.84.86-3.04.86-2.34 0-4.32-1.58-5.03-3.71H.96v2.33A9 9 0 0 0 9 18z"></path><path fill="#FBBC05" d="M3.97 10.71A5.41 5.41 0 0 1 3.68 9c0-.59.1-1.17.29-1.71V4.96H.96A9 9 0 0 0 0 9c0 1.45.35 2.82.96 4.04l3.01-2.33z"></path><path fill="#EA4335" d="M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58A9 9 0 0 0 9 0 9 9 0 0 0 .96 4.96L3.97 7.3C4.68 5.16 6.66 3.58 9 3.58z"></path></svg>Continue with Google</button><div style="display:flex;align-items:center;gap:12px;margin:20px 0 22px"><div style="flex:1;height:1px;background:var(--border)"></div><span style="font-size:11px;color:var(--text-3);letter-spacing:0.08em;font-weight:600">OR</span><div style="flex:1;height:1px;background:var(--border)"></div></div><form style="display:flex;flex-direction:column;gap:16px"><label style="display:flex;flex-direction:column;gap:7px"><span style="font-size:13.5px;font-weight:600;color:var(--text)">Email</span><input type="email" placeholder="[email protected]" style="width:100%;padding:11px 13px;border-radius:9px;border:1px solid var(--border);background:#fff;font-size:14px;color:var(--text);font-family:inherit;outline:none" value=""/></label><label style="display:flex;flex-direction:column;gap:7px"><span style="font-size:13.5px;font-weight:600;color:var(--text)">Password</span><div style="position:relative"><input type="password" placeholder="â¢â¢â¢â¢â¢â¢â¢â¢" style="width:100%;padding:11px 13px;border-radius:9px;border:1px solid var(--border);background:#fff;font-size:14px;color:var(--text);font-family:inherit;outline:none;padding-right:38px" value=""/><button type="button" aria-label="Toggle password visibility" style="position:absolute;right:8px;top:50%;transform:translateY(-50%);background:transparent;border:0;cursor:pointer;color:var(--text-3);padding:6px;display:grid;place-items:center"><svg width="16" height="16" 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"></path><line x1="1" y1="1" x2="23" y2="23"></line></svg></button></div></label><div style="display:flex;justify-content:flex-end;margin-top:-6px"><a href="#" style="color:var(--blue);font-size:13px;font-weight:500">Forgot Password?</a></div><button type="submit" style="width:100%;padding:12px 16px;border-radius:10px;background:var(--blue);color:#fff;border:0;font-size:14.5px;font-weight:600;cursor:pointer;margin-top:4px">Login</button></form><div style="text-align:center;margin-top:22px;color:var(--text-3);font-size:13.5px">Don't have an account?<!-- --> <a href="/signup" style="color:var(--blue);font-weight:600">Create Account</a></div></div></div>
1<script>(function(t){let s;try{s=JSON.parse(sessionStorage.getItem(t.storageKey)||"{}")}catch(e){console.error(e);return}const c=t.key||window.history.state?.__TSR_key,r=c?s[c]:void 0;if(t.shouldScrollRestoration&&r&&typeof r=="object"&&Object.keys(r).length>0){for(const e in r){const o=r[e];if(!o||typeof o!="object")continue;const l=o.scrollX,i=o.scrollY;if(!(!Number.isFinite(l)||!Number.isFinite(i))){if(e==="window")window.scrollTo({top:i,left:l,behavior:t.behavior});else if(e){let n;try{n=document.querySelector(e)}catch{continue}n&&(n.scrollLeft=l,n.scrollTop=i)}}}return}const a=window.location.hash.split("#",2)[1];if(a){const e=window.history.state?.__hashScrollIntoViewOptions??!0;if(e){const o=document.getElementById(a);o&&o.scrollIntoView(e)}return}window.scrollTo({top:0,left:0,behavior:t.behavior})})({"storageKey":"tsr-scroll-restoration-v1_3","shouldScrollRestoration":true});document.currentScript.remove()</script>
1<!--/$--><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section>
1<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/index-B906m9HQ.js"],assets:$R[5]=[$R[6]={tag:"script",attrs:$R[7]={type:"module",async:!0},children:"import(\"/assets/index-B906m9HQ.js\")"}]},"/login":$R[8]={preloads:$R[9]=["/assets/login-uVt7rsj5.js","/assets/index-eDmhgP_o.js"]}}},matches:$R[10]=[$R[11]={i:"__root__�",u:1791005802144,s:"success",ssr:!0},$R[12]={i:"�login�login",u:1791005802144,s:"success",ssr:!0}],lastMatchId:"�login�login"})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
1<script type="module" async="">import("/assets/index-B906m9HQ.js")</script>
1</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.