{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c72-7ca1-a13e-3554e5ecde1d","file":"11.D6Yjm3F9.mjs","ignoreList":[],"mappings":"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","names":["isLoggedIn","SCRIPT_SRC","initialized","plainNonce","generateNoncePair","random","plain","hashBuffer","hashed","b","onMount","clientId","env","tryInit","script","id","handleCredentialResponse","response","createSupabaseBrowserClient","supabase","error","invalidateAll","err","LANDING_VARIANT","PLAN_TERM","compact","SCORE","RING","ROWS","msg","lockedCount","r","div","root","div_1","div_2","svg","circle","$.sibling","$.child","$.set_attribute","p","root_1","b_1","t","$$render","consequent","div_3","$$anchor","div_4","root_2","span","span_1","i","b_2","classes","$.get","$.set_style","p_1","div_5","b_3","span_2","$.set_class","$.clsx","$$props","$0","track","name","props","trackLanding","TILES","picked","route","nav","tile","a","Icon","node","span_3","$.reset","$.delegated","$$args","$.append","section","h1","text_2","text_5","ResultCard","node_1","ProductStrip","node_2","RATED_COUNT_LABEL","EARN_HREF","startEarning","e","signedIn","location","openAuthSheet","GUIDE","AVERAGE_SCORE_LABEL","FAQ","BJU_2015","sizeLinks","locale","DEFAULT_LOCALE","slug","row","sizePageBySlug","label","lhref","sizePagePath","figures","params","tag","LOCALE_INFO","k","v","faqToggled","q","linkClicked","link","block","article","h2","$.derived","h2_1","$.index","part","em","$.first_child","fragment_1","$.template_effect","$.set_text","text_3","text_4","consequent_1","alternate","item","details","root_6","summary","p_2","a_1","root_7","consequent_2","root_8","$.each","node_5","size","root_10","consequent_3","a_2","node_6","text_10","text_9","consequent_4","broken","$.proxy","age","iso","mins","h","num","n","wallClick","text","text_1","root_4","span_4","span_5","span_6","img","root_5","$.event","$.replay_events","alternate_1","span_7","span_8","span_9","span_10","span_11","span_12","span_13","text_11","text_7","span_14","fragment_4","span_15","span_16","root_9","text_15","alternate_2","span_17","span_18","text_16","HUBS","albumHubBySlug","album","AlbumCard","ul","hub","li","albumHubPath","$1","viewedOnce","onview","io","entries","SOURCE","anchor","PLANS","cards","PLAN_ORDER","c","BEST","TERMS","term","$.state","loading","billed","price","formatUsd","tokens","perMonth","stipendPerMonth","stipendPerPeriod","title","termLabel","save","discountPct","subscribe","cadence","$.set","analytics.trackPurchaseClick","res","result","toTokens","el","UNLOCKS","button","text_8","i_1","p_3","p_4","button_1","div_6","div_7","root_11","p_5","root_12","text_17","consequent_5","div_8","b_4","p_6","root_13","text_20","consequent_6","p_7","p_8","button_2","text_23","classes_1","p_9","root_14","consequent_7","p_10","node_7","p_11","div_9","g","div_10","root_15","p_12","node_8","perk","div_11","root_16","text_28","p_13","b_5","root_18","text_29","PRO_MONTHLY_TOKENS","consequent_8","div_12","text_31","node_10","$$node","$$action_arg","$2","GROUPS","GIFT_PRO_TOKEN_COST","isPlus","page","loadingId","buy","pkg","j","$$item","$$array","TOKEN_PACKAGES","text_12","withPlusBonus","packPrice","lang","proof","EARN","Hero","fragment_2","node_4","FeedRail","AlbumRail","section_1","em_1","Plans","Tokens","HomeGuide","node_9","showUpsellModal","upsellFeature","stripeBanner","url","subscribed","canceled","oauthResume","notifySignedIn","$.user_effect","upsell","clearUpsellParam","GoogleOneTap","root_3","LandingSignupFirst","UpgradeModal","node_3"],"sources":["../../../../../../src/lib/components/auth/GoogleOneTap.svelte","../../../../../../src/lib/landing-variant.ts","../../../../../../src/lib/components/landing/signup-first/ResultCard.svelte","../../../../../../src/lib/components/landing/signup-first/track.ts","../../../../../../src/lib/components/landing/signup-first/ProductStrip.svelte","../../../../../../src/lib/components/landing/signup-first/Hero.svelte","../../../../../../src/lib/components/landing/signup-first/earn.ts","../../../../../../src/lib/components/landing/home-guide.ts","../../../../../../src/lib/components/landing/HomeGuide.svelte","../../../../../../src/lib/components/landing/signup-first/FeedRail.svelte","../../../../../../src/lib/components/landing/signup-first/AlbumRail.svelte","../../../../../../src/lib/components/landing/viewed.ts","../../../../../../src/lib/components/landing/signup-first/Plans.svelte","../../../../../../src/lib/components/landing/signup-first/Tokens.svelte","../../../../../../src/lib/components/landing/LandingSignupFirst.svelte","../../../../../../src/routes/+page.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { onMount } from 'svelte';\n\timport { invalidateAll } from '$app/navigation';\n\timport { env } from '$env/dynamic/public';\n\n\t// RAT-186: Google One Tap on the homepage. Auto-shows a small floating\n\t// \"sign in as <name>\" widget for landing visitors who are signed into\n\t// Google in their browser. One-click → Google ID token → supabase\n\t// signInWithIdToken → session.\n\t//\n\t// Guard rails:\n\t// - Parent gates with !data.session, but we double-guard here so a stale\n\t//   prop doesn't accidentally show the widget to a logged-in user.\n\t// - If PUBLIC_GOOGLE_CLIENT_ID isn't set the component is a no-op (graceful\n\t//   degradation — Google won't yell, the page just doesn't show One Tap).\n\t// - Google's own cooldowns kick in (3 dismisses / 30 days → silent skip),\n\t//   so we don't need to track that state ourselves.\n\t//\n\t// Nonce: REQUIRED for Supabase signInWithIdToken to accept the Google\n\t// credential. We generate a random nonce, hash it with SHA-256, hand the\n\t// hash to Google's initialize() so the issued ID token's `nonce` claim is\n\t// the hash, and pass the plain (unhashed) nonce to signInWithIdToken so\n\t// Supabase can verify the hash matches. Without this dance the credential\n\t// silently fails verification — One Tap closes, no error visible to the\n\t// user, navbar never updates.\n\n\tinterface Props {\n\t\t/** Already-known logged-in state from the layout. Skip the widget if true. */\n\t\tisLoggedIn?: boolean;\n\t}\n\tlet { isLoggedIn = false }: Props = $props();\n\n\ttype GoogleCredentialResponse = { credential: string };\n\ttype GoogleIdConfig = {\n\t\tclient_id: string;\n\t\tcallback: (response: GoogleCredentialResponse) => void;\n\t\tauto_select?: boolean;\n\t\tcancel_on_tap_outside?: boolean;\n\t\tuse_fedcm_for_prompt?: boolean;\n\t\tcontext?: 'signin' | 'signup' | 'use';\n\t\tnonce?: string;\n\t};\n\ttype GoogleAccountsId = {\n\t\tinitialize: (cfg: GoogleIdConfig) => void;\n\t\tprompt: () => void;\n\t\tcancel: () => void;\n\t};\n\tconst SCRIPT_SRC = 'https://accounts.google.com/gsi/client';\n\n\tlet initialized = false;\n\t// Plain nonce kept around so the credential callback can pass it to\n\t// signInWithIdToken. The hashed version is what Google sees (and writes\n\t// into the ID token's `nonce` claim).\n\tlet plainNonce = '';\n\n\tasync function generateNoncePair(): Promise<{ plain: string; hashed: string }> {\n\t\tconst random = crypto.getRandomValues(new Uint8Array(32));\n\t\tconst plain = btoa(String.fromCharCode(...random));\n\t\tconst hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(plain));\n\t\tconst hashed = Array.from(new Uint8Array(hashBuffer))\n\t\t\t.map((b) => b.toString(16).padStart(2, '0'))\n\t\t\t.join('');\n\t\treturn { plain, hashed };\n\t}\n\n\tonMount(() => {\n\t\tif (isLoggedIn) return;\n\t\tconst clientId = env.PUBLIC_GOOGLE_CLIENT_ID;\n\t\tif (!clientId) return;\n\n\t\t// Idempotent script injection — if a prior mount already added the tag,\n\t\t// just init against the existing google global. Stops dev-mode HMR from\n\t\t// stacking duplicate <script> tags.\n\t\tconst existing = document.querySelector(\n\t\t\t`script[src=\"${SCRIPT_SRC}\"]`\n\t\t) as HTMLScriptElement | null;\n\t\tif (existing) {\n\t\t\ttryInit(clientId);\n\t\t} else {\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.src = SCRIPT_SRC;\n\t\t\tscript.async = true;\n\t\t\tscript.defer = true;\n\t\t\tscript.onload = () => tryInit(clientId);\n\t\t\tdocument.head.appendChild(script);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Cancel any pending prompt on unmount so it doesn't keep nagging\n\t\t\t// the user after a SPA nav off the homepage.\n\t\t\tconst w = window as unknown as {\n\t\t\t\tgoogle?: { accounts?: { id?: GoogleAccountsId } };\n\t\t\t};\n\t\t\tw.google?.accounts?.id?.cancel?.();\n\t\t};\n\t});\n\n\tasync function tryInit(clientId: string) {\n\t\tif (initialized) return;\n\t\tconst w = window as unknown as {\n\t\t\tgoogle?: { accounts?: { id?: GoogleAccountsId } };\n\t\t};\n\t\tconst id = w.google?.accounts?.id;\n\t\tif (!id) return;\n\t\tinitialized = true;\n\t\tconst { plain, hashed } = await generateNoncePair();\n\t\tplainNonce = plain;\n\t\tid.initialize({\n\t\t\tclient_id: clientId,\n\t\t\tcallback: handleCredentialResponse,\n\t\t\tauto_select: false,\n\t\t\tcancel_on_tap_outside: true,\n\t\t\tcontext: 'signin',\n\t\t\tnonce: hashed\n\t\t});\n\t\tid.prompt();\n\t}\n\n\tasync function handleCredentialResponse(response: GoogleCredentialResponse) {\n\t\ttry {\n\t\t\tconst { createSupabaseBrowserClient } = await import('$lib/supabase');\n\t\t\tconst supabase = createSupabaseBrowserClient();\n\t\t\tconst { error } = await supabase.auth.signInWithIdToken({\n\t\t\t\tprovider: 'google',\n\t\t\t\ttoken: response.credential,\n\t\t\t\tnonce: plainNonce\n\t\t\t});\n\t\t\tif (!error) {\n\t\t\t\tawait invalidateAll();\n\t\t\t} else {\n\t\t\t\tconsole.warn('[GoogleOneTap] signInWithIdToken failed:', error.message);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.warn('[GoogleOneTap] credential handling failed:', err);\n\t\t}\n\t}\n</script>\n","/** The homepage. `/` is the signup-first landing with every product in a\n *  strip under the hero's CTA — C + strip, `feature_strip`, the winner of the\n *  three-arm test against the old landing and C (experiment 468970, concluded\n *  2026-10-08, RAT-555). Client-safe: the page and the analytics events read it.\n *\n *  It lifted photo uploads from 22% to 29% of visitors and revenue per visitor\n *  pointed up. The old landing still sent more people on to the studio and to\n *  duels; that is the gap to close on this page, not a reason to bring it back. */\n\nimport type { PlanCadence } from '$lib/pricing';\nimport type { AlbumCard } from '$lib/types/album';\n\n/** `variant` on the landing_* events. The funnels ran on it through the test,\n *  so the page keeps reporting under the winning arm's name. */\nexport const LANDING_VARIANT = 'feature_strip';\n\n/** `term` on landing_plan_clicked. */\nexport const PLAN_TERM: Record<PlanCadence, string> = {\n\tmonthly: '1mo',\n\tquarterly: '3mo',\n\tannual: '12mo'\n};\n\n// ── signup-first data, loaded by $lib/server/landing.ts ──────────────────────\n\n/** A feed post trimmed to what the landing's compact card shows. */\nexport interface LandingPost {\n\tid: string;\n\tnickname: string;\n\tcaption: string | null;\n\t/** Signed image (or a video's poster). Browse TTL, 7 days. */\n\tmediaUrl: string | null;\n\tnetScore: number;\n\tcommentCount: number;\n\tboostCount: number;\n\tcreatedAt: string;\n}\n\nexport interface LandingTeaser {\n\tposts: LandingPost[];\n\tpostsToday: number;\n\talbums: AlbumCard[];\n}\n\nexport interface LandingProof {\n\tratings: number;\n\tmessages: number;\n\tduels: number;\n}\n","<script lang=\"ts\">\n\t/**\n\t * A sample result — the product doing the selling. Two rows readable, four\n\t * blurred, the verdict cut mid-sentence: exactly what a free result shows\n\t * (strip-locked-results.ts keeps FREE_DIM_COUNT = 2 dimensions and drops the\n\t * verdict for anyone without premium or an unlock).\n\t *\n\t * `wide` is the desktop hero's right column; `stacked` is the phone section.\n\t * The numbers are a fixed sample, not anyone's result, so the blurred rows\n\t * hide nothing — they're aria-hidden because they're decoration.\n\t *\n\t * `compact` (C + strip's desktop hero) drops the verdict line and tightens the\n\t * rows, so the product strip under the hero still fits a laptop's first\n\t * screen.\n\t */\n\timport { t } from '$lib/i18n';\n\timport { msg } from '$lib/i18n/mark';\n\n\tlet { layout, compact = false }: { layout: 'wide' | 'stacked'; compact?: boolean } = $props();\n\n\tconst SCORE = 7.4;\n\tconst RING = 295.3; // 2π × r47\n\tconst ROWS = [\n\t\t{ label: msg('proportions'), score: 8.1, locked: false },\n\t\t{ label: msg('grooming'), score: 9.0, locked: false },\n\t\t{ label: msg('aesthetics'), score: 6.8, locked: true },\n\t\t{ label: msg('photo quality'), score: 5.2, locked: true },\n\t\t{ label: msg('lighting'), score: 7.1, locked: true },\n\t\t{ label: msg('overall vibe'), score: 7.4, locked: true }\n\t];\n\tconst lockedCount = ROWS.filter((r) => r.locked).length;\n</script>\n\n<div class={['res', layout, { compact }]}>\n\t<div class=\"top\">\n\t\t<div class=\"dial\">\n\t\t\t<svg viewBox=\"0 0 104 104\" aria-hidden=\"true\">\n\t\t\t\t<circle cx=\"52\" cy=\"52\" r=\"47\" fill=\"none\" stroke=\"var(--color-border)\" stroke-width=\"5\" />\n\t\t\t\t<circle\n\t\t\t\t\tcx=\"52\"\n\t\t\t\t\tcy=\"52\"\n\t\t\t\t\tr=\"47\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"var(--color-coral)\"\n\t\t\t\t\tstroke-width=\"5\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-dasharray={RING}\n\t\t\t\t\tstroke-dashoffset={(RING * (1 - SCORE / 10)).toFixed(1)}\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t<b>{SCORE.toFixed(1)}</b><i>/10</i>\n\t\t</div>\n\t\t{#if layout === 'wide'}\n\t\t\t<p>\n\t\t\t\t<b class=\"hd\">{t('this is what you get back.')}</b>{t(\n\t\t\t\t\t'six dimensions, a verdict, and the one thing to fix first.'\n\t\t\t\t)}\n\t\t\t</p>\n\t\t{/if}\n\t</div>\n\t<div class=\"rows\">\n\t\t{#each ROWS as r (r.label)}\n\t\t\t<div class=\"r\" class:locked={r.locked} aria-hidden={r.locked ? 'true' : undefined}>\n\t\t\t\t<span class=\"lb\">{t(r.label)}</span>\n\t\t\t\t<span class=\"bar\"><i style=\"width:{r.score * 10}%\"></i></span>\n\t\t\t\t<b>{r.score.toFixed(1)}</b>\n\t\t\t</div>\n\t\t{/each}\n\t</div>\n\t<p class=\"verdict\">\n\t\t{t(\n\t\t\t'“structurally sound, photographically hopeless. the lighting is doing you no favours and neither is the angle…”'\n\t\t)}\n\t</p>\n\t<div class=\"veil\">\n\t\t<b>{t('+ {n} more dimensions and the full write-up', { n: lockedCount })}</b>\n\t\t<span>{t('included with premium')}</span>\n\t</div>\n</div>\n\n<style>\n\t.res {\n\t\tposition: relative;\n\t\tborder: 1px solid var(--color-border);\n\t\tbackground: var(--color-surface);\n\t}\n\t.dial {\n\t\tposition: relative;\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tflex: none;\n\t}\n\t.dial svg {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\ttransform: rotate(-90deg);\n\t}\n\t.dial b {\n\t\tfont-family: var(--font-display);\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.04em;\n\t\tline-height: 1;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\t.dial i {\n\t\tposition: absolute;\n\t\tfont-style: normal;\n\t\tcolor: var(--color-muted);\n\t}\n\t.rows {\n\t\tdisplay: grid;\n\t}\n\t.r {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\t.r .lb {\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.r .bar {\n\t\tposition: relative;\n\t\tflex: none;\n\t\toverflow: hidden;\n\t}\n\t.r .bar i {\n\t\tposition: absolute;\n\t\tinset: 0 auto 0 0;\n\t}\n\t.r b {\n\t\ttext-align: right;\n\t\tfont-family: var(--font-display);\n\t\tfont-weight: 700;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: var(--color-text);\n\t}\n\t.verdict {\n\t\tmargin: 0;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.veil b {\n\t\tdisplay: block;\n\t\tfont-family: var(--font-display);\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t}\n\t.veil span {\n\t\tdisplay: block;\n\t\tcolor: var(--color-muted);\n\t}\n\n\t/* ── stacked: the phone section ── */\n\t.stacked {\n\t\tmargin-top: 16px;\n\t\tborder-radius: 16px;\n\t\tpadding: 18px;\n\t\toverflow: hidden;\n\t}\n\t.stacked .dial {\n\t\twidth: 104px;\n\t\theight: 104px;\n\t\tmargin: 0 auto;\n\t}\n\t.stacked .dial b {\n\t\tfont-size: 32px;\n\t\tcolor: var(--color-coral);\n\t}\n\t.stacked .dial i {\n\t\tbottom: 20px;\n\t\tfont-size: 10px;\n\t}\n\t.stacked .rows {\n\t\tmargin-top: 16px;\n\t\tgap: 9px;\n\t}\n\t.stacked .r {\n\t\tgap: 9px;\n\t\tfont-size: 12px;\n\t}\n\t.stacked .r .lb {\n\t\tflex: 1;\n\t}\n\t.stacked .r .bar {\n\t\twidth: 74px;\n\t\theight: 3px;\n\t\tborder-radius: 2px;\n\t\tbackground: var(--color-border);\n\t}\n\t.stacked .r .bar i {\n\t\tborder-radius: 2px;\n\t\tbackground: var(--color-muted-2);\n\t}\n\t.stacked .r b {\n\t\twidth: 26px;\n\t\tfont-size: 12px;\n\t}\n\t.stacked .r.locked {\n\t\tfilter: blur(3.4px);\n\t\topacity: 0.5;\n\t}\n\t.stacked .verdict {\n\t\tmargin-top: 14px;\n\t\tfont-size: 12.5px;\n\t\tline-height: 1.5;\n\t\tfilter: blur(3.4px);\n\t\topacity: 0.5;\n\t}\n\t.stacked .veil {\n\t\tposition: absolute;\n\t\tinset: auto 0 0;\n\t\tpadding: 34px 18px 18px;\n\t\ttext-align: center;\n\t\tbackground: linear-gradient(\n\t\t\tto top,\n\t\t\tvar(--color-surface) 34%,\n\t\t\trgb(20 20 20 / 0.88) 62%,\n\t\t\ttransparent\n\t\t);\n\t}\n\t.stacked .veil b {\n\t\tfont-size: 13px;\n\t}\n\t.stacked .veil span {\n\t\tmargin-top: 4px;\n\t\tfont-size: 11.5px;\n\t}\n\n\t/* ── wide: the desktop hero's right column ── */\n\t.wide {\n\t\tborder-radius: 22px;\n\t\tpadding: 28px;\n\t}\n\t.wide .top {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 22px;\n\t}\n\t.wide .top p {\n\t\tmargin: 0;\n\t\tfont-size: 14px;\n\t\tline-height: 1.5;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.wide .top b.hd {\n\t\tdisplay: block;\n\t\tmargin-bottom: 6px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 19px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.02em;\n\t\tcolor: var(--color-text);\n\t}\n\t.wide .dial {\n\t\twidth: 118px;\n\t\theight: 118px;\n\t}\n\t.wide .dial b {\n\t\tfont-size: 34px;\n\t}\n\t.wide .dial i {\n\t\tbottom: 26px;\n\t\tfont-size: 11px;\n\t}\n\t.wide .rows {\n\t\tmargin-top: 24px;\n\t\tgap: 11px;\n\t}\n\t.wide .r {\n\t\tgap: 12px;\n\t\tfont-size: 13.5px;\n\t}\n\t.wide .r .lb {\n\t\twidth: 118px;\n\t\tflex: none;\n\t}\n\t.wide .r .bar {\n\t\tflex: 1;\n\t\theight: 5px;\n\t\tborder-radius: 3px;\n\t\tbackground: var(--color-border);\n\t}\n\t.wide .r .bar i {\n\t\tborder-radius: 3px;\n\t\tbackground: var(--color-coral);\n\t}\n\t.wide .r b {\n\t\twidth: 34px;\n\t\tfont-size: 13.5px;\n\t}\n\t.wide .r.locked {\n\t\tfilter: blur(4px);\n\t\topacity: 0.55;\n\t}\n\t.wide .verdict {\n\t\tmargin-top: 22px;\n\t\tfont-size: 14px;\n\t\tline-height: 1.55;\n\t\tfont-style: italic;\n\t}\n\t.wide .veil {\n\t\tmargin-top: 20px;\n\t\tpadding: 16px;\n\t\tborder-radius: 13px;\n\t\tborder: 1px dashed var(--color-muted);\n\t\ttext-align: center;\n\t}\n\t.wide .veil b {\n\t\tfont-size: 14px;\n\t}\n\t.wide .veil span {\n\t\tmargin-top: 5px;\n\t\tfont-size: 12.5px;\n\t}\n\n\t/* ── compact wide: C + strip's desktop hero ── */\n\t.wide.compact {\n\t\tpadding: 24px;\n\t}\n\t.wide.compact .rows {\n\t\tmargin-top: 18px;\n\t\tgap: 8px;\n\t}\n\t.wide.compact .verdict {\n\t\tdisplay: none;\n\t}\n\t.wide.compact .veil {\n\t\tmargin-top: 18px;\n\t\tpadding: 12px;\n\t}\n</style>\n","import { trackLanding, type LandingEvent } from '$lib/analytics';\nimport { LANDING_VARIANT } from '$lib/landing-variant';\n\n/** landing_* events from the landing (see trackLanding), under the variant name\n *  the funnels have always split on. */\nexport function track(name: LandingEvent, props: Record<string, string | number> = {}) {\n\ttrackLanding(name, LANDING_VARIANT, props);\n}\n","<script lang=\"ts\">\n\t/**\n\t * The product strip: what C + strip (`feature_strip`, RAT-506) changes about\n\t * C. C's router sat under the hero, so its first screen showed one product at\n\t * most, and new visitors went straight into a product 10.7% of the time\n\t * against 18.6% on the control, whose hero is itself a list of products.\n\t * The strip puts all seven inside the first screen, right under the one CTA,\n\t * as something to scan rather than to read: an icon, a name, a few words.\n\t * No counters and no badges; the whole tile is the link.\n\t *\n\t * The studio leads: on the control its hero row was the most clicked\n\t * product (10.4% of viewers), and nearly every token a new visitor buys is\n\t * bought in the studio. It has two doors now — a film you direct, and a\n\t * session she leads with her voice — so it takes the first row as two tiles,\n\t * both in the studio's own white, where it was one wide tile; the colours\n\t * after them are ratemyd's own products.\n\t *\n\t * Phones: 2 × 4, the studio's pair first. From 1024px: 4 × 2.\n\t */\n\timport Icon from './Icon.svelte';\n\timport { track } from './track';\n\timport { t } from '$lib/i18n';\n\timport { msg } from '$lib/i18n/mark';\n\n\ttype Glyph = 'film' | 'session' | 'duel' | 'beat' | 'raters' | 'albums' | 'arena' | 'roleplay';\n\tinterface Tile {\n\t\tkey: Glyph;\n\t\t/** `route` on landing_route_picked, the same names the router used. */\n\t\troute: string;\n\t\thref: string;\n\t\tname: string;\n\t\thook: string;\n\t}\n\n\tconst TILES: Tile[] = [\n\t\t{\n\t\t\tkey: 'film',\n\t\t\troute: 'studio',\n\t\t\thref: '/studio',\n\t\t\tname: msg('make a film'),\n\t\t\thook: msg('you direct')\n\t\t},\n\t\t{\n\t\t\tkey: 'session',\n\t\t\troute: 'session',\n\t\t\thref: '/studio?session=1',\n\t\t\tname: msg('she leads'),\n\t\t\thook: msg('a guided session')\n\t\t},\n\t\t{\n\t\t\tkey: 'beat',\n\t\t\troute: 'beat-me',\n\t\t\thref: '/b/start',\n\t\t\tname: msg('beat me'),\n\t\t\thook: msg('strangers vote 24h')\n\t\t},\n\t\t{\n\t\t\tkey: 'duel',\n\t\t\troute: 'duel',\n\t\t\thref: '/d',\n\t\t\tname: msg('duel'),\n\t\t\thook: msg('1v1, AI judges both')\n\t\t},\n\t\t{\n\t\t\tkey: 'raters',\n\t\t\troute: 'raters',\n\t\t\thref: '/r',\n\t\t\tname: msg('real raters'),\n\t\t\thook: msg('a human rates you')\n\t\t},\n\t\t// A half tile holds ~17 characters on a 375px phone before the ellipsis.\n\t\t{\n\t\t\tkey: 'albums',\n\t\t\troute: 'albums',\n\t\t\thref: '/albums',\n\t\t\tname: msg('albums'),\n\t\t\thook: msg('private sets')\n\t\t},\n\t\t{ key: 'arena', route: 'arena', href: '/a', name: msg('arena'), hook: msg('swipe & match') },\n\t\t{\n\t\t\tkey: 'roleplay',\n\t\t\troute: 'roleplay',\n\t\t\thref: '/roleplay',\n\t\t\tname: msg('roleplay'),\n\t\t\thook: msg('AI-run worlds')\n\t\t}\n\t];\n\n\tconst picked = (route: string) => () =>\n\t\ttrack('landing_route_picked', { route, location: 'hero_strip' });\n</script>\n\n<nav class=\"strip\" aria-label={t('products')}>\n\t<p class=\"kicker\">{t('or jump straight in')}</p>\n\t<div class=\"grid\">\n\t\t{#each TILES as tile (tile.key)}\n\t\t\t<!-- The studio's tiles load natively: /studio only redirects to the\n\t\t\t\t studio's domain (RAT-561), carrying ?session= with it. -->\n\t\t\t<a\n\t\t\t\tclass={['tile', `k-${tile.key}`]}\n\t\t\t\thref={tile.href}\n\t\t\t\tdata-sveltekit-reload={tile.href.startsWith('/studio') ? '' : undefined}\n\t\t\t\tonclick={picked(tile.route)}\n\t\t\t>\n\t\t\t\t<span class=\"glyph\"><Icon name={tile.key} /></span>\n\t\t\t\t<span class=\"txt\">\n\t\t\t\t\t<span class=\"name\">{t(tile.name)}</span>\n\t\t\t\t\t<span class=\"hook\">{t(tile.hook)}</span>\n\t\t\t\t</span>\n\t\t\t</a>\n\t\t{/each}\n\t</div>\n</nav>\n\n<style>\n\t/* module colours: the same fills, inks and title tints as the router */\n\t.k-duel {\n\t\t--fill: var(--color-blue);\n\t\t--ink: #fff;\n\t\t--title: #5b9bff;\n\t}\n\t.k-film,\n\t.k-session {\n\t\t--fill: var(--color-text);\n\t\t--ink: var(--color-bg);\n\t\t--title: var(--color-text);\n\t}\n\t.k-albums {\n\t\t--fill: var(--color-fuchsia);\n\t\t--ink: #fff;\n\t\t--title: #e27af4;\n\t}\n\t.k-beat {\n\t\t--fill: var(--color-yellow);\n\t\t--ink: #1a1600;\n\t\t--title: var(--color-yellow);\n\t}\n\t.k-arena {\n\t\t--fill: var(--color-orange);\n\t\t--ink: #1a0a00;\n\t\t--title: #fb8a3c;\n\t}\n\t.k-roleplay {\n\t\t--fill: var(--color-purple);\n\t\t--ink: #fff;\n\t\t--title: #a78bfa;\n\t}\n\t.k-raters {\n\t\t--fill: var(--color-green);\n\t\t--ink: #052e14;\n\t\t--title: var(--color-green);\n\t}\n\n\t/* ── phone ── */\n\t.strip {\n\t\tmargin-top: 22px;\n\t}\n\t.kicker {\n\t\tmargin: 0 0 10px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 9.5px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: 0.2em;\n\t\ttext-transform: uppercase;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\t\tgap: 8px;\n\t}\n\t.tile {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tmin-width: 0;\n\t\tmin-height: 56px;\n\t\tpadding: 0 12px;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 13px;\n\t\tbackground: var(--color-surface);\n\t\tcolor: var(--color-text);\n\t\ttransition: background-color 180ms var(--ease-out-quart);\n\t}\n\t.tile:hover {\n\t\tcolor: var(--color-text);\n\t\tbackground: var(--color-surface-2);\n\t}\n\t.glyph {\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tflex: none;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tborder-radius: 9px;\n\t\tbackground: var(--fill);\n\t\tcolor: var(--ink);\n\t}\n\t.glyph :global(svg) {\n\t\twidth: 16px;\n\t\theight: 16px;\n\t}\n\t.txt {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmin-width: 0;\n\t}\n\t.name {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 14.5px;\n\t\tfont-weight: 700;\n\t\tline-height: 1.1;\n\t\tletter-spacing: -0.02em;\n\t\tcolor: var(--title);\n\t}\n\t.hook {\n\t\toverflow: hidden;\n\t\tfont-size: 11px;\n\t\tline-height: 1.3;\n\t\tcolor: var(--color-muted-2);\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t/* 320–360px phones: the text gets the room the padding had */\n\t@media (max-width: 360px) {\n\t\t.tile {\n\t\t\tgap: 8px;\n\t\t\tpadding: 0 10px;\n\t\t}\n\t}\n\n\t/* ── desktop: two rows of four under the hero ── */\n\t@media (min-width: 1024px) {\n\t\t.strip {\n\t\t\tmargin-top: 28px;\n\t\t}\n\t\t.kicker {\n\t\t\tmargin-bottom: 14px;\n\t\t\tfont-size: 10.5px;\n\t\t}\n\t\t.grid {\n\t\t\tgrid-template-columns: repeat(4, minmax(0, 1fr));\n\t\t\tgap: 12px;\n\t\t}\n\t\t.tile {\n\t\t\tflex-direction: column;\n\t\t\talign-items: flex-start;\n\t\t\tgap: 10px;\n\t\t\tmin-height: 118px;\n\t\t\tpadding: 16px;\n\t\t\tborder-radius: 16px;\n\t\t}\n\t\t.glyph {\n\t\t\twidth: 34px;\n\t\t\theight: 34px;\n\t\t\tborder-radius: 10px;\n\t\t}\n\t\t.glyph :global(svg) {\n\t\t\twidth: 18px;\n\t\t\theight: 18px;\n\t\t}\n\t\t.name {\n\t\t\tfont-size: 17px;\n\t\t}\n\t\t.hook {\n\t\t\tfont-size: 12.5px;\n\t\t\tline-height: 1.4;\n\t\t\twhite-space: normal;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport ResultCard from './ResultCard.svelte';\n\timport ProductStrip from './ProductStrip.svelte';\n\timport { track } from './track';\n\timport { RATED_COUNT_LABEL } from '$lib/proof';\n\timport { t } from '$lib/i18n';\n\n\t/** The homepage hero (C + strip, RAT-555): one CTA, and every product under\n\t *  it inside the first screen. */\n\tlet { ratersOnline }: { ratersOnline: number } = $props();\n</script>\n\n<section class=\"hero\">\n\t<div class=\"wrap grid\">\n\t\t<div class=\"copy\">\n\t\t\t{#if ratersOnline > 0}\n\t\t\t\t<p class=\"live\">\n\t\t\t\t\t<span class=\"pulse\"></span>{ratersOnline === 1\n\t\t\t\t\t\t? t('1 rater online now')\n\t\t\t\t\t\t: t('{n} raters online now', { n: ratersOnline })}\n\t\t\t\t</p>\n\t\t\t{/if}\n\t\t\t<!-- The small first line is part of the H1 so the heading carries the\n\t\t\t\t phrase people search for (\"dick rating\"), word for word as the old\n\t\t\t\t landing's H1 had it since the SEO pass of 2026-09-27 (RAT-499). -->\n\t\t\t<h1 class=\"d\">\n\t\t\t\t<span class=\"kicker\"\n\t\t\t\t\t>{t('AI dick rating · {count} rated · 0 stored · many regrets', {\n\t\t\t\t\t\tcount: RATED_COUNT_LABEL\n\t\t\t\t\t})}</span\n\t\t\t\t>\n\t\t\t\t{t('honest dick ratings.')}<br /><span class=\"dim\">{t('finally.')}</span>\n\t\t\t</h1>\n\t\t\t<p class=\"p sub\">{t('an AI and real raters score your dick in ten seconds.')}</p>\n\t\t\t<div class=\"acts\">\n\t\t\t\t<a\n\t\t\t\t\tclass=\"cta\"\n\t\t\t\t\thref=\"/rate\"\n\t\t\t\t\tonclick={() => track('landing_cta_clicked', { location: 'hero' })}\n\t\t\t\t\t>{t('get rated for free')}</a\n\t\t\t\t>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"card\">\n\t\t\t<ResultCard layout=\"wide\" compact />\n\t\t</div>\n\t</div>\n\t<div class=\"wrap\"><ProductStrip /></div>\n</section>\n\n<style>\n\t/* Tight on a phone so the CTA and all seven products fit the first screen of\n\t   a 375 × 812 phone above the bottom nav. */\n\t.hero {\n\t\tpadding: 28px 0 34px;\n\t}\n\t.copy {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: flex-start;\n\t}\n\t.live {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmargin: 0 0 14px;\n\t\tfont-size: 11.5px;\n\t\tline-height: 1.4;\n\t\tcolor: var(--color-muted);\n\t}\n\t.live .pulse {\n\t\twidth: 6px;\n\t\theight: 6px;\n\t}\n\th1 {\n\t\tmargin: 0;\n\t\tfont-size: 38px;\n\t\tline-height: 1.02;\n\t\tletter-spacing: -0.04em;\n\t}\n\t/* One quiet line, sized to stay on one line on a 375px phone. */\n\th1 .kicker {\n\t\tdisplay: block;\n\t\tmargin-bottom: 10px;\n\t\tfont-family: var(--font-body);\n\t\tfont-size: 11px;\n\t\tfont-weight: 500;\n\t\tline-height: 1.4;\n\t\tletter-spacing: 0;\n\t\tcolor: var(--color-muted);\n\t}\n\th1 .dim {\n\t\tcolor: var(--color-muted);\n\t}\n\t.sub {\n\t\tmargin-top: 14px;\n\t\tmax-width: 290px;\n\t}\n\t.acts {\n\t\talign-self: stretch;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tmargin-top: 20px;\n\t}\n\t.acts .cta {\n\t\talign-self: stretch;\n\t}\n\t.card {\n\t\tdisplay: none;\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t/* The strip's row has to fit under the hero in a laptop's first screen\n\t\t   (1440 × ~780 inside the browser): less air, a smaller headline, and the\n\t\t   sample card without its verdict line (ResultCard compact). */\n\t\t.hero {\n\t\t\tpadding: 32px 0 24px;\n\t\t}\n\t\t.grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: minmax(0, 1fr) 452px;\n\t\t\tgap: 80px;\n\t\t\talign-items: center;\n\t\t}\n\t\t.live {\n\t\t\tmargin-bottom: 20px;\n\t\t\tfont-size: 13px;\n\t\t}\n\t\t.live .pulse {\n\t\t\twidth: 7px;\n\t\t\theight: 7px;\n\t\t}\n\t\th1 {\n\t\t\tfont-size: 64px;\n\t\t\tline-height: 0.96;\n\t\t\tletter-spacing: -0.045em;\n\t\t}\n\t\th1 .kicker {\n\t\t\tmargin-bottom: 14px;\n\t\t\tfont-size: 13px;\n\t\t}\n\t\t.sub {\n\t\t\tmargin-top: 18px;\n\t\t\tmax-width: 480px;\n\t\t\tfont-size: 19px;\n\t\t}\n\t\t.acts {\n\t\t\tflex-direction: row;\n\t\t\talign-items: center;\n\t\t\tgap: 26px;\n\t\t\tmargin-top: 28px;\n\t\t}\n\t\t.acts .cta {\n\t\t\talign-self: auto;\n\t\t}\n\t\t.card {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n</style>\n","import { openAuthSheet } from '$lib/stores/authSheet';\nimport { track } from './track';\n\n/** Where \"start earning\" goes: the creator tab of your own profile. */\nexport const EARN_HREF = '/p?tab=creator';\n\n/** Click handler for every \"start earning\" link on the page. Signed out, /p\n *  bounces to /rate, so open the sign-in sheet with the creator tab as `next`\n *  instead of following the link. */\nexport function startEarning(e: MouseEvent, signedIn: boolean, location: string) {\n\ttrack('landing_secondary_clicked', { location });\n\tif (signedIn) return;\n\te.preventDefault();\n\topenAuthSheet(EARN_HREF);\n}\n","import { msg } from '$lib/i18n/mark';\nimport { AVERAGE_SCORE_LABEL, RATED_COUNT_LABEL } from '$lib/proof';\nimport { BJU_2015 } from '$lib/data/size-stats';\nimport { EARN_HREF } from './signup-first/earn';\n\n/**\n * Copy for HomeGuide, the block every arm of the landing test renders the\n * same way. It says what the page does in the words people search with\n * (rate my dick / cock / penis, AI dick rating, penis rating, dick raters)\n * and answers what people ask before they upload. The first five questions\n * are the signup-first landing's objections, kept word for word; the rest\n * are the questions the search terms stand for.\n *\n * Every line is English source marked with msg() and shown through t(); the\n * figures go in as `params` (numbers are formatted in the page's language).\n */\n\n/** Values for a line's `{placeholders}`. */\nexport type CopyParams = Record<string, string | number>;\n\nexport type GuideLink = {\n\thref: string;\n\tlabel: string;\n\t/** landing_* route name; `earn` opens the sign-in sheet when signed out. */\n\troute: string;\n};\n\nexport type GuideBlock = {\n\tid: string;\n\ttitle: string;\n\tbody: string;\n\tparams?: CopyParams;\n\tlink?: GuideLink;\n};\n\nexport const GUIDE: GuideBlock[] = [\n\t{\n\t\tid: 'rate',\n\t\ttitle: msg('rate my dick, cock or penis.'),\n\t\tbody: msg(\n\t\t\t'same thing, three words. upload one pic and the AI gives you an honest 0–10 dick rating in about 10 seconds, whatever you call it. your first one is free, no card, and the photo is deleted the moment the score is done.'\n\t\t),\n\t\tlink: { href: '/rate', label: msg('try the AI dick rater →'), route: 'rate' }\n\t},\n\t{\n\t\tid: 'how',\n\t\ttitle: msg('how the AI dick rating works.'),\n\t\tbody: msg(\n\t\t\t'the AI dick rater scores six things from 0 to 10: proportions, aesthetics, grooming, photo quality, lighting and overall vibe, then weights them into one score. roast mode is brutal, hype mode is kind. the average across {count} ratings is {avg}.'\n\t\t),\n\t\tparams: { count: RATED_COUNT_LABEL, avg: AVERAGE_SCORE_LABEL },\n\t\tlink: { href: '/stats/ai-ratings', label: msg('see the rating stats →'), route: 'stats' }\n\t},\n\t{\n\t\tid: 'raters',\n\t\t// RAT-593: \"dick rating site / website\" sat at 5–8 on this page; the\n\t\t// heading says what the site is, and the link carries the raters' name.\n\t\ttitle: msg('a dick rating site with real raters: honest, SPH or praise.'),\n\t\tbody: msg(\n\t\t\t'want a person instead of the AI? 5,000+ verified raters do dick rating for tokens, 1:1 in a private chat or live in a group. pick one, check their price, send one pic.'\n\t\t),\n\t\tlink: { href: '/r', label: msg('dick rating by real raters →'), route: 'raters' }\n\t},\n\t// RAT-599: the pages ranking for this page's searches run 550–1,050 words;\n\t// these two close the page, below where most visitors scroll.\n\t{\n\t\tid: 'ways',\n\t\ttitle: msg('three ways to get your dick rated.'),\n\t\tbody: msg(\n\t\t\t'the AI dick rater scores your pic in about 10 seconds, and no person sees it. a real rater writes back in their own words: honest, SPH or praise. a public duel puts your pic next to a challenger’s and lets everyone vote for 24 hours. start with the free AI rating, then add a person or the crowd for a second opinion.'\n\t\t),\n\t\tlink: { href: '/b', label: msg('public dick duels →'), route: 'duels' }\n\t},\n\t{\n\t\tid: 'photo',\n\t\ttitle: msg('what makes a good dick pic.'),\n\t\tbody: msg(\n\t\t\t'light from a window beats the ceiling lamp. sharp beats close: getting nearer adds nothing, because the AI judges size against your hand and what’s around it. a plain background and one subject, framed on purpose. lighting and photo quality are where most points go, so a better photo is the fastest way to a higher dick rating.'\n\t\t),\n\t\tlink: { href: '/rate', label: msg('get your dick rated →'), route: 'rate' }\n\t}\n];\n\nexport type FaqItem = {\n\tq: string;\n\ta: string;\n\tparams?: CopyParams;\n\tlink?: GuideLink;\n\t/** Links the most-searched size pages under the answer (RAT-609, RAT-610). */\n\tsizes?: true;\n};\n\nexport const FAQ: FaqItem[] = [\n\t{\n\t\tq: msg('does anyone see my photo?'),\n\t\ta: msg('only the AI, unless you order a human rating. the file is deleted right after.')\n\t},\n\t{\n\t\tq: msg('is the score actually accurate?'),\n\t\ta: msg(\n\t\t\t'the AI scores every photo on the same criteria, every time. no mood, no bias, no bad days.'\n\t\t)\n\t},\n\t{\n\t\tq: msg('is the AI dick rater free? what does it cost?'),\n\t\ta: msg(\n\t\t\t'your first AI rating is free. premium unlocks the full breakdown, and tokens pay for the extras: human raters and private sets.'\n\t\t),\n\t\t// RAT-592: the AI words point at the rater itself, not back at this page\n\t\tlink: { href: '/rate', label: msg('get a free AI dick rating →'), route: 'rate' }\n\t},\n\t{\n\t\tq: msg('what shows up on my card statement?'),\n\t\ta: msg(\n\t\t\t'a neutral company name. nothing on your statement says what the site is or what you bought.'\n\t\t)\n\t},\n\t{\n\t\tq: msg('can i make money here?'),\n\t\ta: msg('yes, if you’re active. top raters clear four figures in a good month.'),\n\t\tlink: { href: EARN_HREF, label: msg('start earning →'), route: 'earn' }\n\t},\n\t{\n\t\tq: msg('can i rate my cock or my penis, not just my dick?'),\n\t\ta: msg(\n\t\t\t'yes. dick, cock, penis: the AI doesn’t care what you call it. same six scores, same honest penis rating, same 10 seconds.'\n\t\t)\n\t},\n\t{\n\t\tq: msg('what’s a good dick rating?'),\n\t\ta: msg(\n\t\t\t'the average AI dick rating is {avg} out of 10. most points get lost on lighting and grooming, so a better photo is the cheapest upgrade there is.'\n\t\t),\n\t\tparams: { avg: AVERAGE_SCORE_LABEL },\n\t\tlink: { href: '/stats/ai-ratings', label: msg('see the score breakdown →'), route: 'stats' }\n\t},\n\t{\n\t\tq: msg('can real people rate my dick?'),\n\t\ta: msg(\n\t\t\t'yes. verified raters do human dick ratings, honest, SPH or praise, 1:1 in chat or live in a group.'\n\t\t),\n\t\tlink: { href: '/r', label: msg('dick rating by real raters →'), route: 'raters' }\n\t},\n\t{\n\t\tq: msg('how big is the average penis?'),\n\t\ta: msg('{cm} cm ({inches} in) erect, from a meta-analysis of {men} measured men.'),\n\t\tparams: {\n\t\t\tcm: BJU_2015.erectLength.meanCm,\n\t\t\tinches: BJU_2015.erectLength.meanIn,\n\t\t\tmen: BJU_2015.source.sampleSize\n\t\t},\n\t\tlink: {\n\t\t\thref: '/tools/penis-size-calculator',\n\t\t\tlabel: msg('penis size calculator →'),\n\t\t\troute: 'calculator'\n\t\t},\n\t\tsizes: true\n\t},\n\t{\n\t\tq: msg('how do i compare my size?'),\n\t\ta: msg(\n\t\t\t'put your length and girth next to the average, a phone or a soda can, drawn to scale, or line up two sizes side by side. nothing is stored.'\n\t\t),\n\t\tlink: {\n\t\t\thref: '/tools/penis-size-visualizer',\n\t\t\tlabel: msg('dick size comparison →'),\n\t\t\troute: 'visualizer'\n\t\t}\n\t},\n\t{\n\t\tq: msg('what condom size do i need?'),\n\t\ta: msg(\n\t\t\t'it goes by girth, not length: a condom about 45% as wide as your girth, laid flat. the average girth takes a 53 mm condom.'\n\t\t),\n\t\tlink: {\n\t\t\thref: '/tools/condom-size-calculator',\n\t\t\tlabel: msg('condom size calculator →'),\n\t\t\troute: 'condom'\n\t\t}\n\t},\n\t{\n\t\tq: msg('is ratemyd safe and legit?'),\n\t\ta: msg(\n\t\t\t'18+ only. your photo is deleted right after the rating, payments go through stripe under a neutral name, and you can delete your account any time.'\n\t\t)\n\t}\n];\n","<script lang=\"ts\">\n\t/**\n\t * The one block of plain, descriptive copy on `/`: the rating explained and\n\t * the questions people ask before uploading. It ran identical in every arm\n\t * of the landing test so search read the same copy whichever arm it got;\n\t * since the test ended (RAT-555) every visitor and crawler gets the strip\n\t * landing, with this block closing it. Copy lives in home-guide.ts.\n\t *\n\t * It replaces the signup-first landing's Objections block: the same five\n\t * questions come first, and the same landing_* events fire, tagged with the\n\t * landing's variant name.\n\t */\n\timport { trackLanding } from '$lib/analytics';\n\timport { DEFAULT_LOCALE, LOCALE_INFO, lhref, locale, t } from '$lib/i18n';\n\timport { openAuthSheet } from '$lib/stores/authSheet';\n\timport { sizePageBySlug, sizePagePath } from '$lib/tools/size-pages';\n\timport Icon from './signup-first/Icon.svelte';\n\timport { FAQ, GUIDE, type CopyParams, type GuideLink } from './home-guide';\n\n\tlet { variant, signedIn }: { variant: string; signedIn: boolean } = $props();\n\n\t/** The sizes searched most (\"7 inch penis\" 12.1K, \"6 inch\" 9.9K a month):\n\t *  the inch pages in English, the page's own cm pages in the other languages. */\n\tfunction sizeLinks(): GuideLink[] {\n\t\tconst slugs =\n\t\t\tlocale() === DEFAULT_LOCALE\n\t\t\t\t? ['5-inches', '6-inches', '7-inches', '8-inches']\n\t\t\t\t: ['13-cm', '15-cm', '18-cm', '20-cm'];\n\t\treturn slugs.flatMap((slug) => {\n\t\t\tconst row = sizePageBySlug(slug);\n\t\t\tif (!row) return [];\n\t\t\tconst label = row.unit === 'in' ? `${row.value} inch` : `${row.value} cm`;\n\t\t\treturn [{ href: lhref(sizePagePath(row)), label, route: 'size_page' }];\n\t\t});\n\t}\n\n\t/** A line's figures, numbers in the page's language (English as it always\n\t *  read: en-US). Labels that are already text go in as they are. */\n\tfunction figures(params?: CopyParams): CopyParams | undefined {\n\t\tif (!params) return undefined;\n\t\tconst tag = locale() === DEFAULT_LOCALE ? 'en-US' : LOCALE_INFO[locale()].hreflang;\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(params).map(([k, v]) => [k, typeof v === 'number' ? v.toLocaleString(tag) : v])\n\t\t);\n\t}\n\n\tfunction faqToggled(e: Event, q: string) {\n\t\tif ((e.currentTarget as HTMLDetailsElement).open) {\n\t\t\ttrackLanding('landing_faq_opened', variant, { question: q });\n\t\t}\n\t}\n\n\tfunction linkClicked(e: MouseEvent, link: GuideLink, location: string) {\n\t\tif (link.route === 'earn') {\n\t\t\ttrackLanding('landing_secondary_clicked', variant, { location });\n\t\t\t// Signed out, the creator tab bounces to /rate: ask to sign in first.\n\t\t\tif (!signedIn) {\n\t\t\t\te.preventDefault();\n\t\t\t\topenAuthSheet(link.href);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\ttrackLanding('landing_route_picked', variant, { route: link.route, location });\n\t}\n</script>\n\n<section class=\"guide\" aria-labelledby=\"guide-rate\">\n\t<div class=\"wrap\">\n\t\t<div class=\"blocks\">\n\t\t\t{#each GUIDE as block (block.id)}\n\t\t\t\t<article class=\"block\" id={block.id === 'how' ? 'how' : undefined}>\n\t\t\t\t\t<h2 id=\"guide-{block.id}\">{t(block.title)}</h2>\n\t\t\t\t\t<p>{t(block.body, figures(block.params))}</p>\n\t\t\t\t\t{#if block.link}\n\t\t\t\t\t\t{@const link = block.link}\n\t\t\t\t\t\t<a class=\"more\" href={link.href} onclick={(e) => linkClicked(e, link, 'guide')}\n\t\t\t\t\t\t\t>{t(link.label)}</a\n\t\t\t\t\t\t>\n\t\t\t\t\t{/if}\n\t\t\t\t</article>\n\t\t\t{/each}\n\t\t</div>\n\n\t\t<div class=\"faq-grid\">\n\t\t\t<div class=\"side\">\n\t\t\t\t<!-- One sentence: {br} is where it breaks onto the <em> line. -->\n\t\t\t\t<h2>\n\t\t\t\t\t{#each t(\"the part you're {br}worried about.\").split('{br}') as part, i (i)}{#if i}<br\n\t\t\t\t\t\t\t/><em>{part.trim()}</em>{:else}{part.trim()}{/if}{/each}\n\t\t\t\t</h2>\n\t\t\t\t<p class=\"intro\">\n\t\t\t\t\t{t('what people ask before they upload anything. straight answers, no legal pages.')}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<div class=\"faq\">\n\t\t\t\t{#each FAQ as item (item.q)}\n\t\t\t\t\t<details ontoggle={(e) => faqToggled(e, item.q)}>\n\t\t\t\t\t\t<summary\n\t\t\t\t\t\t\t><span>{t(item.q)}</span><span class=\"cv\" aria-hidden=\"true\"\n\t\t\t\t\t\t\t\t><Icon name=\"chevron-down\" /></span\n\t\t\t\t\t\t\t></summary\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t{t(item.a, figures(item.params))}\n\t\t\t\t\t\t\t{#if item.link}\n\t\t\t\t\t\t\t\t{@const link = item.link}\n\t\t\t\t\t\t\t\t<a href={link.href} onclick={(e) => linkClicked(e, link, 'faq')}>{t(link.label)}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if item.sizes}\n\t\t\t\t\t\t\t\t<span class=\"sizes\"\n\t\t\t\t\t\t\t\t\t>{t('by size:')}\n\t\t\t\t\t\t\t\t\t{#each sizeLinks() as size, i (size.href)}{#if i}<span class=\"sep\" aria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t>·</span\n\t\t\t\t\t\t\t\t\t\t\t>{/if}<a\n\t\t\t\t\t\t\t\t\t\t\thref={size.href}\n\t\t\t\t\t\t\t\t\t\t\tonclick={(e) => linkClicked(e, size, 'faq')}>{size.label}</a\n\t\t\t\t\t\t\t\t\t\t>{/each}</span\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</details>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</section>\n\n<style>\n\t.guide {\n\t\tpadding: 40px 0;\n\t\tborder-top: 1px solid var(--color-border);\n\t\tfont-family: var(--font-body);\n\t\tcolor: var(--color-text);\n\t}\n\t.wrap {\n\t\tmax-width: 720px;\n\t\tmargin: 0 auto;\n\t\tpadding: 0 22px;\n\t}\n\th2 {\n\t\tmargin: 0;\n\t\tfont-family: var(--font-display);\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.03em;\n\t\tcolor: var(--color-text);\n\t}\n\th2 em {\n\t\tfont-style: normal;\n\t\tcolor: var(--color-muted);\n\t}\n\n\t.blocks {\n\t\tdisplay: grid;\n\t\tgap: 28px;\n\t}\n\t.block {\n\t\tscroll-margin-top: 80px;\n\t}\n\t.block h2 {\n\t\tfont-size: 22px;\n\t\tline-height: 1.1;\n\t}\n\t.block p {\n\t\tmargin: 10px 0 0;\n\t\tfont-size: 14px;\n\t\tline-height: 1.6;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.more {\n\t\tdisplay: inline-block;\n\t\tmargin-top: 10px;\n\t\tpadding-bottom: 2px;\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 13px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-text);\n\t\ttext-decoration: none;\n\t}\n\t.more:hover {\n\t\tborder-bottom-color: var(--color-coral);\n\t}\n\n\t.faq-grid {\n\t\tmargin-top: 40px;\n\t\tpadding-top: 32px;\n\t\tborder-top: 1px solid var(--color-border);\n\t}\n\t.side h2 {\n\t\tfont-size: 28px;\n\t\tline-height: 1;\n\t}\n\t.intro {\n\t\tdisplay: none;\n\t}\n\t.faq {\n\t\tmargin-top: 16px;\n\t\tdisplay: grid;\n\t\tgap: 1px;\n\t\tbackground: var(--color-border);\n\t\tborder-radius: 14px;\n\t\toverflow: hidden;\n\t}\n\tdetails {\n\t\tbackground: var(--color-surface);\n\t}\n\tsummary {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 12px;\n\t\tpadding: 14px 13px;\n\t\tcursor: pointer;\n\t\tlist-style: none;\n\t}\n\tsummary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\tsummary > span:first-child {\n\t\tflex: 1 1 auto;\n\t\tmin-width: 0;\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tline-height: 1.35;\n\t\tcolor: var(--color-text);\n\t}\n\t.cv {\n\t\tflex: 0 0 auto;\n\t\tdisplay: flex;\n\t\tmargin-top: 1px;\n\t\tcolor: var(--color-muted);\n\t\ttransition: transform 220ms var(--ease-out-quart);\n\t}\n\t.cv :global(svg) {\n\t\twidth: 15px;\n\t\theight: 15px;\n\t}\n\tdetails[open] .cv {\n\t\ttransform: rotate(180deg);\n\t}\n\tdetails p {\n\t\tmargin: 0;\n\t\tpadding: 0 13px 14px;\n\t\tfont-size: 12.5px;\n\t\tline-height: 1.5;\n\t\tcolor: var(--color-muted-2);\n\t}\n\tdetails p a {\n\t\tcolor: var(--color-text);\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\ttext-decoration: none;\n\t\twhite-space: nowrap;\n\t}\n\tdetails p a:hover {\n\t\tborder-bottom-color: var(--color-coral);\n\t}\n\t.sizes {\n\t\tdisplay: block;\n\t\tmargin-top: 8px;\n\t}\n\t.sep {\n\t\tmargin: 0 6px;\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t.guide {\n\t\t\tpadding: 72px 0;\n\t\t}\n\t\t.wrap {\n\t\t\tmax-width: 1120px;\n\t\t\tpadding: 0 40px;\n\t\t}\n\t\t.blocks {\n\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\tgap: 48px;\n\t\t}\n\t\t.block h2 {\n\t\t\tfont-size: 26px;\n\t\t}\n\t\t.block p {\n\t\t\tfont-size: 15px;\n\t\t}\n\t\t.faq-grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: 340px minmax(0, 1fr);\n\t\t\tgap: 80px;\n\t\t\talign-items: start;\n\t\t\tmargin-top: 64px;\n\t\t\tpadding-top: 56px;\n\t\t}\n\t\t.side h2 {\n\t\t\tfont-size: 40px;\n\t\t}\n\t\t.intro {\n\t\t\tdisplay: block;\n\t\t\tmargin: 22px 0 0;\n\t\t\tmax-width: 320px;\n\t\t\tfont-size: 15px;\n\t\t\tline-height: 1.55;\n\t\t\tcolor: var(--color-muted-2);\n\t\t}\n\t\t.faq {\n\t\t\tmargin-top: 0;\n\t\t\tborder-radius: 16px;\n\t\t}\n\t\tsummary {\n\t\t\tgap: 16px;\n\t\t\tpadding: 22px 24px;\n\t\t}\n\t\tsummary > span:first-child {\n\t\t\tfont-size: 17px;\n\t\t}\n\t\t.cv {\n\t\t\tmargin-top: 2px;\n\t\t}\n\t\t.cv :global(svg) {\n\t\t\twidth: 18px;\n\t\t\theight: 18px;\n\t\t}\n\t\tdetails p {\n\t\t\tpadding: 0 24px 22px;\n\t\t\tmax-width: 640px;\n\t\t\tfont-size: 15px;\n\t\t\tline-height: 1.55;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * \"people are already doing this\" — the week's three top-voted posts, as compact\n\t * cards. Not PostCard: that is the full feed card (voting, comments, and a\n\t * broken image calls invalidateAll(), which here would re-run the landing's\n\t * whole load). These are links into the post and nothing else.\n\t */\n\timport { DEFAULT_LOCALE, LOCALE_INFO, locale, t } from '$lib/i18n';\n\timport type { LandingPost } from '$lib/landing-variant';\n\timport { openAuthSheet } from '$lib/stores/authSheet';\n\timport Icon from './Icon.svelte';\n\timport { track } from './track';\n\n\tlet {\n\t\tposts,\n\t\tpostsToday,\n\t\tsignedIn\n\t}: { posts: LandingPost[]; postsToday: number; signedIn: boolean } = $props();\n\n\tlet broken = $state<Record<string, boolean>>({});\n\n\tfunction age(iso: string): string {\n\t\tconst mins = Math.max(1, Math.floor((Date.now() - new Date(iso).getTime()) / 60000));\n\t\tif (mins < 60) return t('{n}m', { n: mins });\n\t\tconst h = Math.floor(mins / 60);\n\t\treturn h < 24 ? t('{n}h', { n: h }) : t('{n}d', { n: Math.floor(h / 24) });\n\t}\n\n\t// English keeps the en-US grouping it always had; the others their own.\n\tconst num = (n: number) =>\n\t\tn.toLocaleString(locale() === DEFAULT_LOCALE ? 'en-US' : LOCALE_INFO[locale()].hreflang);\n\n\tfunction wallClick(e: MouseEvent) {\n\t\ttrack('landing_route_picked', { route: 'feed', location: 'feed_wall' });\n\t\tif (signedIn) return;\n\t\te.preventDefault();\n\t\topenAuthSheet('/f');\n\t}\n</script>\n\n<section class=\"sec\">\n\t<div class=\"wrap\">\n\t\t<div class=\"shd\">\n\t\t\t<!-- One sentence: {br} is where it breaks onto the <em> line. -->\n\t\t\t<h2 class=\"d h2\">\n\t\t\t\t{#each t('people are already {br}doing this. right now.').split('{br}') as part, i (i)}{#if i}<br\n\t\t\t\t\t\t/><em>{part.trim()}</em>{:else}{part.trim()}{/if}{/each}\n\t\t\t</h2>\n\t\t\t<a\n\t\t\t\tclass=\"quiet desk\"\n\t\t\t\thref=\"/f\"\n\t\t\t\tonclick={() => track('landing_route_picked', { route: 'feed', location: 'feed_header' })}\n\t\t\t\t>{t('open the feed')}<span class=\"arw\"><Icon name=\"arrow-right\" /></span></a\n\t\t\t>\n\t\t</div>\n\t\t<div class=\"list\">\n\t\t\t{#each posts as p (p.id)}\n\t\t\t\t<a\n\t\t\t\t\tclass=\"fc\"\n\t\t\t\t\thref=\"/post/{p.id}\"\n\t\t\t\t\tonclick={() => track('landing_route_picked', { route: 'post', location: 'feed_card' })}\n\t\t\t\t>\n\t\t\t\t\t<span class=\"hd\">\n\t\t\t\t\t\t<span class=\"av\">{p.nickname.charAt(0).toUpperCase()}</span>\n\t\t\t\t\t\t<span class=\"who\"><b>@{p.nickname}</b><span>{age(p.createdAt)}</span></span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<!-- rendered empty too: the slot keeps every card's image level -->\n\t\t\t\t\t<span class=\"cap\">{p.caption ?? ''}</span>\n\t\t\t\t\t<span class=\"m\">\n\t\t\t\t\t\t{#if p.mediaUrl && !broken[p.id]}\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={p.mediaUrl}\n\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\t\t\tonerror={() => (broken[p.id] = true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<Icon name=\"photo\" class=\"ph\" />\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\"ft\">\n\t\t\t\t\t\t<span class=\"vote\"\n\t\t\t\t\t\t\t><svg\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2.2\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 5l7 7H5z\" /></svg\n\t\t\t\t\t\t\t><b>{p.netScore}</b><span class=\"sr\">{t('votes')}</span></span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"cm\"\n\t\t\t\t\t\t\t><svg\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t><path\n\t\t\t\t\t\t\t\t\td=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"\n\t\t\t\t\t\t\t\t/></svg\n\t\t\t\t\t\t\t>{p.commentCount}<span class=\"sr\">{t('comments')}</span></span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t{#if p.boostCount > 0}\n\t\t\t\t\t\t\t<span class=\"bo\"\n\t\t\t\t\t\t\t\t><svg\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.8\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t><path d=\"M12 4l1.9 5.1L19 11l-5.1 1.9L12 18l-1.9-5.1L5 11l5.1-1.9z\" /></svg\n\t\t\t\t\t\t\t\t>{p.boostCount}<span class=\"sr\">{t('boosts')}</span></span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t{/each}\n\t\t\t<a class=\"wall\" href=\"/f\" onclick={wallClick}>\n\t\t\t\t{#if postsToday > 0}\n\t\t\t\t\t<span class=\"n\">{num(postsToday)}</span>\n\t\t\t\t\t<span class=\"t\">{postsToday === 1 ? t('post today') : t('posts today')}</span>\n\t\t\t\t{:else}\n\t\t\t\t\t<span class=\"t\">{t('the whole feed')}</span>\n\t\t\t\t{/if}\n\t\t\t\t<span class=\"g\"\n\t\t\t\t\t>{signedIn ? t('open the feed') : t('sign up free')}<span class=\"arw\"\n\t\t\t\t\t\t><Icon name=\"arrow-right\" /></span\n\t\t\t\t\t></span\n\t\t\t\t>\n\t\t\t</a>\n\t\t</div>\n\t</div>\n</section>\n\n<style>\n\t.desk {\n\t\tdisplay: none;\n\t}\n\t.sr {\n\t\tposition: absolute;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0 0 0 0);\n\t\twhite-space: nowrap;\n\t}\n\t/* phone: a scroll-snap rail that bleeds to the screen edge */\n\t.list {\n\t\tdisplay: flex;\n\t\tgap: 10px;\n\t\toverflow-x: auto;\n\t\tscroll-snap-type: x mandatory;\n\t\t/* without it the snap pulls the first card flush to the screen edge */\n\t\tscroll-padding-inline: 22px;\n\t\tmargin: 16px -22px 0;\n\t\tpadding: 0 22px 4px;\n\t\tscrollbar-width: none;\n\t}\n\t.list::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\t.list > a {\n\t\tscroll-snap-align: start;\n\t\tflex: none;\n\t}\n\t.fc {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: 242px;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 16px;\n\t\toverflow: hidden;\n\t\tbackground: var(--color-surface);\n\t\tcolor: var(--color-text);\n\t}\n\t.hd {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 11px 12px 9px;\n\t}\n\t.av {\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tflex: none;\n\t\twidth: 26px;\n\t\theight: 26px;\n\t\tborder-radius: 50%;\n\t\tborder: 1px solid var(--color-border);\n\t\tbackground: var(--color-surface-2);\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 11px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.who {\n\t\tmin-width: 0;\n\t\tflex: 1;\n\t}\n\t.who b {\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tletter-spacing: -0.01em;\n\t}\n\t.who span {\n\t\tdisplay: block;\n\t\tmargin-top: 1px;\n\t\tfont-size: 11px;\n\t\tcolor: var(--color-muted);\n\t}\n\t/* Two lines exactly, with an ellipsis, whatever the caption: the fixed\n\t   slot is what keeps every card's image at the same height and position.\n\t   Margin, not padding: padding sits inside the clip, and a third line\n\t   used to show through it. */\n\t.cap {\n\t\tdisplay: -webkit-box;\n\t\t-webkit-line-clamp: 2;\n\t\tline-clamp: 2;\n\t\t-webkit-box-orient: vertical;\n\t\toverflow: hidden;\n\t\toverflow-wrap: anywhere;\n\t\theight: calc(2 * 1.45em);\n\t\tmargin: 0 12px 9px;\n\t\tfont-size: 12.5px;\n\t\tline-height: 1.45;\n\t}\n\t/* fixed height: square inside the 242px card's borders */\n\t.m {\n\t\tposition: relative;\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tflex: none;\n\t\theight: 240px;\n\t\tbackground: var(--color-bg);\n\t\toverflow: hidden;\n\t}\n\t.m img {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tobject-fit: cover;\n\t}\n\t.m :global(.ph) {\n\t\twidth: 34px;\n\t\theight: 34px;\n\t\tcolor: var(--color-border);\n\t}\n\t.ft {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 12px;\n\t\tmargin-top: auto;\n\t\tpadding: 10px 12px 11px;\n\t\tfont-size: 12.5px;\n\t\tcolor: var(--color-muted);\n\t}\n\t.ft > span {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 5px;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\t.ft svg {\n\t\twidth: 15px;\n\t\theight: 15px;\n\t}\n\t.vote b {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 12.5px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-text);\n\t}\n\t.bo {\n\t\tmargin-left: auto;\n\t\tcolor: var(--color-token);\n\t}\n\t.wall {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 5px;\n\t\twidth: 170px;\n\t\tpadding: 20px 14px;\n\t\tborder: 1px dashed var(--color-muted);\n\t\tborder-radius: 16px;\n\t\tbackground: var(--color-surface);\n\t\ttext-align: center;\n\t}\n\t.wall .n {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 26px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.03em;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: var(--color-text);\n\t}\n\t.wall .t {\n\t\tfont-size: 11.5px;\n\t\tcolor: var(--color-muted);\n\t}\n\t.wall .g {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 5px;\n\t\tmargin-top: 8px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 12.5px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-coral);\n\t}\n\t.wall .g .arw {\n\t\tcolor: var(--color-coral);\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t.desk {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t\t.list {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(4, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\toverflow: visible;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.fc {\n\t\t\twidth: auto;\n\t\t\tborder-radius: 18px;\n\t\t}\n\t\t.hd {\n\t\t\tgap: 10px;\n\t\t\tpadding: 14px 16px 11px;\n\t\t}\n\t\t.av {\n\t\t\twidth: 30px;\n\t\t\theight: 30px;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.who b {\n\t\t\tfont-size: 14px;\n\t\t}\n\t\t.who span {\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.cap {\n\t\t\tmargin: 0 16px 12px;\n\t\t\tfont-size: 13.5px;\n\t\t\tcolor: var(--color-muted-2);\n\t\t}\n\t\t.m {\n\t\t\theight: 190px;\n\t\t\tborder-top: 1px solid var(--color-border);\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t}\n\t\t.ft {\n\t\t\tgap: 16px;\n\t\t\tpadding: 12px 16px;\n\t\t}\n\t\t.vote b {\n\t\t\tfont-size: 13.5px;\n\t\t}\n\t\t.wall {\n\t\t\twidth: auto;\n\t\t\tgap: 8px;\n\t\t\tpadding: 28px;\n\t\t\tborder-radius: 18px;\n\t\t}\n\t\t.wall .n {\n\t\t\tfont-size: 34px;\n\t\t}\n\t\t.wall .t {\n\t\t\tfont-size: 13.5px;\n\t\t}\n\t\t.wall .g {\n\t\t\tmargin-top: 6px;\n\t\t\tgap: 7px;\n\t\t\tfont-size: 14px;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport AlbumCard from '$lib/components/album/AlbumCard.svelte';\n\timport { albumHubBySlug, albumHubPath, type AlbumHub } from '$lib/album-hubs';\n\timport { t } from '$lib/i18n';\n\timport type { AlbumCard as AlbumCardData } from '$lib/types/album';\n\timport Icon from './Icon.svelte';\n\timport { track } from './track';\n\n\tlet { albums }: { albums: AlbumCardData[] } = $props();\n\n\t// RAT-608: the homepage is the site's strongest page; these pass some of it\n\t// to the album hubs, in the words people search with. The biggest hubs, men's\n\t// and women's both, as the cards above are (counts 2026-10-22).\n\tconst HUBS = [\n\t\t'dick-pics',\n\t\t'hard-dick',\n\t\t'uncut-cock',\n\t\t'hairy-dick',\n\t\t'close-up-pics',\n\t\t'amateur-nudes',\n\t\t'ass-pics',\n\t\t'big-dick',\n\t\t'thick-cock',\n\t\t'cumshot-pics',\n\t\t'tits-pics',\n\t\t'pussy-pics',\n\t\t'bbc'\n\t]\n\t\t.map(albumHubBySlug)\n\t\t.filter((h): h is AlbumHub => !!h);\n</script>\n\n<section class=\"sec\">\n\t<div class=\"wrap\">\n\t\t<div class=\"shd\">\n\t\t\t<!-- One sentence: {br} is where it breaks onto the <em> line. -->\n\t\t\t<h2 class=\"d h2\">\n\t\t\t\t{#each t('the albums people {br}actually pay for.').split('{br}') as part, i (i)}{#if i}<br\n\t\t\t\t\t\t/><em>{part.trim()}</em>{:else}{part.trim()}{/if}{/each}\n\t\t\t</h2>\n\t\t\t<a\n\t\t\t\tclass=\"quiet desk\"\n\t\t\t\thref=\"/albums\"\n\t\t\t\tonclick={() =>\n\t\t\t\t\ttrack('landing_route_picked', { route: 'albums', location: 'albums_header' })}\n\t\t\t\t>{t('browse all albums')}<span class=\"arw\"><Icon name=\"arrow-right\" /></span></a\n\t\t\t>\n\t\t</div>\n\t\t<!-- No `surface`: AlbumSurface has no homepage value, and borrowing one\n\t\t\t would count these clicks in another surface's album funnel. -->\n\t\t<div class=\"list\">\n\t\t\t{#each albums as album (album.id)}\n\t\t\t\t<div class=\"item\">\n\t\t\t\t\t<AlbumCard\n\t\t\t\t\t\t{album}\n\t\t\t\t\t\ttint=\"neutral\"\n\t\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\t\ttrack('landing_route_picked', { route: 'album', location: 'albums_card' })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t\t<nav class=\"tags\" aria-label={t('nude albums')}>\n\t\t\t<ul>\n\t\t\t\t{#each HUBS as hub (hub.slug)}\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={albumHubPath(hub)}\n\t\t\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\t\t\ttrack('landing_route_picked', {\n\t\t\t\t\t\t\t\t\troute: 'album_hub',\n\t\t\t\t\t\t\t\t\tlocation: 'albums_tags',\n\t\t\t\t\t\t\t\t\thub: hub.slug\n\t\t\t\t\t\t\t\t})}>{hub.name}</a\n\t\t\t\t\t\t>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ul>\n\t\t</nav>\n\t</div>\n</section>\n\n<style>\n\t.desk {\n\t\tdisplay: none;\n\t}\n\t.list {\n\t\tdisplay: flex;\n\t\tgap: 10px;\n\t\toverflow-x: auto;\n\t\tscroll-snap-type: x mandatory;\n\t\t/* without it the snap pulls the first card flush to the screen edge */\n\t\tscroll-padding-inline: 22px;\n\t\tmargin: 16px -22px 0;\n\t\tpadding: 0 22px 4px;\n\t\tscrollbar-width: none;\n\t}\n\t.list::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\t.item {\n\t\tflex: none;\n\t\twidth: 158px;\n\t\tscroll-snap-align: start;\n\t}\n\t/* One scrolling row on a phone, like the cards above it; wrapped on desktop */\n\t.tags ul {\n\t\tdisplay: flex;\n\t\tgap: 8px;\n\t\toverflow-x: auto;\n\t\tlist-style: none;\n\t\tmargin: 14px -22px 0;\n\t\tpadding: 0 22px;\n\t\tscrollbar-width: none;\n\t}\n\t.tags ul::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\t.tags li {\n\t\tflex: none;\n\t}\n\t.tags a {\n\t\tdisplay: inline-block;\n\t\tpadding: 7px 12px;\n\t\tborder-radius: 8px;\n\t\tbackground: var(--color-surface);\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-text);\n\t\ttext-decoration: none;\n\t\twhite-space: nowrap;\n\t\ttransition: background-color 150ms ease;\n\t}\n\t.tags a:hover {\n\t\tbackground: var(--color-surface-2);\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t.tags ul {\n\t\t\tflex-wrap: wrap;\n\t\t\toverflow: visible;\n\t\t\tmargin: 20px 0 0;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.desk {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t\t.list {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(4, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\toverflow: visible;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.item {\n\t\t\twidth: auto;\n\t\t}\n\t}\n</style>\n","/** Calls `onview` once, the first time the node's top edge reaches the middle\n *  of the viewport. Used for `landing_pricing_viewed` on both landings.\n *\n *  Not an intersection-ratio threshold: the pricing sections are taller than a\n *  phone screen, so \"50% of the section visible\" never happens there. */\nexport function viewedOnce(node: HTMLElement, onview: () => void) {\n\tconst io = new IntersectionObserver(\n\t\t(entries) => {\n\t\t\tif (!entries.some((e) => e.isIntersecting)) return;\n\t\t\tio.disconnect();\n\t\t\tonview();\n\t\t},\n\t\t{ rootMargin: '0px 0px -50% 0px' }\n\t);\n\tio.observe(node);\n\treturn { destroy: () => io.disconnect() };\n}\n","<script lang=\"ts\">\n\t/**\n\t * Premium, laid out the way the signup-first design has it: three cards on\n\t * desktop, one card with a term switcher on phones. Prices, discounts and the\n\t * token allowance all come from $lib/pricing + $lib/pro-plan, and checkout is\n\t * the same POST PremiumPlans makes — only the layout is this page's own.\n\t */\n\timport * as analytics from '$lib/analytics';\n\timport { DEFAULT_LOCALE, LOCALE_INFO, locale, t } from '$lib/i18n';\n\timport { msg } from '$lib/i18n/mark';\n\timport { openAuthSheet } from '$lib/stores/authSheet';\n\timport {\n\t\tPLANS,\n\t\tPLAN_ORDER,\n\t\tdiscountPct,\n\t\tformatUsd,\n\t\ttype Plan,\n\t\ttype PlanCadence\n\t} from '$lib/pricing';\n\timport { PRO_MONTHLY_TOKENS, stipendPerMonth, stipendPerPeriod } from '$lib/pro-plan';\n\timport { PLAN_TERM } from '$lib/landing-variant';\n\timport { viewedOnce } from '../viewed';\n\timport Icon from './Icon.svelte';\n\timport { track } from './track';\n\n\tlet { signedIn }: { signedIn: boolean } = $props();\n\n\tconst SOURCE = 'homepage_signup_first';\n\tconst anchor = PLANS.pro.monthly.perMonth;\n\tconst cards = PLAN_ORDER.map((c) => PLANS.pro[c]); // annual, quarterly, monthly\n\tconst BEST: PlanCadence = 'annual';\n\t// The phone switcher reads short → long, and opens on the monthly price.\n\tconst TERMS: PlanCadence[] = ['monthly', 'quarterly', 'annual'];\n\tlet term = $state<PlanCadence>('monthly');\n\tconst picked = $derived(PLANS.pro[term]);\n\n\tlet loading = $state<PlanCadence | null>(null);\n\tlet error = $state('');\n\n\tfunction billed(p: Plan): string {\n\t\tif (p.cadence === 'monthly') return t('billed monthly, cancel anytime');\n\t\tconst price = formatUsd(p.total);\n\t\tif (p.cadence === 'annual') return t('billed {price} per year', { price });\n\t\treturn t('billed {price} every {n} months', { price, n: p.months });\n\t}\n\t// The allowance is a monthly drip on every term, never a lump up front.\n\tfunction tokens(p: Plan): string {\n\t\tconst perMonth = stipendPerMonth('pro', p.cadence);\n\t\tif (p.months === 1) return t('{n} tokens every month', { n: perMonth });\n\t\treturn t('{total} tokens, {perMonth} every month', {\n\t\t\ttotal: stipendPerPeriod('pro', p.cadence, p.months),\n\t\t\tperMonth\n\t\t});\n\t}\n\t// planTitle's English (\"1 month\", \"3 months\"), in the page's language.\n\tconst title = (p: Plan) => (p.months === 1 ? t('1 month') : t('{n} months', { n: p.months }));\n\t// The switcher's \"1 mo\" / \"3 mo\" / \"12 mo\", from PLAN_TERM's \"1mo\".\n\tfunction termLabel(c: PlanCadence): string {\n\t\tconst n = PLAN_TERM[c].replace('mo', '');\n\t\treturn n === '1' ? t('1 mo') : t('{n} mo', { n });\n\t}\n\t// English keeps the en-US grouping it always had; the others their own.\n\tconst num = (n: number) =>\n\t\tn.toLocaleString(locale() === DEFAULT_LOCALE ? 'en-US' : LOCALE_INFO[locale()].hreflang);\n\tconst save = (p: Plan) => discountPct(p);\n\n\tasync function subscribe(cadence: PlanCadence) {\n\t\tif (loading) return;\n\t\ttrack('landing_plan_clicked', { term: PLAN_TERM[cadence] });\n\t\tif (!signedIn) {\n\t\t\topenAuthSheet('/');\n\t\t\treturn;\n\t\t}\n\t\tloading = cadence;\n\t\terror = '';\n\t\tanalytics.trackPurchaseClick(\n\t\t\t0,\n\t\t\tformatUsd(PLANS.pro[cadence].total),\n\t\t\t`subscription_pro_${cadence}_${SOURCE}`\n\t\t);\n\t\ttry {\n\t\t\tconst res = await fetch('/api/checkout/subscription', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\ttier: 'pro',\n\t\t\t\t\tplan: cadence,\n\t\t\t\t\tsource: SOURCE,\n\t\t\t\t\tsuccessPath: '/?subscribed=true',\n\t\t\t\t\tcancelPath: '/?canceled=true'\n\t\t\t\t})\n\t\t\t});\n\t\t\tconst result = await res.json();\n\t\t\tif (res.ok && result.url) {\n\t\t\t\twindow.location.href = result.url;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\terror = result?.error || t('checkout failed — try again');\n\t\t} catch {\n\t\t\terror = t('network error — try again');\n\t\t}\n\t\tloading = null;\n\t}\n\n\t// Offset scroll rather than scrollIntoView, with room for the fixed navbar.\n\tfunction toTokens(e: MouseEvent) {\n\t\tconst el = document.getElementById('tokens');\n\t\tif (!el) return;\n\t\te.preventDefault();\n\t\twindow.scrollBy({ top: el.getBoundingClientRect().top - 80, left: 0, behavior: 'smooth' });\n\t}\n\n\t// Mirrors PREMIUM_PERK_GROUPS ($lib/pro-plan) in the design's words, grouped\n\t// the design's way. Every line is a real gate — don't add one that isn't.\n\t// Marked here, translated where shown.\n\tconst UNLOCKS = [\n\t\t{\n\t\t\tlabel: msg('get rated'),\n\t\t\tperks: [\n\t\t\t\tmsg('every breakdown, no blur'),\n\t\t\t\tmsg('unlimited duels'),\n\t\t\t\tmsg('unlimited targeted challenges'),\n\t\t\t\tmsg('see who viewed your profile')\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\tlabel: msg('arena'),\n\t\t\tperks: [\n\t\t\t\tmsg('unlimited swipes'),\n\t\t\t\tmsg('see everyone who liked you'),\n\t\t\t\tmsg('three super emotes a week'),\n\t\t\t\tmsg('unlimited match chat')\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\tlabel: msg('AI roleplay'),\n\t\t\tperks: [\n\t\t\t\tmsg('unlimited messages with every character'),\n\t\t\t\tmsg('send them photos, they react to what they see'),\n\t\t\t\tmsg('unlimited group scenes'),\n\t\t\t\tmsg('voice on every reply')\n\t\t\t]\n\t\t}\n\t];\n</script>\n\n<section class=\"sec\" id=\"pricing\" use:viewedOnce={() => track('landing_pricing_viewed')}>\n\t<div class=\"wrap\">\n\t\t<div class=\"shd\">\n\t\t\t<!-- One sentence: {br} is where it breaks onto the <em> line. -->\n\t\t\t<h2 class=\"d h2\">\n\t\t\t\t{#each t('choose {br}your plan.').split('{br}') as part, i (i)}{#if i}<br /><em\n\t\t\t\t\t\t\t>{part.trim()}</em\n\t\t\t\t\t\t>{:else}{part.trim()}{/if}{/each}\n\t\t\t</h2>\n\t\t\t<p class=\"p lede\">\n\t\t\t\t{t(\n\t\t\t\t\t'your first AI rating is free. premium opens the rest of the app. if you only want one extra thing, buy tokens instead, below.'\n\t\t\t\t)}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<!-- {n} is the bold figure, wherever the language puts it -->\n\t\t<p class=\"trustrow\">\n\t\t\t<span\n\t\t\t\t>{#each t('{n} users').split('{n}') as part, i (i)}{#if i}<b>{num(250000)}+</b\n\t\t\t\t\t\t>{/if}{part}{/each}</span\n\t\t\t><span\n\t\t\t\t>{#each t('{n} ratings of the app itself').split('{n}') as part, i (i)}{#if i}<b\n\t\t\t\t\t\t\t>{num(1000)}+</b\n\t\t\t\t\t\t>{/if}{part}{/each}</span\n\t\t\t><span>{t('cancel anytime')}</span>\n\t\t</p>\n\n\t\t<!-- phone: one card, term switcher -->\n\t\t<div class=\"plan phone\">\n\t\t\t<div class=\"terms\" role=\"group\" aria-label={t('billing term')}>\n\t\t\t\t{#each TERMS as c (c)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass:on={term === c}\n\t\t\t\t\t\taria-pressed={term === c}\n\t\t\t\t\t\tonclick={() => (term = c)}>{termLabel(c)}</button\n\t\t\t\t\t>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t\t<div class=\"pr\">\n\t\t\t\t<b>{formatUsd(picked.perMonth)}</b><span>{t('/month')}</span>\n\t\t\t\t{#if save(picked) > 0}<i>{t('save {n}%', { n: save(picked) })}</i>{/if}\n\t\t\t</div>\n\t\t\t<p class=\"bill\">{billed(picked)}</p>\n\t\t\t<p class=\"ptok\">{tokens(picked)}</p>\n\t\t\t<button type=\"button\" class=\"cta\" disabled={loading !== null} onclick={() => subscribe(term)}\n\t\t\t\t>{loading === term ? t('redirecting…') : t('get started')}</button\n\t\t\t>\n\t\t</div>\n\n\t\t<!-- desktop: three cards, best value first -->\n\t\t<div class=\"pgrid desk\">\n\t\t\t{#each cards as p (p.cadence)}\n\t\t\t\t<div class=\"pcard\" class:best={p.cadence === BEST}>\n\t\t\t\t\t<div class=\"pct\">\n\t\t\t\t\t\t<b>{title(p)}</b>\n\t\t\t\t\t\t{#if save(p) > 0}<span class=\"poff\">{t('save {n}%', { n: save(p) })}</span>{/if}\n\t\t\t\t\t</div>\n\t\t\t\t\t{#if p.cadence === BEST}<p class=\"pbest\">{t('best value')}</p>{/if}\n\t\t\t\t\t<div class=\"pprice\"><b>{formatUsd(p.perMonth)}</b><span>{t('/month')}</span></div>\n\t\t\t\t\t{#if p.perMonth < anchor}<p class=\"pwas\">{formatUsd(anchor)}</p>{/if}\n\t\t\t\t\t<p class=\"pbill\">{billed(p)}</p>\n\t\t\t\t\t<p class=\"ptok\">{tokens(p)}</p>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass={p.cadence === BEST ? 'cta' : 'cta2'}\n\t\t\t\t\t\tdisabled={loading !== null}\n\t\t\t\t\t\tonclick={() => subscribe(p.cadence)}\n\t\t\t\t\t\t>{loading === p.cadence ? t('redirecting…') : t('get started')}</button\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t\t{#if error}<p class=\"err\" role=\"alert\">{error}</p>{/if}\n\t\t<p class=\"fineline desk-block\">\n\t\t\t{t('every plan unlocks the same things. the only difference is the term.')}\n\t\t</p>\n\n\t\t<p class=\"eyeb\">{t('premium unlocks all of this')}</p>\n\t\t<div class=\"ugrid\">\n\t\t\t{#each UNLOCKS as g (g.label)}\n\t\t\t\t<div class=\"ug\">\n\t\t\t\t\t<p class=\"ugt\">{t(g.label)}</p>\n\t\t\t\t\t{#each g.perks as perk (perk)}<div>{t(perk)}</div>{/each}\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\n\t\t<!-- {tokens} is the bold allowance, wherever the language puts it -->\n\t\t<p class=\"goldnote\">\n\t\t\t{#each t('{tokens} every month, on every plan.').split('{tokens}') as part, i (i)}{#if i}<b\n\t\t\t\t\t\t>{t('{n} tokens', { n: PRO_MONTHLY_TOKENS })}</b\n\t\t\t\t\t>{/if}{part}{/each}\n\t\t</p>\n\t\t<div class=\"goldlink\">\n\t\t\t<a href=\"#tokens\" onclick={toTokens}\n\t\t\t\t>{t('see what tokens buy')}<span class=\"arw\"><Icon name=\"arrow-down\" /></span></a\n\t\t\t>\n\t\t</div>\n\t</div>\n</section>\n\n<style>\n\t.sec {\n\t\tscroll-margin-top: 80px;\n\t}\n\t.lede {\n\t\tmargin-top: 12px;\n\t}\n\t.trustrow,\n\t.desk,\n\t.desk-block {\n\t\tdisplay: none;\n\t}\n\tbutton {\n\t\tcursor: pointer;\n\t}\n\t.terms button {\n\t\tborder: 0;\n\t}\n\tbutton:disabled {\n\t\topacity: 0.6;\n\t\tcursor: default;\n\t}\n\n\t/* ── phone card ── */\n\t.plan {\n\t\tmargin-top: 18px;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 16px;\n\t\tbackground: var(--color-surface-2);\n\t\tpadding: 16px;\n\t}\n\t.terms {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t\tgap: 4px;\n\t\tpadding: 3px;\n\t\tborder-radius: 11px;\n\t\tbackground: #000;\n\t}\n\t.terms button {\n\t\theight: 34px;\n\t\tborder-radius: 8px;\n\t\tbackground: none;\n\t\tcolor: var(--color-muted-2);\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 12.5px;\n\t\tfont-weight: 700;\n\t}\n\t.terms button.on {\n\t\tbackground: var(--color-surface-2);\n\t\tcolor: var(--color-text);\n\t\tbox-shadow: 0 1px 3px rgb(0 0 0 / 0.6);\n\t}\n\t.pr {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 6px;\n\t\tmargin-top: 16px;\n\t}\n\t.pr b {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 34px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.035em;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\t.pr span {\n\t\tfont-size: 12.5px;\n\t\tcolor: var(--color-muted);\n\t}\n\t.pr i {\n\t\tmargin-left: auto;\n\t\tfont-style: normal;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 11px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-token);\n\t}\n\t.bill {\n\t\tmargin: 5px 0 0;\n\t\tfont-size: 11.5px;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.ptok {\n\t\tmargin: 10px 0 0;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 12.5px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-token);\n\t}\n\t.plan .cta {\n\t\twidth: 100%;\n\t\tmargin-top: 17px;\n\t}\n\t.err {\n\t\tmargin: 12px 0 0;\n\t\tfont-size: 12.5px;\n\t\tcolor: var(--color-coral);\n\t}\n\n\t/* ── premium unlocks ── */\n\t.ugrid {\n\t\tdisplay: grid;\n\t\tgap: 9px;\n\t}\n\t.ug {\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 14px;\n\t\tbackground: var(--color-surface);\n\t\tpadding: 15px 16px 17px;\n\t}\n\t.ugt {\n\t\tmargin: 0 0 9px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 9.5px;\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.ug div {\n\t\tposition: relative;\n\t\tpadding: 5px 0 5px 15px;\n\t\tfont-size: 12.5px;\n\t\tline-height: 1.45;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.ug div::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 11px;\n\t\twidth: 5px;\n\t\theight: 5px;\n\t\tborder-radius: 50%;\n\t\tbackground: var(--color-muted);\n\t}\n\t.goldnote {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: baseline;\n\t\tjustify-content: center;\n\t\tgap: 4px 7px;\n\t\tmargin: 14px 0 0;\n\t\tpadding: 15px;\n\t\tborder: 1px solid var(--color-token);\n\t\tborder-radius: 14px;\n\t\tbackground: rgb(245 181 10 / 0.07);\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 13px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\tcolor: var(--color-token);\n\t\ttext-align: center;\n\t}\n\t.goldnote b {\n\t\tflex: none;\n\t\twhite-space: nowrap;\n\t\tfont-size: 17px;\n\t\tletter-spacing: -0.03em;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\t.goldlink {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tmargin-top: 16px;\n\t}\n\t.goldlink a {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\tpadding-bottom: 3px;\n\t\tborder-bottom: 1px solid rgb(245 181 10 / 0.35);\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 13px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\tcolor: var(--color-token);\n\t}\n\t.goldlink a:hover {\n\t\tcolor: var(--color-token);\n\t\tborder-bottom-color: var(--color-token);\n\t}\n\t.goldlink .arw {\n\t\tcolor: var(--color-token);\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t.lede {\n\t\t\tmargin-top: 0;\n\t\t}\n\t\t.phone {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.desk {\n\t\t\tdisplay: grid;\n\t\t}\n\t\t.desk-block {\n\t\t\tdisplay: block;\n\t\t}\n\t\t.trustrow {\n\t\t\tdisplay: flex;\n\t\t\tgap: 40px;\n\t\t\tmargin: 0 0 30px;\n\t\t\tfont-size: 13.5px;\n\t\t\tcolor: var(--color-muted);\n\t\t}\n\t\t.trustrow span {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: baseline;\n\t\t\tgap: 7px;\n\t\t}\n\t\t.trustrow b {\n\t\t\tfont-family: var(--font-display);\n\t\t\tfont-size: 15px;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: -0.02em;\n\t\t\tcolor: var(--color-muted-2);\n\t\t}\n\t\t.pgrid {\n\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\talign-items: stretch;\n\t\t}\n\t\t.pcard {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tborder-radius: 20px;\n\t\t\tbackground: var(--color-surface);\n\t\t\tpadding: 28px;\n\t\t}\n\t\t.pcard.best {\n\t\t\tborder-color: var(--color-coral);\n\t\t\tbackground: var(--color-surface-2);\n\t\t}\n\t\t.pct {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 12px;\n\t\t}\n\t\t.pct b {\n\t\t\tfont-family: var(--font-display);\n\t\t\tfont-size: 21px;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: -0.025em;\n\t\t}\n\t\t.poff {\n\t\t\tmargin-left: auto;\n\t\t\tpadding: 4px 10px;\n\t\t\tborder-radius: 99px;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tfont-family: var(--font-display);\n\t\t\tfont-size: 11.5px;\n\t\t\tfont-weight: 700;\n\t\t\tcolor: var(--color-muted-2);\n\t\t}\n\t\t.best .poff {\n\t\t\tborder-color: var(--color-coral);\n\t\t\tcolor: var(--color-coral);\n\t\t}\n\t\t.pbest {\n\t\t\tmargin: 9px 0 0;\n\t\t\tfont-family: var(--font-display);\n\t\t\tfont-size: 10.5px;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: 0.2em;\n\t\t\ttext-transform: uppercase;\n\t\t\tcolor: var(--color-coral);\n\t\t}\n\t\t.pprice {\n\t\t\tdisplay: flex;\n\t\t\talign-items: baseline;\n\t\t\tgap: 8px;\n\t\t\tmargin-top: 26px;\n\t\t}\n\t\t.pprice b {\n\t\t\tfont-family: var(--font-display);\n\t\t\tfont-size: 46px;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: -0.04em;\n\t\t\tfont-variant-numeric: tabular-nums;\n\t\t}\n\t\t.pprice span {\n\t\t\tfont-size: 15px;\n\t\t\tcolor: var(--color-muted);\n\t\t}\n\t\t.pwas {\n\t\t\tmargin: 6px 0 0;\n\t\t\tfont-size: 15px;\n\t\t\tcolor: var(--color-muted);\n\t\t\ttext-decoration: line-through;\n\t\t}\n\t\t.pbill {\n\t\t\tmargin: 14px 0 0;\n\t\t\tfont-size: 13px;\n\t\t\tcolor: var(--color-muted-2);\n\t\t}\n\t\t.pcard .ptok {\n\t\t\tmargin: 12px 0 28px;\n\t\t\tfont-size: 13.5px;\n\t\t}\n\t\t.pcard button {\n\t\t\twidth: 100%;\n\t\t\theight: 56px;\n\t\t\tmargin-top: auto;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.fineline {\n\t\t\tmargin: 26px 0 0;\n\t\t\tfont-size: 13px;\n\t\t\tcolor: var(--color-muted);\n\t\t}\n\t\t.ugrid {\n\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\talign-items: start;\n\t\t}\n\t\t.ug {\n\t\t\tborder-radius: 18px;\n\t\t\tpadding: 26px 28px 28px;\n\t\t}\n\t\t.ugt {\n\t\t\tmargin-bottom: 16px;\n\t\t\tfont-size: 10.5px;\n\t\t}\n\t\t.ug div {\n\t\t\tpadding: 8px 0 8px 20px;\n\t\t\tfont-size: 15px;\n\t\t}\n\t\t.ug div::before {\n\t\t\ttop: 15px;\n\t\t\twidth: 6px;\n\t\t\theight: 6px;\n\t\t}\n\t\t.goldnote {\n\t\t\talign-items: center;\n\t\t\tgap: 9px;\n\t\t\tmargin-top: 20px;\n\t\t\tpadding: 20px;\n\t\t\tborder-radius: 16px;\n\t\t\tfont-size: 17px;\n\t\t\tletter-spacing: -0.015em;\n\t\t}\n\t\t.goldnote b {\n\t\t\tfont-size: 22px;\n\t\t}\n\t\t.goldlink {\n\t\t\tmargin-top: 20px;\n\t\t}\n\t\t.goldlink a {\n\t\t\tgap: 8px;\n\t\t\tfont-size: 15px;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { packPrice } from '$lib/pricing-display';\n\t/**\n\t * Tokens: what they buy, then the four packs. Packs and prices come from\n\t * $lib/token-packages and checkout is the same POST TokenPackages makes. The\n\t * spend list is the design's cut of TokenTopUp's: \"crowd score for your pic\"\n\t * is out (a first-time visitor can't parse it) and \"reveal your voters\" is out\n\t * (it's a subscription feature now).\n\t */\n\timport { page } from '$app/state';\n\timport { t } from '$lib/i18n';\n\timport { openAuthSheet } from '$lib/stores/authSheet';\n\timport { GIFT_PRO_TOKEN_COST, TOKEN_PACKAGES, type TokenPackage } from '$lib/token-packages';\n\timport { withPlusBonus } from '$lib/pro-plan';\n\timport { track } from './track';\n\n\tlet { signedIn }: { signedIn: boolean } = $props();\n\n\tconst SOURCE = 'homepage_signup_first';\n\t// Derived so it reads the page's language.\n\tconst GROUPS = $derived([\n\t\t{\n\t\t\tlabel: t('arena'),\n\t\t\trows: [\n\t\t\t\t[t('super emote, get noticed'), t('{n} tok', { n: 2 })],\n\t\t\t\t[t('boost your pic'), t('{n} tok', { n: 5 })]\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\tlabel: t('chat & gifts'),\n\t\t\trows: [\n\t\t\t\t[t('tip raters and creators'), t('any amount')],\n\t\t\t\t[t('gift premium, 30 days'), t('{n} tok', { n: GIFT_PRO_TOKEN_COST })],\n\t\t\t\t[t('unlock locked pics'), t('set by sender')]\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\tlabel: t('unlocks'),\n\t\t\trows: [\n\t\t\t\t[t('someone’s photo set'), t('from {n} tok', { n: 5 })],\n\t\t\t\t[t('paid roleplay characters'), t('set by creator')],\n\t\t\t\t[t('boost your beat'), t('from {n} tok', { n: 5 })]\n\t\t\t]\n\t\t}\n\t]);\n\n\t// Plus members get more tokens for the same pack (display only; the server\n\t// re-derives it) — same as TokenPackages.\n\tconst isPlus = $derived(page.data.subscriptionTier === 'plus');\n\n\tlet loadingId = $state<string | null>(null);\n\n\tasync function buy(pkg: TokenPackage) {\n\t\tif (loadingId) return;\n\t\ttrack('landing_pack_clicked', { pack: pkg.tokens });\n\t\tif (!signedIn) {\n\t\t\topenAuthSheet('/');\n\t\t\treturn;\n\t\t}\n\t\tloadingId = pkg.id;\n\t\ttry {\n\t\t\tconst res = await fetch('/api/checkout/tokens', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tpackageId: pkg.id,\n\t\t\t\t\tsuccessPath: '/?tokens=added',\n\t\t\t\t\tcancelPath: '/?canceled=true',\n\t\t\t\t\tsource: SOURCE\n\t\t\t\t})\n\t\t\t});\n\t\t\tconst j = await res.json();\n\t\t\tif (res.ok && j.url) {\n\t\t\t\twindow.location.href = j.url;\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch {\n\t\t\t/* fall through */\n\t\t}\n\t\tloadingId = null;\n\t}\n</script>\n\n<section class=\"sec\" id=\"tokens\">\n\t<div class=\"wrap\">\n\t\t<div class=\"shd\">\n\t\t\t<!-- One sentence: {br} is where it breaks onto the <em> line. -->\n\t\t\t<h2 class=\"d h2\">\n\t\t\t\t{#each t('tokens. {br}pay for one thing.').split('{br}') as part, i (i)}{#if i}<br /><em\n\t\t\t\t\t\t\t>{part.trim()}</em\n\t\t\t\t\t\t>{:else}{part.trim()}{/if}{/each}\n\t\t\t</h2>\n\t\t\t<p class=\"p lede\">\n\t\t\t\t{t(\n\t\t\t\t\t'a one-time top-up, on top of whatever your plan gives you. tokens never expire, and everything not listed here is free.'\n\t\t\t\t)}\n\t\t\t</p>\n\t\t</div>\n\t\t<p class=\"eyeb\">{t('what they buy')}</p>\n\t\t<div class=\"tokgrid\">\n\t\t\t{#each GROUPS as g (g.label)}\n\t\t\t\t<div class=\"tgroup\">\n\t\t\t\t\t<p class=\"tg\">{g.label}</p>\n\t\t\t\t\t{#each g.rows as [name, price] (name)}\n\t\t\t\t\t\t<div class=\"row\"><span>{name}</span><i>{price}</i></div>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t\t<div class=\"packs\">\n\t\t\t{#each TOKEN_PACKAGES as pkg (pkg.id)}\n\t\t\t\t<div class=\"pack\" class:hot={pkg.popular}>\n\t\t\t\t\t{#if pkg.popular}<span class=\"ptag\">{t('most popular')}</span>{/if}\n\t\t\t\t\t<b>{t('{n} tokens', { n: withPlusBonus(pkg.tokens, isPlus) })}</b>\n\t\t\t\t\t<span class=\"pnick\">“{pkg.label}”</span>\n\t\t\t\t\t<div class=\"ppr\"><b>{packPrice(pkg)}</b><span>{t('one-time')}</span></div>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass={pkg.popular ? 'cta3' : 'cta2'}\n\t\t\t\t\t\tdisabled={loadingId !== null}\n\t\t\t\t\t\tonclick={() => buy(pkg)}>{loadingId === pkg.id ? t('redirecting…') : t('buy')}</button\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t\t<p class=\"fineline\">{t('secure via stripe · instant top-up · tokens never expire')}</p>\n\t</div>\n</section>\n\n<style>\n\t.sec {\n\t\tscroll-margin-top: 80px;\n\t}\n\t.lede {\n\t\tmargin-top: 12px;\n\t}\n\t/* phone: one card, the groups stacked inside it */\n\t.tokgrid {\n\t\tdisplay: grid;\n\t\tmargin-top: 10px;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 16px;\n\t\tbackground: var(--color-surface);\n\t\tpadding: 3px 16px 10px;\n\t}\n\t.tg {\n\t\tmargin: 0;\n\t\tpadding: 14px 0 6px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 9.5px;\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.tgroup + .tgroup .tg {\n\t\tborder-top: 1px solid var(--color-border);\n\t}\n\t.row {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 10px;\n\t\tpadding: 6px 0;\n\t\tfont-size: 12.5px;\n\t}\n\t.row span {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t.row i {\n\t\tflex: none;\n\t\tfont-style: normal;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 12px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-token);\n\t}\n\t.packs {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgap: 9px;\n\t\tmargin-top: 14px;\n\t}\n\t.pack {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmin-height: 172px;\n\t\tpadding: 15px 14px 16px;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 14px;\n\t\tbackground: var(--color-surface);\n\t}\n\t.pack.hot {\n\t\tborder-color: var(--color-token);\n\t}\n\t.pack > b {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 16px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.025em;\n\t}\n\t.pnick {\n\t\tmargin-top: 4px;\n\t\tfont-size: 11px;\n\t\tcolor: var(--color-muted);\n\t}\n\t.ppr {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: baseline;\n\t\tgap: 0 6px;\n\t\tmargin-top: 13px;\n\t}\n\t/* a local price (R$ 149,90) is wider than $49.99: the label moves under it\n\t   whole rather than breaking at its hyphen */\n\t.ppr b {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 19px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.03em;\n\t\tfont-variant-numeric: tabular-nums;\n\t\twhite-space: nowrap;\n\t}\n\t.ppr span {\n\t\tfont-size: 10.5px;\n\t\tcolor: var(--color-muted);\n\t\twhite-space: nowrap;\n\t}\n\t.ptag {\n\t\tposition: absolute;\n\t\ttop: -8px;\n\t\tleft: 12px;\n\t\tpadding: 1px 7px;\n\t\tborder-radius: 99px;\n\t\tbackground: var(--color-token);\n\t\tcolor: #000;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 8.5px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: 0.06em;\n\t\ttext-transform: uppercase;\n\t}\n\t.pack button {\n\t\twidth: 100%;\n\t\theight: 42px;\n\t\tmargin-top: auto;\n\t\tpadding: 0;\n\t\tborder-radius: 11px;\n\t\tfont-size: 14px;\n\t\tcursor: pointer;\n\t}\n\t.pack button:disabled {\n\t\topacity: 0.6;\n\t\tcursor: default;\n\t}\n\t.fineline {\n\t\tmargin: 16px 0 0;\n\t\tfont-size: 11px;\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\tcolor: var(--color-muted);\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t.lede {\n\t\t\tmargin-top: 0;\n\t\t}\n\t\t.tokgrid {\n\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\talign-items: start;\n\t\t\tmargin-top: 0;\n\t\t\tborder: 0;\n\t\t\tborder-radius: 0;\n\t\t\tbackground: none;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.tgroup {\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tborder-radius: 18px;\n\t\t\tbackground: var(--color-surface);\n\t\t\tpadding: 26px 28px 28px;\n\t\t}\n\t\t.tg,\n\t\t.tgroup + .tgroup .tg {\n\t\t\tmargin: 0 0 14px;\n\t\t\tpadding: 0;\n\t\t\tborder-top: 0;\n\t\t\tfont-size: 10.5px;\n\t\t}\n\t\t.row {\n\t\t\tjustify-content: space-between;\n\t\t\tgap: 24px;\n\t\t\tpadding: 11px 0;\n\t\t\tborder-top: 1px solid var(--color-border);\n\t\t\tfont-size: 15px;\n\t\t}\n\t\t.row i {\n\t\t\tfont-size: 13.5px;\n\t\t}\n\t\t.packs {\n\t\t\tgrid-template-columns: repeat(4, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\tmargin-top: 20px;\n\t\t}\n\t\t.pack {\n\t\t\tmin-height: 0;\n\t\t\tpadding: 26px;\n\t\t\tborder-radius: 18px;\n\t\t}\n\t\t.pack > b {\n\t\t\tfont-size: 25px;\n\t\t\tletter-spacing: -0.03em;\n\t\t}\n\t\t.pnick {\n\t\t\tmargin-top: 7px;\n\t\t\tfont-size: 13.5px;\n\t\t}\n\t\t.ppr {\n\t\t\tgap: 0 8px;\n\t\t\tmargin-top: 22px;\n\t\t}\n\t\t.ppr b {\n\t\t\tfont-size: 29px;\n\t\t\tletter-spacing: -0.035em;\n\t\t}\n\t\t.ppr span {\n\t\t\tfont-size: 13px;\n\t\t}\n\t\t.ptag {\n\t\t\ttop: -11px;\n\t\t\tleft: 24px;\n\t\t\tpadding: 3px 10px;\n\t\t\tfont-size: 10px;\n\t\t}\n\t\t.pack button {\n\t\t\theight: 54px;\n\t\t\tmargin-top: 24px;\n\t\t\tborder-radius: 13px;\n\t\t\tfont-size: 16px;\n\t\t}\n\t\t.fineline {\n\t\t\tmargin-top: 26px;\n\t\t\tfont-size: 13px;\n\t\t\ttext-align: left;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * The homepage: the signup-first landing with every product in a compact\n\t * strip under the hero's CTA (C + strip). It won the three-arm test against\n\t * the old landing and C (experiment 468970, concluded 2026-10-08, RAT-555)\n\t * and is what every visitor and crawler gets.\n\t *\n\t * B, the signup-first landing (Homepage Redesign v6), moved more people into\n\t * a rating but hid everything else 2.5 screens down. C rebuilt that router\n\t * under the hero; the strip goes further and puts all seven products, in\n\t * their module colours, inside the first screen. One conversion path\n\t * otherwise — a single CTA in the hero, proof, a sample result with the\n\t * detail held back, objections, then pricing at the bottom — and two accents\n\t * only: coral for the primary action and the subscription, token gold for\n\t * currency.\n\t *\n\t * Navbar, Footer and BottomNav come from the layout, as on every page.\n\t * Below 1024px it's the phone layout, capped at 720px wide; from 1024px up\n\t * it's the desktop layout.\n\t */\n\timport { LANDING_VARIANT, type LandingProof, type LandingTeaser } from '$lib/landing-variant';\n\timport Hero from './signup-first/Hero.svelte';\n\timport ResultCard from './signup-first/ResultCard.svelte';\n\timport HomeGuide from './HomeGuide.svelte';\n\timport FeedRail from './signup-first/FeedRail.svelte';\n\timport AlbumRail from './signup-first/AlbumRail.svelte';\n\timport Plans from './signup-first/Plans.svelte';\n\timport Tokens from './signup-first/Tokens.svelte';\n\timport { track } from './signup-first/track';\n\timport { EARN_HREF, startEarning } from './signup-first/earn';\n\timport { LOCALE_INFO, locale, t } from '$lib/i18n';\n\timport { msg } from '$lib/i18n/mark';\n\n\tlet {\n\t\tdata\n\t}: {\n\t\tdata: {\n\t\t\tteaser: LandingTeaser;\n\t\t\tproof: LandingProof;\n\t\t\tratersOnline: number;\n\t\t\tuser?: unknown;\n\t\t\tisSubscribed?: boolean;\n\t\t};\n\t} = $props();\n\n\tconst signedIn = $derived(!!data.user);\n\n\t/** 176k, 2.1M — floored, so the strip never rounds a number up. Digits in\n\t *  the page's language (2,1M, 9.876). */\n\tfunction compact(n: number): string {\n\t\tconst lang = LOCALE_INFO[locale()].hreflang;\n\t\tif (n >= 1_000_000)\n\t\t\treturn `${(Math.floor(n / 100_000) / 10).toLocaleString(lang, { useGrouping: false })}M`;\n\t\tif (n >= 10_000) return `${Math.floor(n / 1000)}k`;\n\t\treturn n.toLocaleString(lang);\n\t}\n\tconst proof = $derived(\n\t\t[\n\t\t\t{ n: data.proof.ratings, label: msg('{n} ratings') },\n\t\t\t{ n: data.proof.messages, label: msg('{n} messages') },\n\t\t\t{ n: data.proof.duels, label: msg('{n} duels') }\n\t\t].filter((p) => p.n > 0)\n\t);\n\n\tconst EARN = [\n\t\t{ what: msg('post a photo set'), pays: msg('from 5 tok') },\n\t\t{ what: msg('get tipped'), pays: msg('any amount') },\n\t\t{ what: msg('rate other people'), pays: msg('you set the price') }\n\t];\n</script>\n\n<div class=\"sf\">\n\t<Hero ratersOnline={data.ratersOnline} />\n\n\t{#if proof.length > 0}\n\t\t<div class=\"proof\">\n\t\t\t<div class=\"wrap\">\n\t\t\t\t{#each proof as p (p.label)}\n\t\t\t\t\t<!-- the whole phrase translates, so the number can sit where a language puts it -->\n\t\t\t\t\t<span\n\t\t\t\t\t\t>{#each t(p.label).split('{n}') as part, i (i)}{#if i}<b>{compact(p.n)}</b\n\t\t\t\t\t\t\t\t>{/if}{part}{/each}</span\n\t\t\t\t\t>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t</div>\n\t{/if}\n\n\t<!-- phones only: on desktop this card is the hero's right column -->\n\t<section class=\"sec result\">\n\t\t<div class=\"wrap\">\n\t\t\t<!-- One sentence: {br} is where it breaks onto the muted second line. -->\n\t\t\t<h2 class=\"d h2\">\n\t\t\t\t{#each t('this is what {br}you get back.').split('{br}') as part, i (i)}{#if i}<br /><em\n\t\t\t\t\t\t\t>{part.trim()}</em\n\t\t\t\t\t\t>{:else}{part.trim()}{/if}{/each}\n\t\t\t</h2>\n\t\t\t<ResultCard layout=\"stacked\" />\n\t\t\t<a\n\t\t\t\tclass=\"cta\"\n\t\t\t\thref=\"/rate\"\n\t\t\t\tonclick={() => track('landing_cta_clicked', { location: 'result_preview' })}\n\t\t\t\t>{t('upload yours, see it in 10s')}</a\n\t\t\t>\n\t\t</div>\n\t</section>\n\n\t{#if data.teaser.posts.length > 0}\n\t\t<FeedRail posts={data.teaser.posts} postsToday={data.teaser.postsToday} {signedIn} />\n\t{/if}\n\n\t{#if data.teaser.albums.length > 0}\n\t\t<AlbumRail albums={data.teaser.albums} />\n\t{/if}\n\n\t<section class=\"sec\">\n\t\t<div class=\"wrap\">\n\t\t\t<div class=\"shd\">\n\t\t\t\t<h2 class=\"d h2\">{t('people make money here.')}</h2>\n\t\t\t\t<p class=\"p lede\">{t('you got rated free. the other side got paid.')}</p>\n\t\t\t</div>\n\t\t\t<div class=\"earn\">\n\t\t\t\t{#each EARN as e (e.what)}\n\t\t\t\t\t<div><b>{t(e.what)}</b><em>{t(e.pays)}</em></div>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t\t<div class=\"earncta\">\n\t\t\t\t<a class=\"cta2\" href={EARN_HREF} onclick={(e) => startEarning(e, signedIn, 'earn')}\n\t\t\t\t\t>{t('start earning')}</a\n\t\t\t\t>\n\t\t\t</div>\n\t\t</div>\n\t</section>\n\n\t<!-- Subscribers have nothing to buy here, same as the control landing. -->\n\t{#if !data.isSubscribed}\n\t\t<Plans {signedIn} />\n\t{/if}\n\n\t<Tokens {signedIn} />\n\n\t<!-- Last, above the footer: the rating explained and the questions people\n\t     ask before uploading, for whoever read this far. -->\n\t<HomeGuide variant={LANDING_VARIANT} {signedIn} />\n</div>\n\n<style>\n\t/* The navbar is fixed (h-16) and <main> doesn't pad for it. */\n\t.sf {\n\t\tpadding-top: 64px;\n\t\tfont-family: var(--font-body);\n\t\tcolor: var(--color-text);\n\t}\n\n\t/* ── primitives shared by every section component ──\n\t   Wrapped in :where() so they weigh one class: each section's own scoped\n\t   rules (two classes) then override them no matter which stylesheet loads\n\t   first. */\n\t:global(:where(.sf) a) {\n\t\tcolor: inherit;\n\t\ttext-decoration: none;\n\t}\n\t:global(:where(.sf) a:hover) {\n\t\tcolor: #fff;\n\t}\n\t:global(:where(.sf) .wrap) {\n\t\tmax-width: 720px;\n\t\tmargin: 0 auto;\n\t\tpadding: 0 22px;\n\t}\n\t:global(:where(.sf) .sec) {\n\t\tpadding: 34px 0;\n\t\tborder-top: 1px solid var(--color-border);\n\t}\n\t:global(:where(.sf) .d) {\n\t\tmargin: 0;\n\t\tfont-family: var(--font-display);\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.03em;\n\t}\n\t:global(:where(.sf) .h2) {\n\t\tfont-size: 28px;\n\t\tline-height: 1;\n\t}\n\t:global(:where(.sf) .h2 em) {\n\t\tfont-style: normal;\n\t\tcolor: var(--color-muted);\n\t}\n\t:global(:where(.sf) .p) {\n\t\tmargin: 0;\n\t\tfont-size: 13.5px;\n\t\tline-height: 1.55;\n\t\tcolor: var(--color-muted-2);\n\t}\n\t:global(:where(.sf) .eyeb) {\n\t\tmargin: 26px 0 12px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 9.5px;\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:global(:where(.sf) .cta),\n\t:global(:where(.sf) .cta2),\n\t:global(:where(.sf) .cta3) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: 52px;\n\t\tborder-radius: 13px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 15px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\ttransition: filter 180ms var(--ease-out-quart);\n\t}\n\t:global(:where(.sf) .cta) {\n\t\tborder: 0;\n\t\tbackground: var(--color-coral);\n\t\tcolor: #fff;\n\t}\n\t:global(:where(.sf) .cta2) {\n\t\tborder: 1px solid var(--color-border);\n\t\tbackground: var(--color-surface);\n\t\tcolor: var(--color-text);\n\t}\n\t:global(:where(.sf) .cta3) {\n\t\tborder: 0;\n\t\tbackground: var(--color-token);\n\t\tcolor: #101010;\n\t}\n\t:global(:where(.sf) .cta:hover) {\n\t\tcolor: #fff;\n\t\tfilter: brightness(1.07);\n\t}\n\t:global(:where(.sf) .cta3:hover) {\n\t\tcolor: #101010;\n\t\tfilter: brightness(1.07);\n\t}\n\t:global(:where(.sf) .quiet) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding-bottom: 3px;\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 13px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\tcolor: var(--color-muted-2);\n\t\ttransition: border-color 180ms var(--ease-out-quart);\n\t}\n\t:global(:where(.sf) .quiet:hover) {\n\t\tborder-bottom-color: var(--color-muted);\n\t}\n\t:global(:where(.sf) .arw) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcolor: var(--color-muted);\n\t}\n\t:global(:where(.sf) .arw svg) {\n\t\twidth: 14px;\n\t\theight: 14px;\n\t}\n\t:global(:where(.sf) .pulse) {\n\t\tposition: relative;\n\t\tflex: none;\n\t\twidth: 7px;\n\t\theight: 7px;\n\t\tborder-radius: 50%;\n\t\tbackground: var(--color-green);\n\t}\n\t:global(:where(.sf) .pulse::before) {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tborder-radius: 50%;\n\t\tbackground: var(--color-green);\n\t\tanimation: sf-pulse 2.4s var(--ease-out-quart) infinite;\n\t}\n\t@keyframes -global-sf-pulse {\n\t\t0% {\n\t\t\ttransform: scale(1);\n\t\t\topacity: 0.7;\n\t\t}\n\t\t70%,\n\t\t100% {\n\t\t\ttransform: scale(3.2);\n\t\t\topacity: 0;\n\t\t}\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:global(:where(.sf) .pulse::before) {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t/* ── proof strip ── */\n\t.proof {\n\t\tborder-top: 1px solid var(--color-border);\n\t}\n\t.proof .wrap {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tjustify-content: center;\n\t\tgap: 6px 16px;\n\t\tpadding-top: 14px;\n\t\tpadding-bottom: 14px;\n\t\tfont-size: 11.5px;\n\t\tcolor: var(--color-muted);\n\t}\n\t.proof span {\n\t\tdisplay: inline-flex;\n\t\talign-items: baseline;\n\t\tgap: 4px;\n\t}\n\t.proof b {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 14px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.02em;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: var(--color-text);\n\t}\n\n\t.result .cta {\n\t\tmargin-top: 14px;\n\t}\n\n\t/* ── earn ── */\n\t.lede {\n\t\tmargin-top: 10px;\n\t\tfont-size: 12.5px;\n\t}\n\t.earn {\n\t\tdisplay: grid;\n\t\tgap: 1px;\n\t\tmargin-top: 16px;\n\t\tborder-radius: 14px;\n\t\toverflow: hidden;\n\t\tbackground: var(--color-border);\n\t}\n\t.earn div {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 10px;\n\t\tpadding: 14px;\n\t\tbackground: var(--color-surface);\n\t}\n\t.earn b {\n\t\tflex: 1;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 15px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.02em;\n\t}\n\t.earn em {\n\t\tflex: none;\n\t\tfont-style: normal;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 12px;\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-token);\n\t}\n\t.earncta {\n\t\tmargin-top: 16px;\n\t}\n\n\t@media (min-width: 1024px) {\n\t\t:global(:where(.sf) .wrap) {\n\t\t\tmax-width: 1160px;\n\t\t\tpadding: 0 40px;\n\t\t}\n\t\t:global(:where(.sf) .sec) {\n\t\t\tpadding: 96px 0;\n\t\t}\n\t\t:global(:where(.sf) .h2) {\n\t\t\tfont-size: 52px;\n\t\t\tline-height: 1.02;\n\t\t\tletter-spacing: -0.04em;\n\t\t}\n\t\t:global(:where(.sf) .p) {\n\t\t\tfont-size: 16px;\n\t\t}\n\t\t:global(:where(.sf) .shd) {\n\t\t\tdisplay: flex;\n\t\t\talign-items: flex-end;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: 48px;\n\t\t\tmargin-bottom: 44px;\n\t\t}\n\t\t:global(:where(.sf) .shd .p) {\n\t\t\tmax-width: 420px;\n\t\t}\n\t\t:global(:where(.sf) .eyeb) {\n\t\t\tmargin: 66px 0 18px;\n\t\t\tfont-size: 10.5px;\n\t\t}\n\t\t:global(:where(.sf) .cta),\n\t\t:global(:where(.sf) .cta2),\n\t\t:global(:where(.sf) .cta3) {\n\t\t\tdisplay: inline-flex;\n\t\t\theight: 54px;\n\t\t\tpadding: 0 30px;\n\t\t\tfont-size: 16px;\n\t\t}\n\t\t:global(:where(.sf) .cta) {\n\t\t\theight: 58px;\n\t\t\tpadding: 0 34px;\n\t\t\tborder-radius: 14px;\n\t\t\tfont-size: 17px;\n\t\t}\n\t\t:global(:where(.sf) .quiet) {\n\t\t\tgap: 7px;\n\t\t\tfont-size: 15px;\n\t\t}\n\t\t:global(:where(.sf) .arw svg) {\n\t\t\twidth: 17px;\n\t\t\theight: 17px;\n\t\t}\n\n\t\t.proof {\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t}\n\t\t.proof .wrap {\n\t\t\tgap: 64px;\n\t\t\tpadding-top: 22px;\n\t\t\tpadding-bottom: 22px;\n\t\t\tfont-size: 14px;\n\t\t}\n\t\t.proof span {\n\t\t\tgap: 7px;\n\t\t}\n\t\t.proof b {\n\t\t\tfont-size: 19px;\n\t\t}\n\t\t/* the hero carries this card on desktop */\n\t\t.result {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.proof + .result + :global(.sec) {\n\t\t\tborder-top: 0;\n\t\t}\n\t\t.lede {\n\t\t\tmargin-top: 0;\n\t\t\tfont-size: 16px;\n\t\t}\n\t\t.earn {\n\t\t\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\tgap: 20px;\n\t\t\tmargin-top: 0;\n\t\t\tborder-radius: 0;\n\t\t\toverflow: visible;\n\t\t\tbackground: none;\n\t\t}\n\t\t.earn div {\n\t\t\tdisplay: block;\n\t\t\tpadding: 24px;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tborder-radius: 16px;\n\t\t}\n\t\t.earn b {\n\t\t\tdisplay: block;\n\t\t\tfont-size: 19px;\n\t\t}\n\t\t.earn em {\n\t\t\tdisplay: block;\n\t\t\tmargin-top: 8px;\n\t\t\tfont-size: 14px;\n\t\t}\n\t\t.earncta {\n\t\t\tmargin-top: 28px;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { onMount } from 'svelte';\n\timport { browser } from '$app/environment';\n\timport GoogleOneTap from '$lib/components/auth/GoogleOneTap.svelte';\n\timport UpgradeModal from '$lib/components/UpgradeModal.svelte';\n\timport { page } from '$app/state';\n\timport { notifySignedIn } from '$lib/stores/global-realtime';\n\timport { trackLanding } from '$lib/analytics';\n\timport LandingSignupFirst from '$lib/components/landing/LandingSignupFirst.svelte';\n\timport { LANDING_VARIANT } from '$lib/landing-variant';\n\timport { t } from '$lib/i18n';\n\n\tlet { data } = $props();\n\n\t// RAT-199: /pricing redirects bounce here with ?upsell=already_used or\n\t// ?upsell=out_of_credits. Open the unified Pro modal so the user can\n\t// subscribe without a second pageload. Stripe also lands here on success\n\t// (?subscribed=true) and cancel (?canceled=true) — show a brief toast\n\t// either way and clean the URL so a refresh doesn't re-trigger.\n\tlet showUpsellModal = $state(false);\n\tlet upsellFeature = $state<'rate' | 'arena' | 'generic'>('generic');\n\tlet stripeBanner = $state<'subscribed' | 'canceled' | null>(null);\n\tonMount(() => {\n\t\tif (!browser) return;\n\t\tconst url = new URL(window.location.href);\n\t\tconst upsell = url.searchParams.get('upsell');\n\t\tconst subscribed = url.searchParams.get('subscribed') === 'true';\n\t\tconst canceled = url.searchParams.get('canceled') === 'true';\n\t\t// RAT-491: OAuth return leg. The homepage runs no resume flow of its own,\n\t\t// so a google sign-in that lands back here used to leave `?oauth_resume=1`\n\t\t// dangling with no sign the sign-in worked. Consume the flag and pop a\n\t\t// \"you're signed in\" toast so success is visible — the same way the duel /\n\t\t// arena gates make their return legible.\n\t\tconst oauthResume = url.searchParams.get('oauth_resume') === '1';\n\t\tvoid upsell; // handled by the $effect below, not here — see its comment\n\t\tif (subscribed) stripeBanner = 'subscribed';\n\t\telse if (canceled) stripeBanner = 'canceled';\n\t\tif (oauthResume && data.user) notifySignedIn();\n\t\t// Clean transient params so refresh doesn't re-fire. `upsell` is\n\t\t// deliberately NOT stripped here — it clears on modal close\n\t\t// (clearUpsellParam) so a Back/Forward round trip re-shows the modal.\n\t\tif (subscribed || canceled || oauthResume) {\n\t\t\turl.searchParams.delete('subscribed');\n\t\t\turl.searchParams.delete('canceled');\n\t\t\turl.searchParams.delete('oauth_resume');\n\t\t\twindow.history.replaceState({}, '', url.toString());\n\t\t}\n\t});\n\n\t// Reads the flag off `page.url` rather than in onMount, because onMount only\n\t// runs on a fresh mount and SvelteKit reuses this component when the route\n\t// doesn't change. Going Back to `/` and Forward again to `/?upsell=…` is the\n\t// common shape of that, and it left the modal silently un-shown — the exact\n\t// \"bounced with no explanation\" case this is here to prevent.\n\t//\n\t// `?upsell=` is deliberately NOT stripped on show: it clears on modal close\n\t// (clearUpsellParam, via window.history.replaceState, which doesn't touch\n\t// page.url) so a Back/Forward round trip re-shows the modal while a later\n\t// refresh doesn't re-trigger it.\n\t$effect(() => {\n\t\tconst upsell = page.url.searchParams.get('upsell');\n\t\tif (upsell === 'already_used' || upsell === 'out_of_credits') {\n\t\t\tupsellFeature = 'rate';\n\t\t\tshowUpsellModal = true;\n\t\t}\n\t});\n\n\tfunction clearUpsellParam() {\n\t\tif (!browser) return;\n\t\tconst url = new URL(window.location.href);\n\t\tif (!url.searchParams.has('upsell')) return;\n\t\turl.searchParams.delete('upsell');\n\t\twindow.history.replaceState({}, '', url.toString());\n\t}\n\n\t// Top of the landing funnel. Queued until posthog-js loads (analytics.ts),\n\t// like every other event. The page still reports as `feature_strip`, the arm\n\t// that won (RAT-555), so the funnels carry on from the test.\n\tonMount(() => {\n\t\ttrackLanding('landing_viewed', LANDING_VARIANT);\n\t});\n</script>\n\n<!-- RAT-186: Google One Tap. Renders nothing in the DOM — Google injects\n     its own iframe overlay. Skip entirely when the user is already signed in. -->\n{#if !data.session}\n\t<GoogleOneTap />\n{/if}\n\n<!-- RAT-199: Stripe redirect banners. Auto-dismiss URL is already cleaned in\n\t onMount; the toast itself can be closed by tapping the X. -->\n{#if stripeBanner === 'subscribed'}\n\t<div class=\"fixed top-20 left-1/2 z-50 -translate-x-1/2 px-4\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={() => (stripeBanner = null)}\n\t\t\tclass=\"cursor-pointer rounded-xl border border-green/30 bg-green/10 px-5 py-3 text-sm font-medium text-green shadow-[0_8px_24px_rgba(0,0,0,0.3)] backdrop-blur\"\n\t\t\taria-label={t('dismiss')}\n\t\t>\n\t\t\t{t(\"you're Pro. welcome in.\")}\n\t\t</button>\n\t</div>\n{:else if stripeBanner === 'canceled'}\n\t<div class=\"fixed top-20 left-1/2 z-50 -translate-x-1/2 px-4\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={() => (stripeBanner = null)}\n\t\t\tclass=\"cursor-pointer rounded-xl border border-border bg-surface/80 px-5 py-3 text-sm font-medium text-muted shadow-[0_8px_24px_rgba(0,0,0,0.3)] backdrop-blur\"\n\t\t\taria-label={t('dismiss')}\n\t\t>\n\t\t\t{t('payment canceled. Pro is here when you change your mind.')}\n\t\t</button>\n\t</div>\n{/if}\n\n<!-- C + strip, the landing test's winner (experiment 468970, RAT-555). -->\n<LandingSignupFirst {data} />\n\n<!-- RAT-199: Pro upsell modal — opens when /pricing redirected here with a\n\t contextual `?upsell=` flag. Same component the rest of the app uses. -->\n<UpgradeModal\n\topen={showUpsellModal}\n\tonclose={() => {\n\t\tshowUpsellModal = false;\n\t\tclearUpsellParam();\n\t}}\n\tfeature={upsellFeature}\n/>\n"],"version":3}