{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c37-78b1-954b-3783aab92a98","file":"DU0IlQht.mjs","mappings":"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","names":["isWinner","$$props","ribbon","$.derived","certUrl","filename","blob","$.state","blobUrl","failed","$.user_effect","u","$.set","revoked","r","b","isTouchDevice","download","$.get","file","err","a","div","root","p","div_1","div_2","p_1","p_2","span","$.sibling","text_3","$.child","$.reset","button","text_4","$.set_text","$.delegated","prizeForRank","tiers","rank","t","lastContest","lastStandings","$.prop","myEntry","MOCK_CONTEST","MOCK_STANDINGS","id","nick","tagline","likes","i","isAnon","isMockRecap","recap","recapStandings","podium","topPrize","recapVotes","s","recapMax","sampleRow","sampleCert","myCert","diplomaCert","fmt","n","header","$.first_child","fragment","node","root_1","span_1","root_2","$$render","consequent","alternate","span_2","span_3","section","root_3","node_2","$0","getAvatarUrl","DuelAvatar","p_3","root_4","consequent_1","p_4","root_5","text_7","$.append","$$anchor","consequent_2","p_5","node_4","div_3","node_5","p_6","text_9","node_6","p_7","root_6","text_10","consequent_3","p_8","div_4","node_7","p_9","text_12","node_8","p_10","root_7","text_13","consequent_4","p_11","consequent_5","div_5","node_1","section_1","div_6","span_4","div_7","$.each","row","$$element","span_5","fragment_2","text_16","node_10","div_8","p_12","text_17","span_6","root_10","text_18","$.template_effect","consequent_6","div_9","div_10","span_7","text_19","$.set_class","$.set_style","$1","aside","ContestCertificateCard","div_11","root_12","h2","text_20","consequent_7","alternate_1","div_12","section_2","p_13","span_8","fragment_4","consequent_8","alternate_2","section_3","h2_1","p_14","root_15","div_13","fragment_5","tier","div_14","root_17","p_15","p_16","text_24","consequent_9","alternate_3","div_15","div_16","span_9","text","text_1","text_15","text_23"],"sources":["../../../../../../src/lib/components/contest/ContestCertificateCard.svelte","../../../../../../src/lib/types/contest.ts","../../../../../../src/lib/components/contest/ContestRecap.svelte"],"sourcesContent":["<script lang=\"ts\">\n\t// \"Everyone who entered gets a diploma\" — the elementary-school participation\n\t// certificate. Renders a small teaser of the diploma + a download button that\n\t// grabs the server-generated PNG. Download path mirrors FoilCardHero: pre-fetch\n\t// the blob so the click handler is synchronous (iOS drops user activation\n\t// across an awaited fetch), Web Share on touch → <a download> on desktop.\n\n\tinterface CertData {\n\t\tname: string;\n\t\tweek: number;\n\t\trank: number;\n\t\tvotes: number;\n\t\tentries: number;\n\t\t/** free-text prize label for this rank; '' = no prize */\n\t\tprize: string;\n\t}\n\n\tlet { cert }: { cert: CertData } = $props();\n\n\tconst isWinner = $derived(cert.rank >= 1 && cert.rank <= 3);\n\tconst ribbon = $derived(\n\t\tcert.rank === 1\n\t\t\t? '1st place'\n\t\t\t: cert.rank === 2\n\t\t\t\t? '2nd place'\n\t\t\t\t: cert.rank === 3\n\t\t\t\t\t? '3rd place'\n\t\t\t\t\t: 'participant'\n\t);\n\n\tconst certUrl = $derived(\n\t\t`/og/contest/certificate?` +\n\t\t\tnew URLSearchParams({\n\t\t\t\tname: cert.name,\n\t\t\t\tweek: String(cert.week),\n\t\t\t\trank: String(cert.rank),\n\t\t\t\tvotes: String(cert.votes),\n\t\t\t\tentries: String(cert.entries),\n\t\t\t\tprize: cert.prize.slice(0, 60)\n\t\t\t}).toString()\n\t);\n\n\tconst filename = $derived(\n\t\t`ratemyd-diploma-${cert.name.replace(/[^a-z0-9]+/gi, '-') || 'entry'}.png`\n\t);\n\n\t// Pre-fetched blob — see note above. Re-fetched whenever the cert URL changes.\n\tlet blob = $state<Blob | null>(null);\n\tlet blobUrl = $state<string | null>(null);\n\tlet failed = $state(false);\n\n\t$effect(() => {\n\t\tconst u = certUrl;\n\t\tblob = null;\n\t\tblobUrl = null;\n\t\tfailed = false;\n\t\tlet revoked: string | null = null;\n\t\tfetch(u)\n\t\t\t.then((r) => (r.ok ? r.blob() : null))\n\t\t\t.then((b) => {\n\t\t\t\tif (b) {\n\t\t\t\t\tblob = b;\n\t\t\t\t\tblobUrl = revoked = URL.createObjectURL(b);\n\t\t\t\t} else {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => (failed = true));\n\t\treturn () => {\n\t\t\tif (revoked) URL.revokeObjectURL(revoked);\n\t\t};\n\t});\n\n\tfunction isTouchDevice() {\n\t\treturn typeof window !== 'undefined' && window.matchMedia('(pointer: coarse)').matches;\n\t}\n\n\tasync function download() {\n\t\tif (!blob || !blobUrl) return;\n\t\tif (isTouchDevice()) {\n\t\t\tconst file = new File([blob], filename, { type: 'image/png' });\n\t\t\tif (navigator.canShare?.({ files: [file] })) {\n\t\t\t\ttry {\n\t\t\t\t\tawait navigator.share({ files: [file] });\n\t\t\t\t\treturn;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif ((err as Error)?.name === 'AbortError') return;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst a = document.createElement('a');\n\t\ta.href = blobUrl;\n\t\ta.download = filename;\n\t\tdocument.body.appendChild(a);\n\t\ta.click();\n\t\ta.remove();\n\t}\n</script>\n\n<div class=\"rounded-2xl border border-border bg-surface p-6\">\n\t<span\n\t\tclass=\"inline-flex items-center gap-2 text-[11px] font-semibold tracking-[0.16em] text-coral uppercase\"\n\t>\n\t\t<svg class=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t<path\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\td=\"M9 12l2 2 4-4m-7 8a8 8 0 100-16 8 8 0 000 16z\"\n\t\t\t/>\n\t\t</svg>\n\t\tyour diploma\n\t</span>\n\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight text-text\">\n\t\tyou showed up. it's official.\n\t</h2>\n\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\twin or lose, everyone who entered week {cert.week} gets a certificate. yours is signed, sealed, and\n\t\tready — suitable for framing.\n\t</p>\n\n\t<!-- diploma teaser -->\n\t<div class=\"relative mt-5 overflow-hidden rounded-xl border-2 border-coral/70 bg-bg p-4\">\n\t\t<div class=\"rounded-lg border border-border px-4 py-5 text-center\">\n\t\t\t<p class=\"font-display text-[9px] font-bold tracking-[0.3em] text-muted uppercase\">\n\t\t\t\tofficial diploma\n\t\t\t</p>\n\t\t\t<p class=\"mt-2 font-display text-[13px] font-bold tracking-tight text-text uppercase\">\n\t\t\t\t{isWinner ? 'certificate of achievement' : 'certificate of participation'}\n\t\t\t</p>\n\t\t\t<div class=\"mx-auto mt-2 h-0.5 w-8 rounded-full bg-coral\"></div>\n\t\t\t<p class=\"mt-3 truncate font-display text-2xl font-bold tracking-tight text-coral\">\n\t\t\t\t{cert.name}\n\t\t\t</p>\n\t\t\t<span\n\t\t\t\tclass=\"mt-2 inline-block rounded-full border px-2.5 py-0.5 font-display text-[9px] font-bold tracking-[0.18em] uppercase {isWinner\n\t\t\t\t\t? 'border-coral/60 text-coral'\n\t\t\t\t\t: 'border-border text-muted'}\"\n\t\t\t>\n\t\t\t\t{ribbon}\n\t\t\t</span>\n\t\t</div>\n\t</div>\n\n\t<button\n\t\tonclick={download}\n\t\tdisabled={!blobUrl}\n\t\tclass=\"mt-5 flex w-full items-center justify-center gap-2 rounded-xl bg-coral px-5 py-3 text-center text-sm font-semibold text-white transition-colors hover:bg-coral-dark disabled:opacity-50\"\n\t>\n\t\t<svg class=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t<path\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\td=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\"\n\t\t\t/>\n\t\t</svg>\n\t\t{failed\n\t\t\t? 'diploma still cooking…'\n\t\t\t: !blobUrl\n\t\t\t\t? 'preparing your diploma…'\n\t\t\t\t: 'download your certificate'}\n\t</button>\n\t<p class=\"mt-2.5 text-center text-[11px] text-muted/60\">free. unaccredited. deeply earned.</p>\n</div>\n","// RAT-382: weekly contest types shared between server + UI.\n// Two kinds share the contest family: 'photo' (the original \"Most Beautiful\"\n// pageant — upload + crowd vote) and 'rater' (rater of the week — no entries,\n// scored from real activity + one community vote per member).\n\nexport type ContestStatus = 'draft' | 'live' | 'closed';\nexport type ContestKind = 'photo' | 'rater';\nexport type ContestVoteValue = 'like' | 'pass';\n\n/** Free-text prize per place, index = place - 1: [\"$120 + the pin\", \"$50\", \"$30\"].\n *  Every prize is a label — fulfilled by hand either way. */\nexport type ContestPrizeTiers = string[];\n\n/** Per-unit point weights for a rater contest. Stored on contest.scoring;\n *  CONTEST_DEFAULT_SCORING fills anything missing. */\nexport interface ContestScoring {\n\t/** one community vote (one per member per week) */\n\tvote: number;\n\t/** one delivered rate (peer_rate status='rated', requester ≠ rater) */\n\trate: number;\n\t/** one new follower (first-ever follow inside the window, still following) */\n\tfollower: number;\n\t/** one token received as a tip / gift (token_gift) */\n\ttipToken: number;\n\t/** one token earned (token_earn: rate price, floor cut, albums, ppv, …) */\n\tearnedToken: number;\n\t/** one review star (rate_review.rating 1-5) */\n\treviewStar: number;\n\t/** one minute live on the floor (live_session.kind = 'floor') */\n\tfloorMinute: number;\n\t/** one minute live on cam (live_session.kind = 'cam') */\n\tcamMinute: number;\n\t// ── anti-abuse knobs ──\n\t/** the account sending a vote / rate / tip / follow / review must be at\n\t *  least this old (days); fresh alts don't count anywhere. */\n\tminAccountAgeDays: number;\n\t/** rates counted from the same requester → rater pair, per week */\n\tmaxRatesPerPair: number;\n\t/** live minutes counted per day, per kind (leaving the cam on doesn't scale) */\n\tmaxLiveMinutesPerDay: number;\n}\n\nexport const CONTEST_DEFAULT_SCORING: ContestScoring = {\n\tvote: 15,\n\trate: 10,\n\tfollower: 5,\n\ttipToken: 4,\n\tearnedToken: 3,\n\treviewStar: 3,\n\tfloorMinute: 2,\n\tcamMinute: 1,\n\tminAccountAgeDays: 5,\n\tmaxRatesPerPair: 3,\n\tmaxLiveMinutesPerDay: 240\n};\n\nexport interface ContestSummary {\n\tid: string;\n\tweekNumber: number;\n\tslug: string;\n\ttitle: string | null;\n\tstatus: ContestStatus;\n\tkind: ContestKind;\n\tprizeTiers: ContestPrizeTiers;\n\t/** Resolved weights (defaults merged) — rater kind; null for photo. */\n\tscoring: ContestScoring | null;\n\tstartsAt: string | null;\n\tvotingEndsAt: string | null;\n\twinnerEntryId: string | null;\n\tcreatedAt: string;\n\tclosedAt: string | null;\n}\n\n/** Label for a place (1-based), or null when that place wins nothing. */\nexport function prizeForRank(tiers: ContestPrizeTiers, rank: number): string | null {\n\tconst t = tiers[rank - 1];\n\treturn t && t.trim() ? t.trim() : null;\n}\n\n// ── photo contest ───────────────────────────────────────────────────────────\n\n/** A single row in the live standings / final results board. */\nexport interface ContestStandingRow {\n\tentryId: string;\n\trank: number;\n\tuserId: string;\n\t/** Resolved display name: live nickname → snapshot → 'anonymous'. */\n\tdisplayName: string;\n\tisAnonymous: boolean;\n\tnickname: string | null; // current profile nickname, for the /u/ link (null if anon)\n\tavatarPath: string | null;\n\ttagline: string | null;\n\ttotalLikes: number;\n\ttotalPasses: number;\n\tfinalRank: number | null;\n\tprizeLabel: string | null; // free-text prize if this rank wins one\n}\n\n/** An entry to judge in the \"vote now\" feed (photo URL resolved by the load). */\nexport interface ContestVoteCard {\n\tentryId: string;\n\tuserId: string;\n\tdisplayName: string;\n\tisAnonymous: boolean;\n\tnickname: string | null;\n\tavatarPath: string | null;\n\ttagline: string | null;\n\timageUrl: string;\n\tmediaType: string;\n\taiScore: number | null;\n\ttotalLikes: number;\n\ttotalPasses: number;\n}\n\n/** Full detail for a single entry page (own-entry view + comments). */\nexport interface ContestEntryDetail {\n\tentryId: string;\n\tcontestId: string;\n\tcontestSlug: string;\n\tweekNumber: number;\n\tcontestStatus: ContestStatus;\n\tuserId: string;\n\tdisplayName: string;\n\tisAnonymous: boolean;\n\tnickname: string | null;\n\tavatarPath: string | null;\n\ttagline: string | null;\n\timageUrl: string;\n\tmediaType: string;\n\taiScore: number | null;\n\ttotalLikes: number;\n\ttotalPasses: number;\n\trank: number; // live or final rank within the contest\n\ttotalEntries: number;\n\tfinalRank: number | null;\n\t/** Free-text prize for this entry's rank, ready to render; null if none. */\n\tprizeLabel: string | null;\n\tcreatedAt: string;\n\tisOwner: boolean;\n\thasVoted: boolean;\n}\n\n/** A single voter in the token-unlocked \"who liked this\" list. */\nexport interface ContestVoter {\n\tuserId: string;\n\t/** current profile nickname — also the /u/[nickname] link target (null = no link). */\n\tnickname: string | null;\n\tavatarPath: string | null;\n}\n\nexport interface ContestComment {\n\tid: string;\n\tuserId: string | null;\n\tnickname: string | null; // snapshot\n\tliveNickname: string | null;\n\tavatarPath: string | null;\n\tbody: string;\n\tcreatedAt: string | Date;\n\tmoderationStatus: 'pending' | 'ok' | 'hidden';\n}\n\n/** A user's prize placement, for profile \"contests won\" history. */\nexport interface ContestWinRow {\n\tcontestId: string;\n\tweekNumber: number;\n\tslug: string;\n\tkind: ContestKind;\n\trank: number;\n\tprizeLabel: string;\n\tpaidAt: string | null;\n\tcreatedAt: string;\n}\n\n// ── rater contest ───────────────────────────────────────────────────────────\n\n/** Raw counts behind a rater's points, per signal, inside the window. */\nexport interface RaterBreakdown {\n\ttokens: number; // token_earn tokens\n\ttipped: number; // token_gift tokens received\n\tvotes: number;\n\trates: number;\n\tfollowers: number;\n\tstars: number; // sum of review ratings\n\treviews: number; // count of reviews (for the \"4.9★ · 19\" caption)\n\tfloorMin: number;\n\tcamMin: number;\n}\n\n/** Points by group — what the composition bar draws. */\nexport interface RaterPointGroups {\n\tpaid: number; // tipToken + earnedToken\n\tcrowd: number; // vote\n\twork: number; // rate\n\tvibe: number; // follower + reviewStar + floorMinute + camMinute\n}\n\nexport interface RaterStandingRow {\n\trank: number;\n\tuserId: string;\n\tnickname: string;\n\tavatarPath: string | null;\n\tisVerified: boolean;\n\tisSubscriber: boolean;\n\traterContestWins: number;\n\tpoints: number;\n\tgroups: RaterPointGroups;\n\tbreakdown: RaterBreakdown;\n\tprizeLabel: string | null;\n}\n\n/** The viewer's own vote in a live rater contest. */\nexport interface RaterVoteState {\n\t/** can this viewer vote at all (logged in, account old enough) */\n\teligible: boolean;\n\t/** why not, when !eligible */\n\treason: 'anon' | 'too_new' | null;\n\t/** rater currently voted for (null = no vote yet) */\n\traterId: string | null;\n}\n","<script lang=\"ts\">\n\timport DuelAvatar from '$lib/components/duel/DuelAvatar.svelte';\n\timport ContestCertificateCard from '$lib/components/contest/ContestCertificateCard.svelte';\n\timport { getAvatarUrl } from '$lib/avatar';\n\timport { prizeForRank, type ContestStandingRow, type ContestSummary } from '$lib/types/contest';\n\n\t// The closed-contest results recap shown on /contest when nothing is live.\n\t// Fed by the last closed contest; falls back to mock data so the design still\n\t// renders before any round has closed (also drives /contest/test-empty in dev).\n\ttype RecapEntry = {\n\t\tdisplayName: string;\n\t\trank: number;\n\t\ttotalLikes: number;\n\t\t/** free-text prize for this rank; null = none */\n\t\tprizeLabel: string | null;\n\t\ttotalEntries: number;\n\t};\n\tlet {\n\t\tlastContest = null,\n\t\tlastStandings = [],\n\t\tmyEntry = null\n\t}: {\n\t\tlastContest?: ContestSummary | null;\n\t\tlastStandings?: ContestStandingRow[];\n\t\tmyEntry?: RecapEntry | null;\n\t} = $props();\n\n\tconst MOCK_CONTEST: ContestSummary = {\n\t\tid: 'mock',\n\t\tweekNumber: 1,\n\t\tslug: 'week-1',\n\t\ttitle: null,\n\t\tstatus: 'closed',\n\t\tkind: 'photo',\n\t\tprizeTiers: ['$500', '$200', '$50'],\n\t\tscoring: null,\n\t\tstartsAt: '2026-06-01T00:00:00.000Z',\n\t\tvotingEndsAt: '2026-06-08T00:00:00.000Z',\n\t\twinnerEntryId: 'm1',\n\t\tcreatedAt: '2026-06-01T00:00:00.000Z',\n\t\tclosedAt: '2026-06-08T00:00:00.000Z'\n\t};\n\tconst MOCK_STANDINGS: ContestStandingRow[] = (\n\t\t[\n\t\t\t['m1', 'kingsnake', 'all gas, no notes.', 4127],\n\t\t\t['m2', 'nightshift', 'judged sober for once.', 3891],\n\t\t\t['m3', 'vladimir', 'eastern bloc, western girth.', 3402],\n\t\t\t['m4', 'quietstorm', 'speaks softly.', 2988],\n\t\t\t['m5', 'bigtuesday', null, 2541],\n\t\t\t['m6', 'thecommish', 'undefeated in the group chat.', 2310],\n\t\t\t['m7', 'lowkeyleg', null, 1987],\n\t\t\t['m8', 'mr_october', 'peaks in the cold.', 1654],\n\t\t\t['m9', 'anonymous', null, 1402],\n\t\t\t['m10', 'softboi', 'misleading name.', 1188],\n\t\t\t['m11', 'thefranchise', null, 974],\n\t\t\t['m12', 'lasthonest', 'showed up. that counts.', 731]\n\t\t] as Array<[string, string, string | null, number]>\n\t).map(([id, nick, tagline, likes], i) => {\n\t\tconst rank = i + 1;\n\t\tconst isAnon = nick === 'anonymous';\n\t\treturn {\n\t\t\tentryId: id,\n\t\t\trank,\n\t\t\tuserId: id,\n\t\t\tdisplayName: nick,\n\t\t\tisAnonymous: isAnon,\n\t\t\tnickname: isAnon ? null : nick,\n\t\t\tavatarPath: null,\n\t\t\ttagline,\n\t\t\ttotalLikes: likes,\n\t\t\ttotalPasses: Math.round(likes * 0.4),\n\t\t\tfinalRank: rank <= 3 ? rank : null,\n\t\t\tprizeLabel: prizeForRank(MOCK_CONTEST.prizeTiers, rank)\n\t\t} satisfies ContestStandingRow;\n\t});\n\n\tconst isMockRecap = $derived(!lastContest);\n\tconst recap = $derived<ContestSummary>(lastContest ?? MOCK_CONTEST);\n\tconst recapStandings = $derived<ContestStandingRow[]>(\n\t\tlastContest ? lastStandings : MOCK_STANDINGS\n\t);\n\tconst podium = $derived(recapStandings.slice(0, 3));\n\t// Free-text prize per place; [0] is the headline reward.\n\tconst tiers = $derived(recap.prizeTiers.filter((t) => t.trim().length > 0));\n\tconst topPrize = $derived(tiers[0] ?? null);\n\tconst recapVotes = $derived(recapStandings.reduce((s, r) => s + r.totalLikes, 0));\n\tconst recapMax = $derived(recapStandings[0]?.totalLikes ?? 1);\n\n\t// Diploma showcased in the sidebar. Defaults to a representative entrant (a\n\t// non-podium \"participant\" reads the joke best); a real viewer's own row can\n\t// be threaded in later for a personalized download.\n\tconst sampleRow = $derived(recapStandings.find((r) => r.rank > 3) ?? recapStandings[0]);\n\tconst sampleCert = $derived({\n\t\tname: sampleRow?.displayName ?? 'anonymous',\n\t\tweek: recap.weekNumber,\n\t\trank: sampleRow?.rank ?? 1,\n\t\tvotes: sampleRow?.totalLikes ?? 0,\n\t\tentries: recapStandings.length,\n\t\tprize: sampleRow?.prizeLabel ?? ''\n\t});\n\n\t// The viewer's OWN diploma. On the real recap this is their entry; on the\n\t// mock/dev page (no viewer) we showcase the sample. A logged-in user who\n\t// didn't enter gets the \"you sat it out\" prompt instead of a stranger's cert.\n\tconst myCert = $derived(\n\t\tmyEntry\n\t\t\t? {\n\t\t\t\t\tname: myEntry.displayName,\n\t\t\t\t\tweek: recap.weekNumber,\n\t\t\t\t\trank: myEntry.rank,\n\t\t\t\t\tvotes: myEntry.totalLikes,\n\t\t\t\t\tentries: myEntry.totalEntries,\n\t\t\t\t\tprize: myEntry.prizeLabel ?? ''\n\t\t\t\t}\n\t\t\t: null\n\t);\n\tconst diplomaCert = $derived(myCert ?? (isMockRecap ? sampleCert : null));\n\n\tconst fmt = (n: number) => n.toLocaleString('en-US');\n</script>\n\n<!-- ── CLOSED RECAP: last week's results (real, or mock until one closes) ── -->\n<header class=\"text-center\">\n\t<p class=\"text-[11px] font-semibold tracking-[0.3em] text-coral uppercase\">\n\t\tweekly contest — week {recap.weekNumber}\n\t\t<span class=\"text-muted\">· closed</span>\n\t</p>\n\t<h1\n\t\tclass=\"mx-auto mt-3 max-w-3xl font-display text-[clamp(2rem,7vw,3.75rem)] leading-[0.95] font-bold tracking-tighter\"\n\t>\n\t\tthe votes are in<span class=\"text-coral\">.</span>\n\t</h1>\n\t<p class=\"mx-auto mt-4 max-w-md text-sm leading-relaxed text-muted\">\n\t\tweek {recap.weekNumber} is a wrap — {fmt(recapVotes)} votes counted, prizes handed out. the board's\n\t\tbeen wiped. next round's loading.\n\t</p>\n\t<div\n\t\tclass=\"mt-5 flex flex-wrap items-center justify-center gap-x-4 gap-y-1.5 text-[11px] font-semibold tracking-[0.16em] uppercase\"\n\t>\n\t\t{#if topPrize}\n\t\t\t<span class=\"text-text\">{topPrize} <span class=\"text-muted\">to the winner</span></span>\n\t\t{:else}\n\t\t\t<span class=\"text-text\">glory <span class=\"text-muted\">only</span></span>\n\t\t{/if}\n\t\t<span class=\"h-3 w-px bg-border\"></span>\n\t\t<span class=\"text-text\">{recapStandings.length} <span class=\"text-muted\">entries</span></span>\n\t\t<span class=\"h-3 w-px bg-border\"></span>\n\t\t<span class=\"text-text\">{fmt(recapVotes)} <span class=\"text-muted\">votes</span></span>\n\t</div>\n</header>\n\n<!-- podium -->\n{#if podium.length === 3}\n\t<section class=\"mx-auto mt-10 max-w-3xl\">\n\t\t<div class=\"grid grid-cols-2 items-end gap-3 md:grid-cols-3 md:gap-4\">\n\t\t\t<!-- champion -->\n\t\t\t<div\n\t\t\t\tclass=\"order-first col-span-2 flex flex-col items-center rounded-2xl border border-coral/40 bg-coral/[.07] px-5 pt-7 pb-6 text-center md:order-2 md:col-span-1\"\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"mb-3 rounded-full bg-coral px-2.5 py-1 font-display text-[10px] font-bold tracking-[0.16em] text-white uppercase\"\n\t\t\t\t\t>champion</span\n\t\t\t\t>\n\t\t\t\t<DuelAvatar\n\t\t\t\t\tnickname={podium[0].nickname}\n\t\t\t\t\tavatarUrl={getAvatarUrl(podium[0].avatarPath)}\n\t\t\t\t\tsize={84}\n\t\t\t\t\tvariant=\"coral\"\n\t\t\t\t\tlink={false}\n\t\t\t\t/>\n\t\t\t\t<p class=\"mt-3 w-full truncate font-display text-xl font-bold tracking-tight text-coral\">\n\t\t\t\t\t{podium[0].displayName}\n\t\t\t\t</p>\n\t\t\t\t{#if podium[0].tagline}\n\t\t\t\t\t<p class=\"mt-0.5 w-full truncate px-1 text-[12px] text-muted\">\n\t\t\t\t\t\t\"{podium[0].tagline}\"\n\t\t\t\t\t</p>\n\t\t\t\t{/if}\n\t\t\t\t{#if podium[0].prizeLabel}<p\n\t\t\t\t\t\tclass=\"mt-3 font-display font-bold text-white {podium[0].prizeLabel.length > 8\n\t\t\t\t\t\t\t? 'text-lg leading-snug'\n\t\t\t\t\t\t\t: 'text-3xl'}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{podium[0].prizeLabel}\n\t\t\t\t\t</p>{/if}\n\t\t\t\t<p class=\"mt-1 text-[11px] font-semibold tracking-wider text-coral uppercase\">\n\t\t\t\t\t{fmt(podium[0].totalLikes)} votes\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- 2nd -->\n\t\t\t<div\n\t\t\t\tclass=\"order-2 flex flex-col items-center rounded-2xl border border-border bg-surface px-4 pt-6 pb-5 text-center md:order-1\"\n\t\t\t>\n\t\t\t\t<span class=\"mb-3 font-display text-2xl font-bold text-muted\">2</span>\n\t\t\t\t<DuelAvatar\n\t\t\t\t\tnickname={podium[1].nickname}\n\t\t\t\t\tavatarUrl={getAvatarUrl(podium[1].avatarPath)}\n\t\t\t\t\tsize={56}\n\t\t\t\t\tlink={false}\n\t\t\t\t/>\n\t\t\t\t<p\n\t\t\t\t\tclass=\"mt-2.5 w-full truncate font-display text-[15px] font-bold tracking-tight text-text\"\n\t\t\t\t>\n\t\t\t\t\t{podium[1].displayName}\n\t\t\t\t</p>\n\t\t\t\t{#if podium[1].prizeLabel}<p\n\t\t\t\t\t\tclass=\"mt-2 font-display font-bold text-text {podium[1].prizeLabel.length > 8\n\t\t\t\t\t\t\t? 'text-sm leading-snug'\n\t\t\t\t\t\t\t: 'text-xl'}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{podium[1].prizeLabel}\n\t\t\t\t\t</p>{/if}\n\t\t\t\t<p class=\"mt-0.5 text-[10px] font-semibold tracking-wider text-muted uppercase\">\n\t\t\t\t\t{fmt(podium[1].totalLikes)} votes\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- 3rd -->\n\t\t\t<div\n\t\t\t\tclass=\"order-3 flex flex-col items-center rounded-2xl border border-border bg-surface px-4 pt-5 pb-5 text-center md:order-3\"\n\t\t\t>\n\t\t\t\t<span class=\"mb-3 font-display text-2xl font-bold text-muted\">3</span>\n\t\t\t\t<DuelAvatar\n\t\t\t\t\tnickname={podium[2].nickname}\n\t\t\t\t\tavatarUrl={getAvatarUrl(podium[2].avatarPath)}\n\t\t\t\t\tsize={48}\n\t\t\t\t\tlink={false}\n\t\t\t\t/>\n\t\t\t\t<p\n\t\t\t\t\tclass=\"mt-2.5 w-full truncate font-display text-[15px] font-bold tracking-tight text-text\"\n\t\t\t\t>\n\t\t\t\t\t{podium[2].displayName}\n\t\t\t\t</p>\n\t\t\t\t{#if podium[2].prizeLabel}<p\n\t\t\t\t\t\tclass=\"mt-2 font-display font-bold text-text {podium[2].prizeLabel.length > 8\n\t\t\t\t\t\t\t? 'text-sm leading-snug'\n\t\t\t\t\t\t\t: 'text-xl'}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{podium[2].prizeLabel}\n\t\t\t\t\t</p>{/if}\n\t\t\t\t<p class=\"mt-0.5 text-[10px] font-semibold tracking-wider text-muted uppercase\">\n\t\t\t\t\t{fmt(podium[2].totalLikes)} votes\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</section>\n{/if}\n\n<!-- final board + next round -->\n<div class=\"mt-14 grid grid-cols-1 gap-10 lg:grid-cols-[1fr_22rem] lg:gap-12\">\n\t<!-- final standings -->\n\t<section>\n\t\t<div class=\"mb-4 flex items-center justify-between border-b border-border pb-3\">\n\t\t\t<h2 class=\"text-[11px] font-semibold tracking-[0.22em] text-text uppercase\">\n\t\t\t\tfinal standings\n\t\t\t</h2>\n\t\t\t<span class=\"text-[11px] font-semibold tracking-wider text-muted uppercase\"\n\t\t\t\t>week {recap.weekNumber}</span\n\t\t\t>\n\t\t</div>\n\t\t<div>\n\t\t\t{#each recapStandings.slice(0, 12) as row, i (row.entryId)}\n\t\t\t\t<svelte:element\n\t\t\t\t\tthis={isMockRecap ? 'div' : 'a'}\n\t\t\t\t\thref={isMockRecap ? undefined : `/contest/e/${row.entryId}`}\n\t\t\t\t\tclass=\"flex items-center gap-3 border-b border-border/60 py-2.5 no-underline transition-colors hover:bg-white/[0.015]\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"w-5 shrink-0 text-center font-display text-[13px] font-bold tabular-nums {i === 0\n\t\t\t\t\t\t\t? 'text-coral'\n\t\t\t\t\t\t\t: 'text-muted'}\">{String(i + 1).padStart(2, '0')}</span\n\t\t\t\t\t>\n\t\t\t\t\t<DuelAvatar\n\t\t\t\t\t\tnickname={row.nickname}\n\t\t\t\t\t\tavatarUrl={getAvatarUrl(row.avatarPath)}\n\t\t\t\t\t\tsize={30}\n\t\t\t\t\t\tlink={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"truncate font-display text-[13px] font-semibold {i === 0\n\t\t\t\t\t\t\t\t? 'text-coral'\n\t\t\t\t\t\t\t\t: 'text-text'}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{row.displayName}{#if row.prizeLabel}<span\n\t\t\t\t\t\t\t\t\tclass=\"ml-1.5 font-display text-[10px] font-bold tracking-wider text-coral uppercase\"\n\t\t\t\t\t\t\t\t\t>{row.prizeLabel}</span\n\t\t\t\t\t\t\t\t>{/if}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div class=\"mt-1 h-1 overflow-hidden rounded-full bg-surface-2\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"h-full rounded-full {i === 0 ? 'bg-coral' : 'bg-muted/40'}\"\n\t\t\t\t\t\t\t\tstyle=\"width:{Math.max(3, Math.round((row.totalLikes / recapMax) * 100))}%\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"shrink-0 font-display text-[13px] font-bold tabular-nums {i === 0\n\t\t\t\t\t\t\t? 'text-coral'\n\t\t\t\t\t\t\t: 'text-text/90'}\">{fmt(row.totalLikes)}</span\n\t\t\t\t\t>\n\t\t\t\t</svelte:element>\n\t\t\t{/each}\n\t\t</div>\n\t</section>\n\n\t<!-- your participation diploma — the viewer's own entry, or a prompt if they\n\t\t sat this round out -->\n\t<aside>\n\t\t{#if diplomaCert}\n\t\t\t<ContestCertificateCard cert={diplomaCert} />\n\t\t{:else}\n\t\t\t<div class=\"rounded-2xl border border-border bg-surface p-6\">\n\t\t\t\t<span\n\t\t\t\t\tclass=\"inline-flex items-center gap-2 text-[11px] font-semibold tracking-[0.16em] text-muted uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"h-1.5 w-1.5 rounded-full bg-muted/60\"></span>\n\t\t\t\t\tno diploma this round\n\t\t\t\t</span>\n\t\t\t\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight text-text\">\n\t\t\t\t\tyou sat week {recap.weekNumber} out.\n\t\t\t\t</h2>\n\t\t\t\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\teveryone who enters gets a certificate — win or lose. drop an entry next round and earn\n\t\t\t\t\tyours.\n\t\t\t\t</p>\n\t\t\t\t<a\n\t\t\t\t\thref=\"/contest/enter\"\n\t\t\t\t\tclass=\"mt-5 block rounded-xl bg-coral px-5 py-3 text-center text-sm font-semibold text-white no-underline transition-colors hover:bg-coral-dark\"\n\t\t\t\t\t>line up your entry →</a\n\t\t\t\t>\n\t\t\t</div>\n\t\t{/if}\n\t</aside>\n</div>\n\n<!-- evergreen explainer — so a first-timer landing between rounds still gets it -->\n<div class=\"mt-20 space-y-14 border-t border-border pt-12\">\n\t<section class=\"max-w-2xl\">\n\t\t<h2 class=\"font-display text-2xl font-bold tracking-tight text-text md:text-3xl\">\n\t\t\twhat even is this.\n\t\t</h2>\n\t\t<p class=\"mt-3 text-[15px] leading-relaxed text-muted\">\n\t\t\ta weekly beauty pageant for the one body part you were raised to keep to yourself. enter free,\n\t\t\tlet the crowd vote, and when voting closes the top entries take the rewards —\n\t\t\t{#if topPrize}<span class=\"text-text\">{topPrize}</span> for the winner, questionable judgment for\n\t\t\t\teveryone.{:else}winner takes the crown.{/if} then we wipe it and run it back.\n\t\t</p>\n\t</section>\n\n\t<section>\n\t\t<h2 class=\"mb-5 font-display text-2xl font-bold tracking-tight text-text md:text-3xl\">\n\t\t\thow it works.\n\t\t</h2>\n\t\t<div class=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n\t\t\t<div class=\"rounded-xl border border-border bg-surface p-5\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"mb-3 inline-flex h-9 w-9 items-center justify-center rounded-lg bg-coral text-white\"\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"1.8\"\n\t\t\t\t\t\t><path\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\td=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\"\n\t\t\t\t\t\t/></svg\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t\t<p class=\"font-display text-base font-bold text-text\">enter free</p>\n\t\t\t\t<p class=\"mt-1.5 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\tdrop your best work. no fee, no tokens, no shame. one entry per week.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<div class=\"rounded-xl border border-border bg-surface p-5\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"mb-3 inline-flex h-9 w-9 items-center justify-center rounded-lg bg-coral text-white\"\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2.2\"\n\t\t\t\t\t\t><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t\t<p class=\"font-display text-base font-bold text-text\">the crowd votes</p>\n\t\t\t\t<p class=\"mt-1.5 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\tlogged-in strangers swipe through every entry and like the ones that earn it. one vote per\n\t\t\t\t\tentry, no buying votes.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<div class=\"rounded-xl border border-border bg-surface p-5\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"mb-3 inline-flex h-9 w-9 items-center justify-center rounded-lg bg-coral text-white\"\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t><path\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\td=\"M11.48 3.5a.56.56 0 011.04 0l2.12 5.11a.56.56 0 00.48.35l5.52.44c.5.04.7.66.32.99l-4.2 3.6a.56.56 0 00-.18.56l1.28 5.38a.56.56 0 01-.84.61l-4.72-2.88a.56.56 0 00-.59 0l-4.72 2.88a.56.56 0 01-.84-.61l1.28-5.38a.56.56 0 00-.18-.56l-4.2-3.6a.56.56 0 01.32-.99l5.52-.44a.56.56 0 00.48-.35z\"\n\t\t\t\t\t\t/></svg\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t\t<p class=\"font-display text-base font-bold text-text\">most votes wins</p>\n\t\t\t\t<p class=\"mt-1.5 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\twhen voting closes we tally it. the top entries take the rewards. then a fresh round\n\t\t\t\t\tstarts from zero.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</section>\n\n\t<section>\n\t\t<h2 class=\"mb-5 font-display text-2xl font-bold tracking-tight text-text md:text-3xl\">\n\t\t\t{tiers.length <= 1 ? 'the prize.' : 'the prizes.'}\n\t\t</h2>\n\t\t{#if tiers.length === 0}\n\t\t\t<p class=\"text-[13px] text-muted\">no prize this week — bragging rights only.</p>\n\t\t{:else}\n\t\t\t<div\n\t\t\t\tclass=\"grid items-stretch gap-3 md:gap-4 {tiers.length >= 3\n\t\t\t\t\t? 'grid-cols-3'\n\t\t\t\t\t: tiers.length === 2\n\t\t\t\t\t\t? 'grid-cols-2'\n\t\t\t\t\t\t: 'grid-cols-1'}\"\n\t\t\t>\n\t\t\t\t{#each tiers as tier, i (i)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex flex-col justify-center rounded-xl p-4 text-center md:p-5 {i === 0\n\t\t\t\t\t\t\t? 'bg-coral'\n\t\t\t\t\t\t\t: 'border border-border bg-surface'}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"text-[10px] font-semibold tracking-[0.16em] uppercase {i === 0\n\t\t\t\t\t\t\t\t? 'text-white/70'\n\t\t\t\t\t\t\t\t: 'text-muted'}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{i === 0 ? '1st place' : i === 1 ? '2nd' : '3rd'}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"mt-1.5 font-display leading-snug font-bold {tier.length > 8\n\t\t\t\t\t\t\t\t? 'text-sm md:text-base'\n\t\t\t\t\t\t\t\t: 'text-2xl md:text-4xl'} {i === 0 ? 'text-white' : 'text-text'}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{tier}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t\t<p class=\"mt-3 text-[12px] text-muted/60\">\n\t\t\t\thanded to the top entries when voting closes — most votes wins, delivered by hand. cash\n\t\t\t\tprizes need your payout details in your\n\t\t\t\t<a href=\"/p?tab=settings\" class=\"text-coral underline\">profile</a>.\n\t\t\t</p>\n\t\t{/if}\n\t</section>\n\n\t<div class=\"rounded-xl border border-coral/30 bg-coral/[.07] p-5\">\n\t\t<p class=\"font-display text-base font-bold text-coral\">real photos only.</p>\n\t\t<p class=\"mt-1.5 text-[13px] leading-relaxed text-muted\">\n\t\t\treal rewards, judged on real bodies. fake, stolen, or AI-generated pics — or anyone else's\n\t\t\tphoto passed off as yours — get the entry deleted, the payout voided, and the account\n\t\t\t<span class=\"font-semibold text-text\">permanently banned</span>.\n\t\t</p>\n\t</div>\n</div>\n\n<!-- recap sticky: prime the next entry -->\n<div\n\tclass=\"pointer-events-none fixed inset-x-0 bottom-0 z-40 flex justify-center px-4 pb-[calc(68px+env(safe-area-inset-bottom,0px)+0.5rem)] md:pb-5\"\n>\n\t<div\n\t\tclass=\"pointer-events-auto flex w-full max-w-[600px] items-center gap-3 rounded-2xl border border-border bg-surface/95 px-4 py-2.5 shadow-[0_-4px_40px_rgba(0,0,0,0.4)] md:backdrop-blur-xl\"\n\t>\n\t\t<span\n\t\t\tclass=\"hidden shrink-0 text-[10px] font-semibold tracking-[0.18em] text-muted uppercase sm:block\"\n\t\t\t>next round</span\n\t\t>\n\t\t<span class=\"min-w-0 flex-1 truncate text-[12px] text-muted\"\n\t\t\t>{topPrize ? `${topPrize} to the winner` : 'bragging rights'} · be first in when it opens.</span\n\t\t>\n\t\t<a\n\t\t\thref=\"/contest/enter\"\n\t\t\tclass=\"shrink-0 rounded-full bg-coral px-4 py-1.5 text-[12px] font-semibold text-white no-underline transition-colors hover:bg-coral-dark\"\n\t\t\t>get ready →</a\n\t\t>\n\t</div>\n</div>\n"],"version":3}