{"release_id":"01a1998d-9802-0000-b0f7-33a23307f4ed","chunk_id":"01a1998d-9909-70b0-a262-fd17db88aab2","file":"CKUvxp4m.mjs","ignoreList":[],"mappings":"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","names":["open","$.prop","$$props","flow","step","$.state","email","otpCode","submitting","error","oauthInFlight","otpCooldown","cooldownInterval","startOtpCooldown","$.set","$.get","onDestroy","warmClient","warmSupabase","__vitePreload","m","$.user_effect","WATCHDOG_MS","watchdog","clearWatchdog","armWatchdog","analytics.trackOAuthFailed","onMount","onShow","onHide","close","onBackdrop","e","onKey","signInWithGoogle","page","invalidateAll","dest","goto","analytics.trackOAuthStart","target","nextWithFlag","redirectTo","supabase","oauthError","t","sendOtp","trimmed","analytics.trackSignInStart","analytics.trackEmailSubmit","fd","res","result","deserialize","d","verifyOtp","code","verifyError","paused","analytics.trackOtpVerifyFailed","analytics.trackOtpVerify","analytics.trackSignInComplete","destination","resendOtp","div","root_1","div_1","$.child","node_1","$.sibling","div_2","root_2","img","root_3","$.template_effect","$.set_attribute","$$render","consequent","p","node_2","h2","p_1","root_4","consequent_1","div_3","root_5","p_2","$0","$.set_text","text_3","button","$.first_child","fragment_1","span","$.reset","div_4","span_1","form","div_5","label","input","$.remove_input_defaults","button_1","$.delegated","$.event","$$value","p_3","fragment_2","span_2","text_8","form_1","div_6","label_1","input_1","button_2","text_12","node_5","p_4","root_8","button_3","root_9","consequent_4","alternate_1","$3","consequent_3","alternate_2","p_5","root_10","consequent_5","p_6","node_6","a","text_16","a_1","fly","cubicOut","$.append","$$anchor","consequent_6"],"sources":["../../../../../../src/lib/components/AuthSheet.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t/**\n\t * RAT-272 Phase 3: bottom-sheet auth.\n\t *\n\t * Triggered when an unauthed viewer taps the Profile slot on the mobile\n\t * bottom nav. Bottom-sheet (not a route nav) means we keep the user's\n\t * scroll position, dodge the cold-function spin-up on /auth/sign-in,\n\t * and the sheet itself acts as the gating affordance — they sign in\n\t * and land right back on whatever page they were on.\n\t *\n\t * Two-step flow:\n\t *   1. email entry → POST /auth/sign-in?/sendOtp (existing action)\n\t *   2. OTP entry  → client-side supabase.auth.verifyOtp → close, then\n\t *      invalidateAll (or goto(next)) behind the closed sheet\n\t *\n\t * Continue with Google reuses supabase.auth.signInWithOAuth — same\n\t * mechanism as OAuthButtonRow.svelte. Redirect goes via\n\t * `window.location.href`, which iOS Safari permits even after the\n\t * intervening dynamic supabase import (the activation-drop trap from\n\t * CLAUDE.md only bites APIs that *require* fresh activation —\n\t * navigator.share, window.open, anchor.click — none of which we use\n\t * here).\n\t *\n\t * One flow handles both sign-in AND sign-up — Supabase magic-link auto-\n\t * creates the account when the email isn't on file. No separate \"join\"\n\t * CTA needed.\n\t */\n\n\timport { onMount, onDestroy } from 'svelte';\n\timport { page } from '$app/state';\n\timport { invalidateAll, goto } from '$app/navigation';\n\timport { deserialize } from '$app/forms';\n\timport * as analytics from '$lib/analytics';\n\timport { fly } from 'svelte/transition';\n\timport { cubicOut } from 'svelte/easing';\n\timport type { AuthSheetContext } from '$lib/stores/authSheet';\n\t// Type-only import — erased at compile time, so supabase-js stays out of\n\t// the bundle until warmSupabase() dynamically imports it.\n\timport type { createSupabaseBrowserClient } from '$lib/supabase';\n\ttype SupabaseBrowserClient = ReturnType<typeof createSupabaseBrowserClient>;\n\n\tinterface Props {\n\t\t/** Two-way bound — caller flips false from outside to dismiss the sheet\n\t\t *  (e.g. an Escape key handler in the parent). */\n\t\topen: boolean;\n\t\t/** Where the OAuth callback should land the user once auth completes.\n\t\t *  Defaults to the current pathname — i.e. \"back where you were\". */\n\t\tnext?: string;\n\t\t/** Analytics label for which surface raised the sheet (e.g. 'beat' for the\n\t\t *  members-only beat gate). Keeps the sheet's sign-in flow measurable the\n\t\t *  same way the /rate, /d and /a flows already are. */\n\t\tflow?: string;\n\t\t/** RAT-519: what they're signing in for. Undefined → the generic header. */\n\t\tcontext?: AuthSheetContext;\n\t\tonclose?: () => void;\n\t}\n\n\tlet { open = $bindable(), next, flow = 'auth_sheet', context, onclose }: Props = $props();\n\n\ttype Step = 'email' | 'otp';\n\tlet step = $state<Step>('email');\n\tlet email = $state('');\n\tlet otpCode = $state('');\n\tlet submitting = $state(false);\n\tlet error = $state('');\n\tlet oauthInFlight = $state(false);\n\n\t// 60s resend cooldown — ported from the full-page /auth/sign-in flow (RAT-117\n\t// era). Without it the resend button was gated only on `submitting`, so users\n\t// could hammer signInWithOtp. Each resend invalidates the previously emailed\n\t// code, so re-entering an older code reads as \"invalid or expired\"; keep going\n\t// and Supabase returns a 429, then GoTrue temporarily bans the auth user —\n\t// which bounces to /auth/error as a scary \"User is banned\" wall. Gating resend\n\t// for 60s stops users from ever climbing that ladder.\n\tlet otpCooldown = $state(0);\n\tlet cooldownInterval: ReturnType<typeof setInterval> | undefined;\n\n\tfunction startOtpCooldown() {\n\t\totpCooldown = 60;\n\t\tif (cooldownInterval) clearInterval(cooldownInterval);\n\t\tcooldownInterval = setInterval(() => {\n\t\t\totpCooldown--;\n\t\t\tif (otpCooldown <= 0 && cooldownInterval) clearInterval(cooldownInterval);\n\t\t}, 1000);\n\t}\n\n\tonDestroy(() => {\n\t\tif (cooldownInterval) clearInterval(cooldownInterval);\n\t});\n\n\t// Pre-warm the supabase browser client the moment the sheet opens, so the\n\t// Google button's click handler can fire signInWithOAuth immediately\n\t// instead of paying for a cold dynamic-import (the supabase-js chunk can\n\t// take a few seconds to fetch cold) between the tap and the redirect. A\n\t// dead-looking \"redirecting…\" button invites double-taps — the exact\n\t// interstitial-delay trap CLAUDE.md warns about.\n\tlet warmClient: Promise<SupabaseBrowserClient> | null = null;\n\tfunction warmSupabase(): Promise<SupabaseBrowserClient> {\n\t\tif (warmClient) return warmClient;\n\t\twarmClient = import('$lib/supabase').then((m) => m.createSupabaseBrowserClient());\n\t\treturn warmClient;\n\t}\n\n\t$effect(() => {\n\t\tif (open) warmSupabase();\n\t});\n\n\t// Escape hatch for a redirect that never navigates away. The pageshow reset\n\t// below only recovers when the browser comes *back* to the page — it does\n\t// nothing if signInWithOAuth hangs, or resolves without navigating, inside a\n\t// single page load, leaving the button wedged on \"redirecting…\" forever.\n\t//\n\t// Armed only once signInWithOAuth has resolved, so the window covers just the\n\t// unload — not the provider round trip that precedes it, which can legitimately\n\t// run long on mobile data. Disarmed on pagehide (a real navigation is under\n\t// way) and whenever the flight ends.\n\tconst WATCHDOG_MS = 12_000;\n\tlet watchdog: ReturnType<typeof setTimeout> | undefined;\n\tfunction clearWatchdog() {\n\t\tif (watchdog !== undefined) {\n\t\t\tclearTimeout(watchdog);\n\t\t\twatchdog = undefined;\n\t\t}\n\t}\n\tfunction armWatchdog() {\n\t\tclearWatchdog();\n\t\twatchdog = setTimeout(() => {\n\t\t\twatchdog = undefined;\n\t\t\terror = \"google sign-in didn't finish. try again, or use email below.\";\n\t\t\toauthInFlight = false;\n\t\t\tanalytics.trackOAuthFailed('google', 'watchdog_timeout', flow);\n\t\t}, WATCHDOG_MS);\n\t}\n\t$effect(() => clearWatchdog);\n\n\t// Reset the in-flight state whenever the page is shown again (back button\n\t// from Google, bfcache restore, a stalled redirect the user backs out of).\n\t// Without this the Google button stays disabled at \"redirecting…\" forever\n\t// and the user can never retry — the unrecoverable wedge from the sign-in\n\t// signals. Mirrors the reset OAuthButtonRow got in da9ebcd8.\n\tonMount(() => {\n\t\tconst onShow = () => {\n\t\t\toauthInFlight = false;\n\t\t};\n\t\tconst onHide = () => clearWatchdog();\n\t\twindow.addEventListener('pageshow', onShow);\n\t\twindow.addEventListener('pagehide', onHide);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('pageshow', onShow);\n\t\t\twindow.removeEventListener('pagehide', onHide);\n\t\t};\n\t});\n\n\tfunction close() {\n\t\topen = false;\n\t\t// Reset state so the next open starts fresh — but only after the\n\t\t// fly-out has had a chance to read the current step.\n\t\tsetTimeout(() => {\n\t\t\tstep = 'email';\n\t\t\temail = '';\n\t\t\totpCode = '';\n\t\t\terror = '';\n\t\t\tsubmitting = false;\n\t\t\totpCooldown = 0;\n\t\t\tif (cooldownInterval) clearInterval(cooldownInterval);\n\t\t}, 250);\n\t\tonclose?.();\n\t}\n\n\tfunction onBackdrop(e: MouseEvent) {\n\t\tif (e.target === e.currentTarget) close();\n\t}\n\n\tfunction onKey(e: KeyboardEvent) {\n\t\tif (e.key === 'Escape') close();\n\t}\n\n\t// Google sign-in. supabase.auth.signInWithOAuth handles its own\n\t// fetch + window.location.href redirect — caller doesn't need to do\n\t// anything after the await resolves except wait for the navigation\n\t// the browser is already running. The `oauth_resume=1` flag round-\n\t// trips through the bridge loader pattern from OAuthButtonRow.\n\tasync function signInWithGoogle() {\n\t\tif (oauthInFlight) return;\n\t\t// RAT-491: re-tap guard. An already-authed viewer tapping google again\n\t\t// would burn the consumed PKCE flow_state and bounce to bad_oauth_state\n\t\t// even though they're signed in. Resolve to their destination (mirrors\n\t\t// the OTP-success path) instead of starting a fresh handshake.\n\t\tif (page.data.user) {\n\t\t\terror = '';\n\t\t\tawait invalidateAll();\n\t\t\tconst dest = next ?? (typeof window !== 'undefined' ? window.location.pathname : null);\n\t\t\tif (dest) await goto(dest);\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\t\toauthInFlight = true;\n\t\terror = '';\n\t\tanalytics.trackOAuthStart('google', flow);\n\t\tconst target = next ?? (typeof window !== 'undefined' ? window.location.pathname : '/f');\n\t\tconst nextWithFlag = target + (target.includes('?') ? '&' : '?') + 'oauth_resume=1';\n\t\t// Stash `next` in a short-lived cookie — Supabase's allowed-redirect\n\t\t// match doesn't tolerate a `?next=` on the callback URL (RAT-204).\n\t\tdocument.cookie = `oauth_next=${encodeURIComponent(nextWithFlag)}; path=/; max-age=600; samesite=lax`;\n\t\tconst redirectTo = `${window.location.origin}/auth/callback`;\n\t\ttry {\n\t\t\t// warmSupabase() was kicked off when the sheet opened, so this\n\t\t\t// resolves near-instantly — no cold import between tap and redirect.\n\t\t\tconst supabase = await warmSupabase();\n\t\t\tconst { error: oauthError } = await supabase.auth.signInWithOAuth({\n\t\t\t\tprovider: 'google',\n\t\t\t\toptions: { redirectTo }\n\t\t\t});\n\t\t\tif (oauthError) {\n\t\t\t\terror = \"couldn't sign in with google. try email instead.\";\n\t\t\t\toauthInFlight = false;\n\t\t\t\tanalytics.trackOAuthFailed('google', 'provider_error', flow);\n\t\t\t} else {\n\t\t\t\t// Success → browser is already navigating; leave oauthInFlight true so\n\t\t\t\t// the button stays in its loading state, and start the stall watchdog\n\t\t\t\t// over the unload itself.\n\t\t\t\tarmWatchdog();\n\t\t\t}\n\t\t} catch {\n\t\t\terror = t('network error — try email instead.');\n\t\t\toauthInFlight = false;\n\t\t\tanalytics.trackOAuthFailed('google', 'redirect_error', flow);\n\t\t}\n\t}\n\n\tasync function sendOtp() {\n\t\tif (submitting) return;\n\t\tconst trimmed = email.trim().toLowerCase();\n\t\tif (!trimmed.includes('@') || !trimmed.includes('.')) {\n\t\t\terror = t('please enter a valid email address.');\n\t\t\treturn;\n\t\t}\n\t\tanalytics.trackSignInStart();\n\t\tanalytics.trackEmailSubmit(flow);\n\t\tsubmitting = true;\n\t\terror = '';\n\t\ttry {\n\t\t\tconst fd = new FormData();\n\t\t\tfd.append('email', trimmed);\n\t\t\tconst res = await fetch('/auth/sign-in?/sendOtp', { method: 'POST', body: fd });\n\t\t\tconst result = deserialize(await res.text());\n\t\t\tif (result.type === 'success') {\n\t\t\t\temail = trimmed;\n\t\t\t\tstep = 'otp';\n\t\t\t\tstartOtpCooldown();\n\t\t\t} else if (result.type === 'failure') {\n\t\t\t\tconst d = result.data as { error?: string } | undefined;\n\t\t\t\terror = d?.error ?? t('failed to send code.');\n\t\t\t}\n\t\t} catch {\n\t\t\terror = t('network error — try again.');\n\t\t} finally {\n\t\t\tsubmitting = false;\n\t\t}\n\t}\n\n\tasync function verifyOtp() {\n\t\tif (submitting) return;\n\t\tconst code = otpCode.trim();\n\t\tif (code.length < 6) {\n\t\t\terror = 'enter the 6-digit code from your email.';\n\t\t\treturn;\n\t\t}\n\t\tsubmitting = true;\n\t\terror = '';\n\t\ttry {\n\t\t\t// The client warmSupabase() started when the sheet opened — not a cold\n\t\t\t// import between the tap and the network call.\n\t\t\tconst supabase = await warmSupabase();\n\t\t\tconst { error: verifyError } = await supabase.auth.verifyOtp({\n\t\t\t\temail,\n\t\t\t\ttoken: code,\n\t\t\t\ttype: 'email'\n\t\t\t});\n\t\t\tif (verifyError) {\n\t\t\t\t// The friendly `/auth/error?reason=user_banned` copy is unreachable from\n\t\t\t\t// here: that route is only hit on the GoTrue URL bounce (magic-link /\n\t\t\t\t// PKCE). The sheet verifies client-side, so a rate-limited or\n\t\t\t\t// temporarily-banned user would just read \"invalid or expired code\" and\n\t\t\t\t// keep hammering — which is what earns the ban in the first place.\n\t\t\t\t// `user_banned` is a documented GoTrue code (the ErrorCode union in\n\t\t\t\t// @supabase/auth-js); status 429 covers the over_*_rate_limit codes that\n\t\t\t\t// precede it, and the message check is a belt-and-braces fallback.\n\t\t\t\tconst paused =\n\t\t\t\t\tverifyError.status === 429 ||\n\t\t\t\t\tverifyError.code === 'user_banned' ||\n\t\t\t\t\t/banned|rate limit|too many/i.test(verifyError.message);\n\t\t\t\t// Deliberately a separate event, not `otp_verify` with a success flag:\n\t\t\t\t// `otp_verify` has only ever meant \"verified\" on all four surfaces.\n\t\t\t\tanalytics.trackOtpVerifyFailed(flow, paused ? 'rate_limited' : 'invalid_code');\n\t\t\t\terror = paused\n\t\t\t\t\t? t(\n\t\t\t\t\t\t\t'too many tries — sign-in is paused for a few minutes. ask for a fresh code after that; your account is fine.'\n\t\t\t\t\t\t)\n\t\t\t\t\t: t('invalid or expired code. check your email and try again.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Mirror the telemetry the other sign-in surfaces (/rate, /d, /a) fire, so\n\t\t\t// the sheet's sign-in — the members-only beat gate among them — is finally\n\t\t\t// measurable end-to-end (this path was previously untracked, so a stuck\n\t\t\t// sign-in here left no otp_verify / sign_in_complete trail to diagnose).\n\t\t\tanalytics.trackOtpVerify(flow);\n\t\t\tanalytics.trackSignInComplete();\n\t\t\t// Signed in the moment the code verified, so the sheet goes now. It used\n\t\t\t// to wait on the layout reload first, and that wait — \"verifying…\" on a\n\t\t\t// code that had already worked — held 89% of sign-ins and lost the ones\n\t\t\t// who gave up on it. The reload finishes behind the closed sheet: the\n\t\t\t// layout picks up the session (the bottom nav's `isAuthed` flips), and\n\t\t\t// when the sheet was raised from a gated entry point (a chat thread, the\n\t\t\t// inbox, a floor's back-to-chat) `next` takes them where the tap was\n\t\t\t// headed. No `next` (e.g. the profile-slot sheet) → stay put, as before.\n\t\t\tconst destination = next;\n\t\t\tclose();\n\t\t\tvoid (destination ? goto(destination, { invalidateAll: true }) : invalidateAll());\n\t\t} catch {\n\t\t\terror = t('network error — try again.');\n\t\t} finally {\n\t\t\tsubmitting = false;\n\t\t}\n\t}\n\n\tasync function resendOtp() {\n\t\tif (submitting || otpCooldown > 0) return;\n\t\tsubmitting = true;\n\t\terror = '';\n\t\ttry {\n\t\t\tconst fd = new FormData();\n\t\t\tfd.append('email', email);\n\t\t\tconst res = await fetch('/auth/sign-in?/resendOtp', { method: 'POST', body: fd });\n\t\t\tconst result = deserialize(await res.text());\n\t\t\tif (result.type === 'success') {\n\t\t\t\tstartOtpCooldown();\n\t\t\t} else if (result.type === 'failure') {\n\t\t\t\tconst d = result.data as { error?: string } | undefined;\n\t\t\t\terror = d?.error ?? t('failed to resend.');\n\t\t\t}\n\t\t} catch {\n\t\t\terror = t('network error — try again.');\n\t\t} finally {\n\t\t\tsubmitting = false;\n\t\t}\n\t}\n</script>\n\n<svelte:window onkeydown={onKey} />\n\n{#if open}\n\t<!-- z-[210]: above bottom nav (50) + picker (60), below the niche-\n\t\t onboarding modal (240). Stacks correctly when both are open\n\t\t (onboarding wins, sheet sits behind). role=presentation marks\n\t\t the backdrop as a non-interactive wrapper — the actual dialog\n\t\t child carries the semantic role. -->\n\t<div\n\t\trole=\"presentation\"\n\t\tclass=\"auth-backdrop fixed inset-0 z-[210] bg-black/60 md:flex md:items-center md:justify-center md:p-6\"\n\t\tonclick={onBackdrop}\n\t\ttransition:fly={{ duration: 180 }}\n\t>\n\t\t<div\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t\taria-label={context ? context.title : t('sign in or join')}\n\t\t\tclass=\"auth-sheet absolute inset-x-0 bottom-0 rounded-t-[22px] border-t border-border bg-bg shadow-2xl md:static md:w-full md:max-w-[400px] md:rounded-[22px] md:border\"\n\t\t\tstyle=\"padding: 18px 20px calc(20px + env(safe-area-inset-bottom, 0px));\"\n\t\t\ttransition:fly={{ y: 400, duration: 280, easing: cubicOut }}\n\t\t>\n\t\t\t<div class=\"grabber\" aria-hidden=\"true\"></div>\n\n\t\t\t{#if context}\n\t\t\t\t<!-- RAT-519: the sheet as the next step of what they were doing. -->\n\t\t\t\t<div class=\"sheet-head\">\n\t\t\t\t\t{#if context.imageUrl}\n\t\t\t\t\t\t<img src={context.imageUrl} alt=\"\" class=\"context-face\" />\n\t\t\t\t\t{/if}\n\t\t\t\t\t<p class=\"eyebrow\">{t('sign in or join · one step')}</p>\n\t\t\t\t\t<h2 class=\"font-display text-[21px] leading-tight font-bold tracking-tight text-text\">\n\t\t\t\t\t\t{context.title}\n\t\t\t\t\t</h2>\n\t\t\t\t\t{#if context.detail}\n\t\t\t\t\t\t<p class=\"mx-auto mt-1.5 max-w-[300px] text-[12.5px] leading-snug text-muted\">\n\t\t\t\t\t\t\t{context.detail}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{:else}\n\t\t\t\t<div class=\"sheet-head\">\n\t\t\t\t\t<div class=\"brand font-display text-[22px] font-bold tracking-tighter\">\n\t\t\t\t\t\tratemyd<span class=\"text-coral\">.</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p class=\"mt-1 text-[12px] leading-snug text-muted\">\n\t\t\t\t\t\t{t(\"sign in or join · no fluff, one tap and you're in\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t{#if step === 'email'}\n\t\t\t\t<!-- Continue with Google — white block, dark text per design. -->\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonclick={signInWithGoogle}\n\t\t\t\t\tdisabled={oauthInFlight}\n\t\t\t\t\tclass=\"btn-google\"\n\t\t\t\t>\n\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tfill=\"#4285F4\"\n\t\t\t\t\t\t\td=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.27-4.74 3.27-8.1Z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tfill=\"#34A853\"\n\t\t\t\t\t\t\td=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.99.66-2.25 1.06-3.71 1.06-2.86 0-5.28-1.93-6.14-4.53H2.18v2.84A11 11 0 0 0 12 23Z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tfill=\"#FBBC05\"\n\t\t\t\t\t\t\td=\"M5.86 14.1A6.6 6.6 0 0 1 5.5 12c0-.73.13-1.44.36-2.1V7.06H2.18A11 11 0 0 0 1 12c0 1.78.42 3.46 1.18 4.94l3.68-2.84Z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tfill=\"#EA4335\"\n\t\t\t\t\t\t\td=\"M12 5.38c1.62 0 3.06.56 4.21 1.65l3.15-3.15C17.45 2.1 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.68 2.84C6.72 7.31 9.14 5.38 12 5.38Z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<span>{oauthInFlight ? t('redirecting…') : t('continue with google')}</span>\n\t\t\t\t</button>\n\n\t\t\t\t<div class=\"divider\"><span>{t('or')}</span></div>\n\n\t\t\t\t<form\n\t\t\t\t\tonsubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tsendOtp();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"field\">\n\t\t\t\t\t\t<label for=\"auth-email\">{t('email')}</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"auth-email\"\n\t\t\t\t\t\t\tbind:value={email}\n\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\tinputmode=\"email\"\n\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\tplaceholder=\"you@example.com\"\n\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button type=\"submit\" disabled={submitting} class=\"btn-primary mt-3\">\n\t\t\t\t\t\t{submitting ? t('sending…') : t('send code')}\n\t\t\t\t\t</button>\n\t\t\t\t</form>\n\t\t\t{:else}\n\t\t\t\t<!-- OTP step: 6-digit code from email + verify. -->\n\t\t\t\t<p class=\"mb-3 text-center text-[12px] leading-snug text-muted\">\n\t\t\t\t\t{t('code sent to')} <span class=\"text-text\">{email}</span>{t('. enter it below.')}\n\t\t\t\t</p>\n\t\t\t\t<form\n\t\t\t\t\tonsubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tverifyOtp();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"field\">\n\t\t\t\t\t\t<label for=\"auth-otp\">{t('6-digit code')}</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"auth-otp\"\n\t\t\t\t\t\t\tbind:value={otpCode}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\tautocomplete=\"one-time-code\"\n\t\t\t\t\t\t\tmaxlength=\"6\"\n\t\t\t\t\t\t\tplaceholder=\"123456\"\n\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tdisabled={submitting || otpCode.trim().length < 6}\n\t\t\t\t\t\tclass=\"btn-primary mt-3\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{submitting ? t('verifying…') : t('verify')}\n\t\t\t\t\t</button>\n\t\t\t\t</form>\n\t\t\t\t{#if otpCooldown > 0}\n\t\t\t\t\t<p class=\"resend-cooldown\">resend in {otpCooldown}s</p>\n\t\t\t\t{:else}\n\t\t\t\t\t<button type=\"button\" onclick={resendOtp} disabled={submitting} class=\"resend-link\">\n\t\t\t\t\t\t{t(\"didn't get it? resend code\")}\n\t\t\t\t\t</button>\n\t\t\t\t{/if}\n\t\t\t{/if}\n\n\t\t\t{#if error}\n\t\t\t\t<p class=\"mt-3 text-center text-[12px] text-coral\">{error}</p>\n\t\t\t{/if}\n\n\t\t\t<p class=\"sheet-terms\">\n\t\t\t\t{t('by continuing you agree to our')}\n\t\t\t\t<a href=\"/legal/terms\">{t('terms')}</a> · <a href=\"/legal/privacy\">{t('privacy')}</a>\n\t\t\t</p>\n\t\t</div>\n\t</div>\n{/if}\n\n<style>\n\t.grabber {\n\t\twidth: 36px;\n\t\theight: 4px;\n\t\tborder-radius: 2px;\n\t\tbackground: var(--color-surface-2, #1a1a1a);\n\t\tmargin: -6px auto 14px;\n\t}\n\t.sheet-head {\n\t\ttext-align: center;\n\t\tmargin-bottom: 18px;\n\t}\n\t.context-face {\n\t\twidth: 52px;\n\t\theight: 52px;\n\t\tmargin: 0 auto 12px;\n\t\tborder-radius: 999px;\n\t\tobject-fit: cover;\n\t\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);\n\t}\n\t.eyebrow {\n\t\tmargin-bottom: 6px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: 0.18em;\n\t\ttext-transform: uppercase;\n\t\tcolor: var(--color-muted);\n\t}\n\n\t.btn-google {\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 10px;\n\t\tbackground: #fff;\n\t\tcolor: #0c0c0c;\n\t\tborder: 0;\n\t\tborder-radius: 14px;\n\t\tpadding: 14px 16px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 14px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\tcursor: pointer;\n\t\ttransition: opacity 180ms ease-out;\n\t}\n\t.btn-google:disabled {\n\t\topacity: 0.6;\n\t\tcursor: wait;\n\t}\n\t.btn-google :global(svg) {\n\t\twidth: 18px;\n\t\theight: 18px;\n\t}\n\n\t.divider {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 12px;\n\t\tmargin: 16px 0;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: 0.2em;\n\t\ttext-transform: uppercase;\n\t\tcolor: var(--color-muted);\n\t}\n\t.divider::before,\n\t.divider::after {\n\t\tcontent: '';\n\t\tflex: 1;\n\t\theight: 1px;\n\t\tbackground: var(--color-border);\n\t}\n\n\t.field {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 8px;\n\t}\n\t.field label {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: 0.18em;\n\t\ttext-transform: uppercase;\n\t\tcolor: var(--color-muted);\n\t}\n\t.field input {\n\t\twidth: 100%;\n\t\tbackground: var(--color-surface, #141414);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 12px;\n\t\tpadding: 12px 14px;\n\t\tcolor: var(--color-text);\n\t\tfont-size: 14px;\n\t\toutline: none;\n\t\ttransition: border-color 180ms ease-out;\n\t}\n\t.field input:focus {\n\t\tborder-color: var(--color-coral);\n\t}\n\t.field input::placeholder {\n\t\tcolor: rgba(115, 115, 115, 0.7);\n\t}\n\n\t.btn-primary {\n\t\twidth: 100%;\n\t\tbackground: var(--color-coral);\n\t\tcolor: #fff;\n\t\tborder: 0;\n\t\tborder-radius: 14px;\n\t\tpadding: 13px 16px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 14px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\tcursor: pointer;\n\t\ttransition: background 180ms ease-out;\n\t}\n\t.btn-primary:active {\n\t\tbackground: var(--color-coral-dark);\n\t}\n\t.btn-primary:disabled {\n\t\topacity: 0.6;\n\t\tcursor: wait;\n\t}\n\n\t.resend-link {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tmargin-top: 12px;\n\t\tfont-size: 11px;\n\t\tcolor: var(--color-muted);\n\t\tbackground: transparent;\n\t\tborder: 0;\n\t\ttext-decoration: underline;\n\t\ttext-underline-offset: 2px;\n\t\tcursor: pointer;\n\t}\n\t.resend-link:disabled {\n\t\topacity: 0.5;\n\t\tcursor: wait;\n\t}\n\n\t.resend-cooldown {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tmargin-top: 12px;\n\t\tfont-size: 11px;\n\t\tcolor: var(--color-muted);\n\t\topacity: 0.6;\n\t}\n\n\t.sheet-terms {\n\t\tmargin: 14px 0 0;\n\t\ttext-align: center;\n\t\tfont-size: 10px;\n\t\tcolor: var(--color-muted);\n\t\tline-height: 1.5;\n\t}\n\t.sheet-terms a {\n\t\tcolor: var(--color-muted);\n\t\ttext-decoration: underline;\n\t\ttext-underline-offset: 2px;\n\t}\n</style>\n"],"version":3}