{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4cfb-7c82-8ad7-aee730b84a28","file":"69.BEauAMse.mjs","mappings":"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","names":["MAX_LENGTH","body","$.state","posting","error","remaining","$.derived","$.get","canPost","submit","e","$.set","res","$$props","posted","err","t","form","root_1","textarea","$.child","$.remove_textarea_child","$.set_attribute","div","$.sibling","p","button","text_1","$.reset","p_1","root_2","$$render","consequent","$0","$.set_class","$.event","$$value","div_1","root_3","p_2","a","text_4","$.append","$$anchor","isRater","isSubscriber","isVerified","moderationStatus","isHidden","displayName","isOwn","profileHref","fmtAge","d","ms","m","h","deleting","handleDelete","article","root","getAvatarUrl","DuelAvatar","node","header","text","span","$.template_effect","$.set_text","alternate","UserBadge","node_2","span_1","text_3","$.delegated","span_2","root_4","ReportTrigger","node_4","consequent_2","root_5","root_6","consequent_3","alternate_1","comments","$.proxy","hasMore","loading","LIST_PAGE","loadMore","next","prepend","c","id","prev","ul","$.first_child","fragment_1","li","BeatCommentRow","node_1","consequent_1","variant","amount","hours","boosting","boostError","spotlightHoursLeft","dec","inc","boost","b","div_2","button_1","button_2","text_2","span_3","strong","span_4","text_6","$2","voterBlock","side","$.noop","label","count","sv","isUnlocked","CAP","namedAll","u","named","namedOverflow","anonTotal","$.each","url","node_3","img","root_7","li_1","root_8","li_2","root_9","text_5","root_10","node_6","text_8","revealing","consequent_5","consequent_6","alternate_2","revealVoters","consequent_4","alternate_3","voters","unlocked","$.user_effect","revealError","root_14","node_8","node_9","p_3","root_15","consequent_7","text_9","consequent_8","showPostToFeed","copied","copyLink","trackBeatLinkCopied","SUBREDDITS","redditSubmitUrl","sub","params","h2","code_1","PostToFeedCta","div_3","a_1","trackBeatRedditClick","trackCtaClick","myVote","isLive","PREV_STACK_KEY","VISITED_KEY","VISITED_MAX","SORT_KEY","DEFAULT_SORT","FORMAT_KEY","nextCodePrefetch","nextNavigating","prevAvailable","stageEl","pendingScroll","prefetchReqId","readPrevStack","raw","writePrevStack","stack","readVisited","addVisited","list","x","readSort","readFormat","buildNextUrl","visited","sort","format","prefetchNext","myReq","preloadData","goToNext","target","goto","goToPrev","onKey","touchStartX","touchStartY","touchActive","swipeDx","SWIPE_COMMIT_PX","onTouchStart","onTouchMove","dx","dy","allowed","onTouchEnd","fragment","$.set_style","rostersGrid","teamPanel","roster","team","slots","isWinner","isClosed","winnerSide","accent","votesA","votesB","pctA","pctB","cap","div_4","div_5","div_6","slot","div_7","video","div_8","span_5","span_6","node_5","div_9","root_13","svg","span_7","span_8","joining","startJoin","joinTeam","joinSlot","div_10","isPending","inRoster","IMAGE_MIME","VIDEO_MIME","IMAGE_MAX","VIDEO_MAX","UPLOAD_TIMEOUT_MS","status","myPick","boostCount","boostedUntil","viewerTokens","showBuyTokens","buyTokensReason","dv","handleBoosted","r","teamLabel","isExpired","membersOnlyBlocked","canVote","shareSubtitle","total","closesIso","shareUrl","showAuth","reportOpen","commentListRef","joinInput","joinError","joinStartAs","validateFile","f","isImage","isVideo","resetJoin","onJoinFile","input","isHeic","heicToJpeg","v","submitJoin","file","clean","stripExifClient","fd","controller","timer","wrong","wrongCategoryOf","invalidateAll","voteSubmitting","vote","countBeatVote","onMount","prevFilled","s","filled","input_1","fragment_3","section","div_11","span_9","span_10","fragment_4","span_11","text_11","span_12","fragment_5","span_13","root_18","$.index","part","i","CountdownTimer","consequent_9","consequent_10","text_12","span_14","root_21","span_15","root_22","text_15","consequent_11","consequent_13","BeatBoostControl","consequent_14","stage","node_13","div_12","root_26","root_27","span_16","root_29","consequent_15","root_30","text_18","div_13","root_31","text_19","button_3","text_20","consequent_17","alternate_4","consequent_18","BeatNextNav","node_17","fragment_13","root_34","text_22","startAsLabel","consequent_20","consequent_21","div_14","root_35","fragment_14","p_4","fragment_15","p_5","consequent_22","alternate_5","consequent_23","consequent_19","alternate_6","BeatVoters","consequent_24","div_15","root_39","BeatShare","node_24","consequent_25","div_16","node_23","button_4","text_27","section_1","p_6","BeatCommentForm","node_25","div_17","BeatCommentList","node_26","ReportContentModal","node_27","AuthSheet","node_28","BuyTokensModal","node_29","text_29","activeMode","challenge","viewerSide","isCreator","codeChanged","untrack","votersUnlocked","buyTokensSource","pingState","pingOn","pingMe","openAuthSheet","qa","pingResumed","page","replaceState","goToSignIn","voteError","voteNotice","authFlow","acceptFile","savePhotoAccept","acceptSubmitting","acceptError","acceptRefused","startAsKind","csamAckAccept","reportEntityType","openReport","type","acceptDragOver","lightboxSide","joinFormEl","scrollToJoinForm","votersEl","scrollToVoters","isTeamMatch","isParticipant","totalVotes","acceptFileLabel","size","kind","expiresIso","created","intervalMs","code","prevStatus","fresh","viewerRole","lastTrackedViewCode","trackBeatChallengeView","handleVoteClick","castVote","deviceVotes","throwOwnHidden","beatVotesOnDevice","throwOwnDismissed","hideThrowOwn","dismissThrowOwn","trackBeatVoteRejected","pickAcceptFile","handleAcceptDrop","submitAccept","picked","fileType","trackBeatChallengeAcceptLost","trackBeatChallengeAccept","useSavedPhotoAccept","blob","lightboxUrl","lightboxIsVideo","onRedditClick","pendingVoteScroll","beatLobbyHref","sanitizeBeatKind","BeatTeamMatch","root_11","root_12","node_7","fragment_6","pingCard","live","root_17","root_19","fragment_8","text_13","p_7","root_23","node_12","root_24","text_17","root_25","consequent_12","p_8","fragment_10","h1","p_9","p_10","fragment_11","h1_1","text_24","p_11","p_12","fragment_16","h1_2","text_28","p_13","p_14","a_2","text_32","$4","resolve","THROW_YOUR_OWN_AFTER","p_15","fragment_17","h1_3","text_34","a_3","root_36","text_37","$3","p_16","fragment_18","h1_4","text_39","text_41","text_43","consequent_26","p_17","p_18","fragment_22","h1_5","text_47","p_19","consequent_16","consequent_28","node_21","root_42","text_50","root_43","text_51","consequent_29","consequent_30","node_22","root_44","img_1","root_45","root_46","consequent_32","alternate_7","root_47","text_52","consequent_33","fragment_23","span_17","span_18","span_19","text_53","consequent_34","div_18","root_49","text_55","div_19","root_50","text_56","div_20","root_51","text_57","consequent_37","span_20","fragment_24","span_21","$1","consequent_38","div_21","root_53","div_22","span_22","text_58","p_20","root_54","span_23","root_56","text_59","consequent_39","consequent_40","video_1","root_57","img_2","root_58","div_23","root_59","consequent_41","consequent_42","consequent_43","alternate_8","div_24","root_60","span_24","text_61","consequent_44","div_25","fragment_26","span_25","span_26","span_27","text_62","consequent_45","div_26","root_62","text_64","div_27","root_63","text_65","div_28","root_64","text_66","consequent_48","span_28","fragment_27","span_29","consequent_49","div_29","VSBadge","node_34","div_30","root_66","text_67","consequent_50","node_36","div_31","root_67","span_30","span_31","button_5","root_68","text_69","consequent_51","span_32","consequent_52","p_21","root_69","p_22","root_70","consequent_54","div_32","fragment_28","button_6","root_72","consequent_55","button_7","node_40","span_33","text_73","text_74","text_75","text_76","consequent_56","consequent_58","alternate_9","div_33","span_34","span_35","button_8","root_77","text_79","span_36","root_78","alternate_10","consequent_59","div_34","root_79","p_23","span_37","text_80","div_35","node_44","node_45","p_24","root_80","consequent_60","consequent_61","consequent_62","aside","p_25","fragment_33","p_26","a_4","text_86","p_27","fragment_34","h2_1","p_28","acceptUpload","div_36","root_83","node_48","p_29","fragment_35","p_30","text_90","text_91","p_31","fragment_36","p_32","consequent_64","alternate_11","div_37","label_1","text_94","node_49","ReusePhoto","p_33","fragment_37","a_5","root_87","text_96","consequent_65","consequent_66","button_9","node_50","text_97","p_34","fragment_38","h2_2","text_99","text_100","consequent_68","alternate_12","p_35","text_101","text_104","consequent_69","consequent_70","consequent_71","alternate_13","div_38","button_10","text_106","div_39","root_95","node_55","consequent_72","a_6","node_54","span_38","span_39","span_40","p_36","div_40","a_7","root_96","span_41","p_37","root_97","consequent_73","consequent_74","p_38","fragment_47","h2_3","text_113","consequent_76","alternate_14","p_39","a_8","root_103","text_116","consequent_77","a_9","node_59","text_117","p_40","fragment_50","h2_4","p_41","a_10","text_121","consequent_67","consequent_75","consequent_79","div_41","h2_5","p_42","$.key","node_60","node_61","div_42","node_62","node_63","node_64","node_65","div_43","root_106","button_11","button_12","div_44","video_2","root_107","img_3","root_108","consequent_80","alternate_15","consequent_81","text_123","alternate_16"],"sources":["../../../../../../src/lib/components/beat/comments/BeatCommentForm.svelte","../../../../../../src/lib/components/beat/comments/BeatCommentRow.svelte","../../../../../../src/lib/components/beat/comments/BeatCommentList.svelte","../../../../../../src/lib/components/beat/BeatBoostControl.svelte","../../../../../../src/lib/components/beat/BeatVoters.svelte","../../../../../../src/lib/components/beat/BeatShare.svelte","../../../../../../src/lib/components/beat/BeatNextNav.svelte","../../../../../../src/lib/components/beat/BeatTeamMatch.svelte","../../../../../../src/routes/b/[code]/+page.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\ttype PostedComment = {\n\t\tid: string;\n\t\tuserId: string | null;\n\t\tnickname: string | null;\n\t\tliveNickname: string | null;\n\t\tavatarPath: string | null;\n\t\tbody: string;\n\t\tcreatedAt: Date | string;\n\t};\n\n\tinterface Props {\n\t\tcode: string;\n\t\tisLoggedIn: boolean;\n\t\tonposted?: (c: PostedComment) => void;\n\t}\n\n\tlet { code, isLoggedIn, onposted }: Props = $props();\n\n\tconst MAX_LENGTH = 500;\n\tlet body = $state('');\n\tlet posting = $state(false);\n\tlet error = $state<string | null>(null);\n\tconst remaining = $derived(MAX_LENGTH - body.length);\n\tconst canPost = $derived(body.trim().length > 0 && remaining >= 0 && !posting);\n\n\tasync function submit(e: SubmitEvent) {\n\t\te.preventDefault();\n\t\tif (!canPost) return;\n\t\tposting = true;\n\t\terror = null;\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${code}/comments`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ body })\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst posted = (await res.json()) as PostedComment;\n\t\t\t\tbody = '';\n\t\t\t\tif (onposted) onposted(posted);\n\t\t\t} else {\n\t\t\t\tconst err = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\t\terror = err.error ?? t('something broke');\n\t\t\t}\n\t\t} catch {\n\t\t\terror = t('network hiccup');\n\t\t} finally {\n\t\t\tposting = false;\n\t\t}\n\t}\n</script>\n\n{#if isLoggedIn}\n\t<form onsubmit={submit} class=\"flex flex-col gap-3\">\n\t\t<textarea\n\t\t\tbind:value={body}\n\t\t\tmaxlength={MAX_LENGTH}\n\t\t\trows=\"3\"\n\t\t\tplaceholder={t('weigh in. be cruel. be funny. be honest.')}\n\t\t\tclass=\"w-full resize-none rounded-xl border border-border bg-surface/50 px-4 py-3 text-[14px] leading-relaxed text-text placeholder:text-muted/40 focus:border-muted/60 focus:outline-none\"\n\t\t></textarea>\n\t\t<div class=\"flex items-center justify-between gap-3\">\n\t\t\t<p class=\"text-[11px] tabular-nums {remaining < 0 ? 'text-coral' : 'text-muted/50'}\">\n\t\t\t\t{t('{n} left', { n: remaining })}\n\t\t\t</p>\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tdisabled={!canPost}\n\t\t\t\tclass=\"rounded-xl bg-yellow px-5 py-2 font-display text-[13px] font-bold tracking-tight text-bg transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40\"\n\t\t\t>\n\t\t\t\t{posting ? t('posting…') : t('post')}\n\t\t\t</button>\n\t\t</div>\n\t\t{#if error}\n\t\t\t<p class=\"text-[12px] text-coral\">{error}</p>\n\t\t{/if}\n\t</form>\n{:else}\n\t<div\n\t\tclass=\"flex items-center justify-between gap-3 rounded-xl border border-border bg-surface/40 px-4 py-3\"\n\t>\n\t\t<p class=\"text-[13px] leading-relaxed text-muted\">\n\t\t\t{t('sign in to throw a comment in.')}\n\t\t</p>\n\t\t<a\n\t\t\thref=\"/auth/sign-in?next=/b/{code}\"\n\t\t\tclass=\"shrink-0 rounded-lg bg-yellow px-3.5 py-1.5 font-display text-[12px] font-bold tracking-tight text-bg no-underline transition-opacity hover:opacity-90\"\n\t\t>\n\t\t\t{t('sign in')}\n\t\t</a>\n\t</div>\n{/if}\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport DuelAvatar from '$lib/components/duel/DuelAvatar.svelte';\n\timport UserBadge from '$lib/components/UserBadge.svelte';\n\timport ReportTrigger from '$lib/components/ReportTrigger.svelte';\n\timport { getAvatarUrl } from '$lib/avatar';\n\n\tinterface Props {\n\t\tid: string;\n\t\tuserId: string | null;\n\t\tisRater?: boolean;\n\t\tisSubscriber?: boolean;\n\t\tisVerified?: boolean;\n\t\t// Snapshot taken at post time; live is the current profile.nickname.\n\t\t// Render prefers live, falls back to snapshot for orphaned posts.\n\t\tnickname: string | null;\n\t\tliveNickname: string | null;\n\t\tavatarPath: string | null;\n\t\tbody: string;\n\t\tcreatedAt: Date | string;\n\t\t// RAT-236: 'hidden' renders as a placeholder. 'pending' and 'ok' render\n\t\t// normally — pending is the brief window between insert and moderation\n\t\t// callback (Option C optimistic-show-everyone pattern).\n\t\tmoderationStatus?: 'pending' | 'ok' | 'hidden';\n\t\tcurrentUserId: string | null;\n\t\tondelete?: (id: string) => void;\n\t}\n\n\tlet {\n\t\tid,\n\t\tuserId,\n\t\tisRater = false,\n\t\tisSubscriber = false,\n\t\tisVerified = false,\n\t\tnickname,\n\t\tliveNickname,\n\t\tavatarPath,\n\t\tbody,\n\t\tcreatedAt,\n\t\tmoderationStatus = 'ok',\n\t\tcurrentUserId,\n\t\tondelete\n\t}: Props = $props();\n\n\tconst isHidden = $derived(moderationStatus === 'hidden');\n\n\tconst displayName = $derived(liveNickname || nickname || null);\n\tconst isOwn = $derived(!!userId && !!currentUserId && userId === currentUserId);\n\t// RAT-222: regular users live on /u/[nickname], not /r/ (which is for raters).\n\t// Link on whichever name we have (live preferred, snapshot fallback) so the\n\t// commenter's profile is reachable even for older rows without a live join.\n\tconst profileHref = $derived(displayName ? `/u/${encodeURIComponent(displayName)}` : '');\n\n\tfunction fmtAge(d: Date | string): string {\n\t\tconst ms = Date.now() - new Date(d).getTime();\n\t\tif (ms < 60_000) return t('just now');\n\t\tconst m = Math.floor(ms / 60_000);\n\t\tif (m < 60) return `${m}m`;\n\t\tconst h = Math.floor(m / 60);\n\t\tif (h < 24) return `${h}h`;\n\t\tconst d2 = Math.floor(h / 24);\n\t\treturn `${d2}d`;\n\t}\n\n\tlet deleting = $state(false);\n\tasync function handleDelete() {\n\t\tif (deleting || !ondelete) return;\n\t\tdeleting = true;\n\t\tondelete(id);\n\t}\n</script>\n\n<article class=\"flex gap-3 py-3\">\n\t<DuelAvatar\n\t\tnickname={displayName}\n\t\tavatarUrl={getAvatarUrl(avatarPath)}\n\t\tsize={32}\n\t\thref={profileHref}\n\t/>\n\t<div class=\"min-w-0 flex-1\">\n\t\t<header class=\"flex items-baseline gap-2\">\n\t\t\t{#if displayName}\n\t\t\t\t<a\n\t\t\t\t\thref={profileHref}\n\t\t\t\t\tclass=\"font-display text-[13px] font-bold tracking-tight text-text no-underline hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{displayName}\n\t\t\t\t</a>\n\t\t\t{:else}\n\t\t\t\t<span class=\"font-display text-[13px] font-bold tracking-tight text-muted\">\n\t\t\t\t\t{t('[deleted]')}\n\t\t\t\t</span>\n\t\t\t{/if}\n\t\t\t<UserBadge rater={isRater} subscriber={isSubscriber} verified={isVerified} size={12} />\n\t\t\t<span class=\"text-[11px] text-muted/60\">{fmtAge(createdAt)}</span>\n\t\t\t{#if isOwn}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonclick={handleDelete}\n\t\t\t\t\tdisabled={deleting}\n\t\t\t\t\tclass=\"ml-auto text-[11px] text-muted/50 transition-colors hover:text-coral disabled:opacity-40\"\n\t\t\t\t\taria-label={t('delete comment')}\n\t\t\t\t>\n\t\t\t\t\t{t('delete')}\n\t\t\t\t</button>\n\t\t\t{:else if !isHidden}\n\t\t\t\t<span class=\"ml-auto\">\n\t\t\t\t\t<ReportTrigger entityType=\"beat_comment\" entityId={id} label={t('report')} />\n\t\t\t\t</span>\n\t\t\t{/if}\n\t\t</header>\n\t\t{#if isHidden}\n\t\t\t<p class=\"mt-0.5 text-[12.5px] italic leading-relaxed text-muted\">\n\t\t\t\t{t('[message removed by moderation]')}\n\t\t\t</p>\n\t\t{:else}\n\t\t\t<p class=\"mt-0.5 text-[13.5px] leading-relaxed text-text/90\" style=\"white-space: pre-wrap;\">\n\t\t\t\t{body}\n\t\t\t</p>\n\t\t{/if}\n\t</div>\n</article>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport BeatCommentRow from './BeatCommentRow.svelte';\n\n\ttype Comment = {\n\t\tid: string;\n\t\tuserId: string | null;\n\t\tisRater?: boolean;\n\t\tisSubscriber?: boolean;\n\t\tisVerified?: boolean;\n\t\tnickname: string | null;\n\t\tliveNickname: string | null;\n\t\tavatarPath: string | null;\n\t\tbody: string;\n\t\tcreatedAt: Date | string;\n\t\tmoderationStatus?: 'pending' | 'ok' | 'hidden';\n\t};\n\n\tinterface Props {\n\t\tcode: string;\n\t\tinitialComments: Comment[];\n\t\tinitialHasMore: boolean;\n\t\tcurrentUserId: string | null;\n\t}\n\n\tlet { code, initialComments, initialHasMore, currentUserId }: Props = $props();\n\n\t// RAT-217: SSR-seeded local state. Same shape as the Live feed (RAT-216) —\n\t// no $effect resync so post / load-more / delete mutations don't get\n\t// clobbered by a re-fired effect after `data` revalidation.\n\tlet comments = $state<Comment[]>(initialComments);\n\tlet hasMore = $state(initialHasMore);\n\tlet loading = $state(false);\n\n\tconst LIST_PAGE = 20;\n\n\tasync function loadMore() {\n\t\tif (loading || !hasMore) return;\n\t\tloading = true;\n\t\ttry {\n\t\t\tconst res = await fetch(\n\t\t\t\t`/api/beat/${code}/comments?offset=${comments.length}&limit=${LIST_PAGE}`\n\t\t\t);\n\t\t\tif (!res.ok) return;\n\t\t\tconst next = (await res.json()) as { items: Comment[]; hasMore: boolean };\n\t\t\tcomments = [...comments, ...next.items];\n\t\t\thasMore = next.hasMore;\n\t\t} finally {\n\t\t\tloading = false;\n\t\t}\n\t}\n\n\texport function prepend(c: Comment) {\n\t\tcomments = [c, ...comments];\n\t}\n\n\tasync function handleDelete(id: string) {\n\t\t// Optimistic remove; rollback on error.\n\t\tconst prev = comments;\n\t\tcomments = comments.filter((c) => c.id !== id);\n\t\tconst res = await fetch(`/api/beat/${code}/comments/${id}`, { method: 'DELETE' });\n\t\tif (!res.ok) comments = prev;\n\t}\n</script>\n\n{#if comments.length === 0}\n\t<p class=\"py-6 text-center text-[13px] text-muted/60\">\n\t\t{t(\"no comments yet. first one's free.\")}\n\t</p>\n{:else}\n\t<ul class=\"flex flex-col divide-y divide-border/60\">\n\t\t{#each comments as c (c.id)}\n\t\t\t<li>\n\t\t\t\t<BeatCommentRow\n\t\t\t\t\tid={c.id}\n\t\t\t\t\tuserId={c.userId}\n\t\t\t\t\tisRater={c.isRater}\n\t\t\t\t\tisSubscriber={c.isSubscriber}\n\t\t\t\t\tisVerified={c.isVerified}\n\t\t\t\t\tnickname={c.nickname}\n\t\t\t\t\tliveNickname={c.liveNickname}\n\t\t\t\t\tavatarPath={c.avatarPath}\n\t\t\t\t\tbody={c.body}\n\t\t\t\t\tcreatedAt={c.createdAt}\n\t\t\t\t\tmoderationStatus={c.moderationStatus}\n\t\t\t\t\t{currentUserId}\n\t\t\t\t\tondelete={handleDelete}\n\t\t\t\t/>\n\t\t\t</li>\n\t\t{/each}\n\t</ul>\n\n\t{#if hasMore}\n\t\t<div class=\"mt-4 flex justify-center\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonclick={loadMore}\n\t\t\t\tdisabled={loading}\n\t\t\t\tclass=\"rounded-full border border-border bg-surface/60 px-4 py-2 font-mono text-[11px] tracking-[0.2em] text-muted uppercase transition-colors hover:border-muted/60 hover:text-text disabled:opacity-50\"\n\t\t\t>\n\t\t\t\t{loading ? t('loading…') : t('show more')}\n\t\t\t</button>\n\t\t</div>\n\t{/if}\n{/if}\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t/**\n\t * Beat me token-boost control (Stage 0). Used in every boostable state on the\n\t * beat page (live + pending) so the mechanic is identical everywhere. The\n\t * booster picks how many tokens to spend; `tokensPerHour` of them buys one\n\t * hour in the /b spotlight, and the chosen hours are shown live. Boost buys\n\t * EXPOSURE only — the vote tally stays earned.\n\t *\n\t * Auth / wallet are page concerns: this emits onNeedLogin / onNeedTokens and\n\t * lets the page own the redirect + buy-tokens modal. On success it calls\n\t * onBoosted so the page can patch its local boost state.\n\t */\n\tinterface Props {\n\t\tcode: string;\n\t\t/** lifetime 🔥 tally on this beat. */\n\t\tboostCount: number;\n\t\t/** current spotlight end (drives the \"Nh left\" readout); null = not boosted. */\n\t\tboostedUntil: string | Date | null;\n\t\tloggedIn: boolean;\n\t\t/** viewer's token balance — gates the buy-tokens prompt. */\n\t\ttokens: number;\n\t\t/** tokens that buy one hour of spotlight. */\n\t\ttokensPerHour: number;\n\t\t/** cap for a single boost (stack more by boosting again). */\n\t\tmaxTokens: number;\n\t\tvariant?: 'live' | 'pending';\n\t\tonBoosted: (r: { boostCount: number; boostedUntil: string; tokensLeft: number }) => void;\n\t\tonNeedTokens: () => void;\n\t\tonNeedLogin: () => void;\n\t}\n\tlet {\n\t\tcode,\n\t\tboostCount,\n\t\tboostedUntil,\n\t\tloggedIn,\n\t\ttokens,\n\t\ttokensPerHour,\n\t\tmaxTokens,\n\t\tvariant = 'live',\n\t\tonBoosted,\n\t\tonNeedTokens,\n\t\tonNeedLogin\n\t}: Props = $props();\n\n\t// tokens the booster will spend; defaults to one hour.\n\tlet amount = $state(tokensPerHour);\n\tconst hours = $derived(amount / tokensPerHour);\n\tlet boosting = $state(false);\n\tlet boostError = $state('');\n\n\t// how many whole hours it's currently spotlighted for (0 when not / expired).\n\tconst spotlightHoursLeft = $derived.by(() => {\n\t\tif (!boostedUntil) return 0;\n\t\tconst ms = new Date(boostedUntil).getTime() - Date.now();\n\t\treturn ms > 0 ? Math.ceil(ms / 3_600_000) : 0;\n\t});\n\n\tfunction dec() {\n\t\tamount = Math.max(tokensPerHour, amount - tokensPerHour);\n\t}\n\tfunction inc() {\n\t\tamount = Math.min(maxTokens, amount + tokensPerHour);\n\t}\n\n\tasync function boost() {\n\t\tif (boosting) return;\n\t\tif (!loggedIn) return onNeedLogin();\n\t\tif (tokens < amount) return onNeedTokens();\n\t\tboosting = true;\n\t\tboostError = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${code}/boost`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ tokens: amount })\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst b = (await res.json()) as {\n\t\t\t\t\tboostCount: number;\n\t\t\t\t\tboostedUntil: string;\n\t\t\t\t\ttokensLeft: number;\n\t\t\t\t};\n\t\t\t\tonBoosted(b);\n\t\t\t} else if (res.status === 402) {\n\t\t\t\tonNeedTokens();\n\t\t\t} else if (res.status === 401) {\n\t\t\t\tonNeedLogin();\n\t\t\t} else {\n\t\t\t\tboostError = t('boost failed — try again');\n\t\t\t}\n\t\t} catch {\n\t\t\tboostError = t('network error');\n\t\t}\n\t\tboosting = false;\n\t}\n</script>\n\n<div class=\"mt-6\">\n\t<div class=\"flex flex-wrap items-center gap-2.5\">\n\t\t<!-- amount stepper: set how many tokens, see the hours it buys -->\n\t\t<div class=\"inline-flex items-center rounded-xl border border-border bg-surface p-1\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonclick={dec}\n\t\t\t\tdisabled={amount <= tokensPerHour}\n\t\t\t\taria-label={t('less time')}\n\t\t\t\tclass=\"ph-no-rageclick flex h-8 w-8 items-center justify-center rounded-lg font-display text-lg leading-none text-text transition-colors hover:bg-bg disabled:opacity-30\"\n\t\t\t\t>−</button\n\t\t\t>\n\t\t\t<span class=\"px-2 text-center text-[13px] font-semibold tabular-nums whitespace-nowrap\">\n\t\t\t\t{amount} <span class=\"font-normal text-muted\">{t('tok · {h}h', { h: hours })}</span>\n\t\t\t</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonclick={inc}\n\t\t\t\tdisabled={amount >= maxTokens}\n\t\t\t\taria-label={t('more time')}\n\t\t\t\tclass=\"ph-no-rageclick flex h-8 w-8 items-center justify-center rounded-lg font-display text-lg leading-none text-text transition-colors hover:bg-bg disabled:opacity-30\"\n\t\t\t\t>+</button\n\t\t\t>\n\t\t</div>\n\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={boost}\n\t\t\tdisabled={boosting}\n\t\t\tclass=\"inline-flex items-center gap-2 rounded-xl bg-yellow px-5 py-2.5 font-display text-[14px] font-bold tracking-tight text-bg transition-transform active:scale-[.98] disabled:opacity-60\"\n\t\t>\n\t\t\t🔥 {boosting ? t('boosting…') : t('boost')}\n\t\t</button>\n\n\t\t{#if boostCount > 0 || spotlightHoursLeft > 0}\n\t\t\t<span\n\t\t\t\tclass=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-surface px-3 py-1.5 text-[12px] font-semibold text-text\"\n\t\t\t>\n\t\t\t\t🔥 {boostCount}\n\t\t\t\t{#if spotlightHoursLeft > 0}\n\t\t\t\t\t<span class=\"font-normal text-muted\">{t('· spotlighted {h}h', { h: spotlightHoursLeft })}</span>\n\t\t\t\t{/if}\n\t\t\t</span>\n\t\t{/if}\n\t</div>\n\n\t<p class=\"mt-2 max-w-md text-[12px] leading-relaxed text-muted\">\n\t\t<strong class=\"font-semibold text-text\">{t('boost = 10× the eyes.')}</strong>\n\t\t{variant === 'pending'\n\t\t\t? t('shoot to the top of beat me so someone accepts faster.')\n\t\t\t: t('shoot to the top of beat me for more votes.')}\n\t\t<span class=\"whitespace-nowrap text-muted/70\">{t('{n} tok = 1h.', { n: tokensPerHour })}</span>\n\t</p>\n\n\t{#if boostError}\n\t\t<p class=\"mt-1 text-[12px] text-coral\">{boostError}</p>\n\t{/if}\n</div>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t// RAT-419: \"who voted\" reveal block, factored out of the 1v1 page so team\n\t// battles get the same paid roster reveal. Each side (a/b) unlocks + charges\n\t// separately. Self-contained: owns the reveal fetch + local unlock state, and\n\t// emits onNeedTokens / onNeedLogin so the page owns the wallet modal + auth.\n\timport { getAvatarUrl } from '$lib/avatar';\n\n\tinterface SideVoters {\n\t\tusers: { nickname: string | null; avatarPath: string | null }[];\n\t\tanonCount: number;\n\t}\n\tinterface Props {\n\t\tcode: string;\n\t\tvotesA: number;\n\t\tvotesB: number;\n\t\tlabelA?: string;\n\t\tlabelB?: string;\n\t\tvoters: { a: SideVoters | null; b: SideVoters | null };\n\t\tunlocked: { a: boolean; b: boolean };\n\t\tcost: number;\n\t\tisLoggedIn: boolean;\n\t\tonNeedTokens: () => void;\n\t\tonNeedLogin: () => void;\n\t}\n\tlet {\n\t\tcode,\n\t\tvotesA,\n\t\tvotesB,\n\t\tlabelA,\n\t\tlabelB,\n\t\tvoters: votersInit,\n\t\tunlocked: unlockedInit,\n\t\tcost,\n\t\tisLoggedIn,\n\t\tonNeedTokens,\n\t\tonNeedLogin\n\t}: Props = $props();\n\n\t// Local copies: seeded from props, mutated on a successful reveal, and\n\t// resynced when the parent reloads (props change → $effect re-runs).\n\tlet voters = $state(votersInit);\n\tlet unlocked = $state(unlockedInit);\n\t$effect(() => {\n\t\tvoters = votersInit;\n\t\tunlocked = unlockedInit;\n\t});\n\n\tlet revealing = $state<'a' | 'b' | null>(null);\n\tlet revealError = $state('');\n\n\tasync function revealVoters(side: 'a' | 'b') {\n\t\tif (revealing || unlocked[side]) return;\n\t\trevealing = side;\n\t\trevealError = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${code}/reveal-voters`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ side })\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst body = (await res.json()) as { voters: SideVoters };\n\t\t\t\tvoters = { ...voters, [side]: body.voters };\n\t\t\t\tunlocked = { ...unlocked, [side]: true };\n\t\t\t} else if (res.status === 402) {\n\t\t\t\tonNeedTokens();\n\t\t\t} else if (res.status === 401) {\n\t\t\t\tonNeedLogin();\n\t\t\t} else {\n\t\t\t\trevealError = t('could not reveal — try again.');\n\t\t\t}\n\t\t} catch {\n\t\t\trevealError = t('network error — try again.');\n\t\t} finally {\n\t\t\trevealing = null;\n\t\t}\n\t}\n</script>\n\n{#if votesA + votesB > 0}\n\t<div class=\"mt-6\">\n\t\t<p class=\"font-display text-[11px] font-bold tracking-[0.2em] text-muted uppercase\">{t('who voted')}</p>\n\t\t<div class=\"mt-2 grid grid-cols-2 gap-2.5\">\n\t\t\t{@render voterBlock('a', labelA ?? t('team A'), votesA, voters.a, unlocked.a)}\n\t\t\t{@render voterBlock('b', labelB ?? t('team B'), votesB, voters.b, unlocked.b)}\n\t\t</div>\n\t\t{#if revealError}\n\t\t\t<p class=\"mt-2 text-[11px] text-coral\">{revealError}</p>\n\t\t{/if}\n\t</div>\n{/if}\n\n{#snippet voterBlock(\n\tside: 'a' | 'b',\n\tlabel: string,\n\tcount: number,\n\tsv: SideVoters | null,\n\tisUnlocked: boolean\n)}\n\t<div class=\"rounded-lg border border-border bg-bg/40 p-3\">\n\t\t<p class=\"font-display text-[10px] font-bold tracking-[0.2em] text-muted uppercase\">\n\t\t\t{label} · {count === 1 ? t('1 vote') : t('{n} votes', { n: count })}\n\t\t</p>\n\t\t{#if isUnlocked && sv}\n\t\t\t{@const CAP = 12}\n\t\t\t{@const namedAll = sv.users.filter((u) => u.nickname)}\n\t\t\t{@const named = namedAll.slice(0, CAP)}\n\t\t\t{@const namedOverflow = namedAll.length - named.length}\n\t\t\t{@const anonTotal = sv.anonCount + (sv.users.length - namedAll.length)}\n\t\t\t{#if count === 0}\n\t\t\t\t<p class=\"mt-2 text-[11px] text-muted/60\">{t('no votes on this side.')}</p>\n\t\t\t{:else}\n\t\t\t\t<ul class=\"mt-2.5 flex flex-col gap-1.5\">\n\t\t\t\t\t{#each named as u, i (i)}\n\t\t\t\t\t\t{@const url = getAvatarUrl(u.avatarPath)}\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"/u/{encodeURIComponent(u.nickname ?? '')}\"\n\t\t\t\t\t\t\t\tclass=\"flex items-center gap-2 no-underline transition-opacity hover:opacity-80\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#if url}\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={url}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tclass=\"h-6 w-6 shrink-0 rounded-full border border-border object-cover\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-surface text-[10px] font-bold text-muted\"\n\t\t\t\t\t\t\t\t\t\t>{u.nickname?.charAt(0).toUpperCase()}</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t<span class=\"truncate text-[12px] font-medium text-text\">@{u.nickname}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t{/each}\n\t\t\t\t\t{#if namedOverflow > 0}\n\t\t\t\t\t\t<li class=\"pl-8 text-[11px] text-muted\">{t('+{n} more named', { n: namedOverflow })}</li>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if anonTotal > 0}\n\t\t\t\t\t\t<li class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-surface text-muted/40\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg class=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t><path\n\t\t\t\t\t\t\t\t\t\td=\"M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10zm0 2c-4.4 0-8 2.2-8 5v1h16v-1c0-2.8-3.6-5-8-5z\"\n\t\t\t\t\t\t\t\t\t/></svg\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"truncate text-[12px] text-muted\">{t('{n} anonymous', { n: anonTotal })}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t{/if}\n\t\t\t\t</ul>\n\t\t\t{/if}\n\t\t{:else}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonclick={() => revealVoters(side)}\n\t\t\t\tdisabled={revealing !== null}\n\t\t\t\tclass=\"mt-2.5 inline-flex items-center gap-1.5 rounded-lg bg-yellow px-3 py-1.5 font-display text-[12px] font-bold tracking-tight text-black transition-colors hover:bg-yellow/85 disabled:opacity-50\"\n\t\t\t>\n\t\t\t\t{#if revealing === side}{t('revealing…')}{:else if isLoggedIn}{t('reveal · {n} tokens', { n: cost })}{:else}{t('sign in to reveal')}{/if}\n\t\t\t</button>\n\t\t{/if}\n\t</div>\n{/snippet}\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t// RAT-419: the beat \"share\" block, factored out of the 1v1 page so team\n\t// battles get the same copy-link + post-to-feed + arena cross-sell + reddit\n\t// rows. Presentational + a copy handler; the parent supplies the (utm-tagged)\n\t// shareUrl, the variant (headline), and the subtitle.\n\timport PostToFeedCta from '$lib/components/post/PostToFeedCta.svelte';\n\timport { trackBeatLinkCopied, trackBeatRedditClick, trackCtaClick } from '$lib/analytics';\n\n\tinterface Props {\n\t\tcode: string;\n\t\tshareUrl: string;\n\t\tvariant: 'pending' | 'live';\n\t\tsubtitle: string;\n\t\t/** post-to-feed only makes sense once the match is live (a pending roster\n\t\t *  has no matchup to render in the feed). */\n\t\tshowPostToFeed?: boolean;\n\t}\n\tlet { code, shareUrl, variant, subtitle, showPostToFeed = false }: Props = $props();\n\n\tlet copied = $state(false);\n\tasync function copyLink() {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(shareUrl);\n\t\t\tcopied = true;\n\t\t\ttrackBeatLinkCopied(code, variant === 'pending' ? 'waiting' : 'live');\n\t\t\tsetTimeout(() => (copied = false), 2500);\n\t\t} catch {\n\t\t\t// clipboard blocked — the URL stays visible for manual copy\n\t\t}\n\t}\n\n\t// Same subs as the duel ShareCommunityModal — overlapping audience.\n\tconst SUBREDDITS = ['cockcompareing', 'AskDickPic', 'DM_DickPicsForOlder', 'DickPicRequestv2'];\n\tfunction redditSubmitUrl(sub: string): string {\n\t\tconst params = new URLSearchParams({ url: shareUrl, title: 'beat me — pick a winner' });\n\t\treturn `https://www.reddit.com/r/${sub}/submit?${params.toString()}`;\n\t}\n</script>\n\n<div>\n\t<p class=\"text-xs font-medium tracking-widest text-yellow uppercase\">{t('share')}</p>\n\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight md:text-3xl\">\n\t\t{variant === 'pending' ? t('spread it.') : t('push it.')}\n\t</h2>\n\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">{subtitle}</p>\n\n\t<!-- Link row: copy the (utm-tagged) share URL -->\n\t<div\n\t\tclass=\"mt-5 flex items-center gap-2 rounded-lg bg-surface px-3 py-2.5 ring-1 ring-border ring-inset\"\n\t>\n\t\t<code class=\"flex-1 truncate font-mono text-[12px] text-text/80\">{shareUrl}</code>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={copyLink}\n\t\t\tclass=\"rounded-md bg-yellow px-3 py-1.5 font-display text-[11px] font-bold tracking-tight text-bg\"\n\t\t>\n\t\t\t{copied ? t('copied') : t('copy')}\n\t\t</button>\n\t</div>\n\n\t{#if showPostToFeed}\n\t\t<div class=\"mt-3\">\n\t\t\t<PostToFeedCta\n\t\t\t\tkind=\"beat_me\"\n\t\t\t\tsourceContentId={code}\n\t\t\t\tvariant=\"block\"\n\t\t\t\tlabel={t('post this beat to your feed')}\n\t\t\t/>\n\t\t</div>\n\t{/if}\n\n\t<!-- Cross-sell into the arena (the swipe→match→chat loop retains beat players). -->\n\t<a\n\t\thref=\"/a/submit\"\n\t\tonclick={() => trackCtaClick('arena', 'beat_result')}\n\t\tclass=\"group mt-3 flex items-center gap-3 rounded-lg bg-bg/40 px-3.5 py-3 no-underline ring-1 ring-border ring-inset transition-all hover:ring-orange/40\"\n\t>\n\t\t<svg class=\"h-5 w-5 shrink-0 text-orange\" fill=\"currentColor\" viewBox=\"0 0 24 24\"\n\t\t\t><path\n\t\t\t\td=\"M12.963 2.286a.75.75 0 0 0-1.071-.136 9.742 9.742 0 0 0-3.539 6.177A7.547 7.547 0 0 1 6.648 6.61a.75.75 0 0 0-1.152.082A9 9 0 1 0 15.68 4.534a7.46 7.46 0 0 1-2.717-2.248ZM15.75 14.25a3.75 3.75 0 1 1-7.313-1.172c.628.465 1.35.81 2.133 1.005a5.99 5.99 0 0 1 1.925-3.547 3.75 3.75 0 0 1 3.255 3.71Z\"\n\t\t\t/></svg\n\t\t>\n\t\t<span class=\"min-w-0 flex-1\">\n\t\t\t<span class=\"block font-display text-sm font-bold text-text\">{t('post this to the arena')}</span>\n\t\t\t<span class=\"mt-0.5 block text-[12px] leading-snug text-muted\"\n\t\t\t\t>{t('public feed · strangers vote · get matched · free')}</span\n\t\t\t>\n\t\t</span>\n\t\t<svg\n\t\t\tclass=\"h-4 w-4 shrink-0 text-muted/50 transition-transform group-hover:translate-x-0.5\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstroke-width=\"2.2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5l7 7-7 7\" /></svg\n\t\t>\n\t</a>\n\n\t<!-- Reddit sub recommendations — each opens reddit's submit form pre-filled. -->\n\t<p class=\"mt-7 text-xs font-medium tracking-widest text-muted uppercase\">{t('post the matchup')}</p>\n\t<div class=\"mt-3 flex flex-col gap-1.5\">\n\t\t{#each SUBREDDITS as sub (sub)}\n\t\t\t<a\n\t\t\t\thref={redditSubmitUrl(sub)}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tonclick={() => trackBeatRedditClick(code, sub, variant === 'pending' ? 'waiting' : 'live')}\n\t\t\t\tclass=\"group flex items-center justify-between rounded-lg bg-bg/40 px-3.5 py-2.5 text-sm font-medium text-text no-underline ring-1 ring-border ring-inset transition-colors hover:ring-muted/50\"\n\t\t\t>\n\t\t\t\t<span>r/{sub}</span>\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"h-3.5 w-3.5 text-muted/60 transition-all group-hover:translate-x-0.5 group-hover:text-blue\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t>\n\t\t\t\t\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14 5l7 7m0 0l-7 7m7-7H3\"></path>\n\t\t\t\t</svg>\n\t\t\t</a>\n\t\t{/each}\n\t</div>\n</div>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t// RAT-419: continuous-vote navigation (RAT-232), factored out of the 1v1 page\n\t// so team battles get the same skip/next/prev + swipe + keyboard flow. Wraps\n\t// the swipeable `stage` (the media) and renders the nav bar below it. Shares\n\t// the 1v1's sessionStorage keys so the queue is continuous across formats.\n\timport { goto, preloadData } from '$app/navigation';\n\timport type { Snippet } from 'svelte';\n\n\tinterface Props {\n\t\tcode: string;\n\t\t/** the viewer has voted — flips the CTA to the yellow \"next beat\". */\n\t\tmyVote?: boolean;\n\t\t/** live shows \"skip · next beat\"; closed shows plain \"next beat\". */\n\t\tisLive?: boolean;\n\t\tstage: Snippet;\n\t}\n\tlet { code, myVote = false, isLive = false, stage }: Props = $props();\n\n\tconst PREV_STACK_KEY = 'beat:prevStack';\n\tconst VISITED_KEY = 'beat:visited';\n\tconst VISITED_MAX = 50;\n\tconst SORT_KEY = 'beat:sort';\n\tconst DEFAULT_SORT = 'closing-soon';\n\t// RAT-419: the format filter the user picked on /b, carried into the queue.\n\tconst FORMAT_KEY = 'beat:format';\n\n\t// undefined = not fetched, null = nothing left, string = next code\n\tlet nextCodePrefetch = $state<string | null | undefined>(undefined);\n\tlet nextNavigating = $state(false);\n\tlet prevAvailable = $state(false);\n\tlet stageEl = $state<HTMLElement | null>(null);\n\tlet pendingScroll = false;\n\tlet prefetchReqId = 0;\n\n\tfunction readPrevStack(): string[] {\n\t\tif (typeof window === 'undefined') return [];\n\t\ttry {\n\t\t\tconst raw = sessionStorage.getItem(PREV_STACK_KEY);\n\t\t\treturn raw ? (JSON.parse(raw) as string[]) : [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\tfunction writePrevStack(stack: string[]) {\n\t\ttry {\n\t\t\tsessionStorage.setItem(PREV_STACK_KEY, JSON.stringify(stack.slice(-20)));\n\t\t} catch {\n\t\t\t// quota / privacy mode — prev just won't work\n\t\t}\n\t}\n\tfunction readVisited(): string[] {\n\t\tif (typeof window === 'undefined') return [];\n\t\ttry {\n\t\t\tconst raw = sessionStorage.getItem(VISITED_KEY);\n\t\t\treturn raw ? (JSON.parse(raw) as string[]) : [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\tfunction addVisited(c: string) {\n\t\tif (typeof window === 'undefined') return;\n\t\ttry {\n\t\t\tconst list = readVisited().filter((x) => x !== c);\n\t\t\tlist.push(c);\n\t\t\tsessionStorage.setItem(VISITED_KEY, JSON.stringify(list.slice(-VISITED_MAX)));\n\t\t} catch {\n\t\t\t// server-side after= exclusion still covers the current code\n\t\t}\n\t}\n\tfunction readSort(): string | null {\n\t\tif (typeof window === 'undefined') return null;\n\t\ttry {\n\t\t\treturn sessionStorage.getItem(SORT_KEY);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\tfunction readFormat(): string | null {\n\t\tif (typeof window === 'undefined') return null;\n\t\ttry {\n\t\t\treturn sessionStorage.getItem(FORMAT_KEY);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction buildNextUrl(c: string): string {\n\t\tconst params = new URLSearchParams({ after: c });\n\t\tconst visited = readVisited().filter((x) => x !== c);\n\t\tif (visited.length > 0) params.set('seen', visited.join(','));\n\t\tconst sort = readSort();\n\t\tif (sort && sort !== DEFAULT_SORT) params.set('sort', sort);\n\t\t// RAT-419: keep the format filter (1v1 / 2v2 / 4v4) across the queue.\n\t\tconst format = readFormat();\n\t\tif (format && format !== 'all') params.set('format', format);\n\t\treturn `/api/beat/next?${params.toString()}`;\n\t}\n\n\tasync function prefetchNext(c: string) {\n\t\tconst myReq = ++prefetchReqId;\n\t\ttry {\n\t\t\tconst res = await fetch(buildNextUrl(c));\n\t\t\tif (myReq !== prefetchReqId) return;\n\t\t\tif (!res.ok) {\n\t\t\t\tnextCodePrefetch = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst body = (await res.json()) as { code: string | null };\n\t\t\tnextCodePrefetch = body.code;\n\t\t\t// warm the SvelteKit data cache so goToNext renders instantly\n\t\t\tif (body.code) void preloadData(`/b/${body.code}`);\n\t\t} catch {\n\t\t\tif (myReq === prefetchReqId) nextCodePrefetch = null;\n\t\t}\n\t}\n\n\tasync function goToNext() {\n\t\tif (nextNavigating) return;\n\t\tnextNavigating = true;\n\t\tconst stack = readPrevStack();\n\t\tstack.push(code);\n\t\twritePrevStack(stack);\n\t\ttry {\n\t\t\tlet target = nextCodePrefetch;\n\t\t\tif (target === undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetch(buildNextUrl(code));\n\t\t\t\t\tif (res.ok) {\n\t\t\t\t\t\tconst body = (await res.json()) as { code: string | null };\n\t\t\t\t\t\ttarget = body.code;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\ttarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (target) {\n\t\t\t\tpendingScroll = true;\n\t\t\t\tawait goto(`/b/${target}`, { noScroll: true });\n\t\t\t} else {\n\t\t\t\tawait goto('/b');\n\t\t\t}\n\t\t} finally {\n\t\t\tnextNavigating = false;\n\t\t}\n\t}\n\n\tasync function goToPrev() {\n\t\tif (nextNavigating) return;\n\t\tconst stack = readPrevStack();\n\t\tconst prev = stack.pop();\n\t\tif (!prev) return;\n\t\twritePrevStack(stack);\n\t\tpendingScroll = true;\n\t\tawait goto(`/b/${prev}`, { noScroll: true });\n\t}\n\n\t// warm prefetch + recompute prev on every in-place beat change\n\t$effect(() => {\n\t\tconst c = code;\n\t\taddVisited(c);\n\t\tprevAvailable = readPrevStack().length > 0;\n\t\tnextCodePrefetch = undefined;\n\t\tvoid prefetchNext(c);\n\t});\n\n\t// snap the stage back into view after a flow navigation (component reused)\n\t$effect(() => {\n\t\tif (code && pendingScroll) {\n\t\t\tpendingScroll = false;\n\t\t\trequestAnimationFrame(() =>\n\t\t\t\tstageEl?.scrollIntoView({ block: 'start', behavior: 'instant' })\n\t\t\t);\n\t\t}\n\t});\n\n\t// keyboard: ← / → (skip inputs)\n\t$effect(() => {\n\t\tfunction onKey(e: KeyboardEvent) {\n\t\t\tconst t = e.target as HTMLElement | null;\n\t\t\tif (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return;\n\t\t\tif (e.metaKey || e.ctrlKey || e.altKey) return;\n\t\t\tif (e.key === 'ArrowRight') {\n\t\t\t\te.preventDefault();\n\t\t\t\tvoid goToNext();\n\t\t\t} else if (e.key === 'ArrowLeft' && prevAvailable) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvoid goToPrev();\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('keydown', onKey);\n\t\treturn () => window.removeEventListener('keydown', onKey);\n\t});\n\n\t// touch swipe on the stage\n\tlet touchStartX = 0;\n\tlet touchStartY = 0;\n\tlet touchActive = false;\n\tlet swipeDx = $state(0);\n\tconst SWIPE_COMMIT_PX = 80;\n\tfunction onTouchStart(e: TouchEvent) {\n\t\tif (e.touches.length !== 1) return;\n\t\ttouchStartX = e.touches[0].clientX;\n\t\ttouchStartY = e.touches[0].clientY;\n\t\ttouchActive = true;\n\t}\n\tfunction onTouchMove(e: TouchEvent) {\n\t\tif (!touchActive || e.touches.length !== 1) return;\n\t\tconst dx = e.touches[0].clientX - touchStartX;\n\t\tconst dy = e.touches[0].clientY - touchStartY;\n\t\tif (Math.abs(dy) > Math.abs(dx)) {\n\t\t\tswipeDx = 0;\n\t\t\treturn;\n\t\t}\n\t\tconst allowed = dx < 0 || prevAvailable;\n\t\tswipeDx = allowed ? dx * 0.45 : 0;\n\t}\n\tfunction onTouchEnd(e: TouchEvent) {\n\t\tif (!touchActive) return;\n\t\ttouchActive = false;\n\t\tswipeDx = 0;\n\t\tconst t = e.changedTouches[0];\n\t\tconst dx = t.clientX - touchStartX;\n\t\tconst dy = t.clientY - touchStartY;\n\t\tif (Math.abs(dy) > 60) return;\n\t\tif (Math.abs(dx) < SWIPE_COMMIT_PX) return;\n\t\tif (dx < 0) void goToNext();\n\t\telse if (prevAvailable) void goToPrev();\n\t}\n</script>\n\n<!-- svelte-ignore a11y_no_static_element_interactions -->\n<div\n\tbind:this={stageEl}\n\tontouchstart={onTouchStart}\n\tontouchmove={onTouchMove}\n\tontouchend={onTouchEnd}\n\tstyle=\"transform: translate3d({swipeDx}px, 0, 0); transition: {touchActive\n\t\t? 'none'\n\t\t: 'transform 0.25s cubic-bezier(0.18, 0.89, 0.32, 1.28)'};\"\n>\n\t{@render stage()}\n</div>\n\n<div class=\"mt-5 flex items-center gap-2.5\">\n\t{#if prevAvailable}\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={goToPrev}\n\t\t\tdisabled={nextNavigating}\n\t\t\taria-label={t('previous beat')}\n\t\t\tclass=\"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border bg-surface text-muted transition-colors hover:border-muted/80 hover:text-text disabled:opacity-50\"\n\t\t>\n\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<path d=\"M19 12H5\"></path>\n\t\t\t\t<polyline points=\"11 18 5 12 11 6\"></polyline>\n\t\t\t</svg>\n\t\t</button>\n\t{/if}\n\t<button\n\t\ttype=\"button\"\n\t\tonclick={goToNext}\n\t\tdisabled={nextNavigating}\n\t\tclass=\"group/next inline-flex h-11 flex-1 items-center justify-between gap-3 rounded-xl px-5 font-display text-[14px] font-bold tracking-tight transition-all disabled:opacity-60 disabled:hover:translate-y-0\n\t\t\t{myVote && nextCodePrefetch !== null\n\t\t\t? 'bg-yellow text-bg shadow-[0_8px_24px_-8px_rgba(255,229,0,0.5)] hover:-translate-y-0.5'\n\t\t\t: 'border border-border bg-surface text-text/85 hover:border-muted/80 hover:text-text'}\"\n\t>\n\t\t<span>\n\t\t\t{#if nextCodePrefetch === null}\n\t\t\t\t{t('back to hub')}\n\t\t\t{:else if myVote}\n\t\t\t\t{t('next beat')}\n\t\t\t{:else if isLive}\n\t\t\t\t{t('skip · next beat')}\n\t\t\t{:else}\n\t\t\t\t{t('next beat')}\n\t\t\t{/if}\n\t\t</span>\n\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"transition-transform group-hover/next:translate-x-0.5\">\n\t\t\t<path d=\"M5 12h14\"></path>\n\t\t\t<polyline points=\"13 6 19 12 13 18\"></polyline>\n\t\t</svg>\n\t</button>\n</div>\n\n<div class=\"mt-3 flex items-center justify-between text-[10.5px] tracking-[0.18em] text-muted/55 uppercase\">\n\t<span class=\"inline-flex items-center gap-1.5 md:hidden\" aria-hidden=\"true\">\n\t\t<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t<polyline points=\"15 18 9 12 15 6\"></polyline>\n\t\t</svg>\n\t\t{t('swipe')}\n\t\t<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t<polyline points=\"9 18 15 12 9 6\"></polyline>\n\t\t</svg>\n\t</span>\n\t<span class=\"hidden font-mono md:inline\">{prevAvailable ? t('← / → keys') : t('→ key')}</span>\n</div>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t// RAT-419: the 2v2 / 4v4 team-battle experience. Rendered by /b/[code] in\n\t// place of the 1v1 VS block when challenge.format is a team format. The\n\t// crowd votes for a TEAM (votes_a / votes_b), and the team with more votes\n\t// wins — same vote + winner path as 1v1, just presented as two rosters.\n\timport { invalidateAll } from '$app/navigation';\n\timport { onMount } from 'svelte';\n\timport { countBeatVote } from '$lib/beat-voter-next';\n\timport CountdownTimer from '$lib/components/duel/CountdownTimer.svelte';\n\timport BeatCommentForm from '$lib/components/beat/comments/BeatCommentForm.svelte';\n\timport BeatCommentList from '$lib/components/beat/comments/BeatCommentList.svelte';\n\timport ReportContentModal from '$lib/components/ReportContentModal.svelte';\n\timport ReportTrigger from '$lib/components/ReportTrigger.svelte';\n\timport AuthSheet from '$lib/components/AuthSheet.svelte';\n\timport BeatBoostControl from '$lib/components/beat/BeatBoostControl.svelte';\n\timport BeatVoters from '$lib/components/beat/BeatVoters.svelte';\n\timport BeatShare from '$lib/components/beat/BeatShare.svelte';\n\timport BeatNextNav from '$lib/components/beat/BeatNextNav.svelte';\n\timport BuyTokensModal from '$lib/components/BuyTokensModal.svelte';\n\timport { stripExifClient } from '$lib/utils/strip-exif-client';\n\timport { startAsLabel, wrongCategoryOf } from '$lib/components/beat/wrong-category';\n\timport type { BeatKind } from '$lib/types/beat';\n\timport { heicToJpeg, isHeic } from '$lib/utils/heic-to-jpeg';\n\n\ttype TeamSlot =\n\t\t| {\n\t\t\t\tfilled: true;\n\t\t\t\tslot: number;\n\t\t\t\tisCreator: boolean;\n\t\t\t\tisYou: boolean;\n\t\t\t\tmediaType: 'image' | 'video';\n\t\t\t\turl: string | null;\n\t\t\t\tnickname: string | null;\n\t\t\t\tparticipantId: string | null;\n\t\t  }\n\t\t| { filled: false; slot: number };\n\n\tinterface Roster {\n\t\tformat: string;\n\t\tcap: number;\n\t\tteamA: TeamSlot[];\n\t\tteamB: TeamSlot[];\n\t\tfilledA: number;\n\t\tfilledB: number;\n\t\tviewerInRoster: boolean;\n\t\tviewerTeam: 'a' | 'b' | null;\n\t}\n\n\tinterface VoterRoster {\n\t\tusers: { nickname: string | null; avatarPath: string | null }[];\n\t\tanonCount: number;\n\t}\n\n\tinterface Props {\n\t\tdata: {\n\t\t\tchallenge: {\n\t\t\t\tid: string;\n\t\t\t\tcode: string;\n\t\t\t\tstatus: string;\n\t\t\t\tformat: string;\n\t\t\t\tvotesA: number;\n\t\t\t\tvotesB: number;\n\t\t\t\twinnerSide: string | null;\n\t\t\t\tclosesAt: string | Date | null;\n\t\t\t\tcreatedAt: string | Date;\n\t\t\t\tallowAnonVotes: boolean;\n\t\t\t\tboostCount: number;\n\t\t\t\tboostedUntil: string | Date | null;\n\t\t\t};\n\t\t\troster: Roster | null;\n\t\t\tmyVote: { side: 'a' | 'b' } | null;\n\t\t\tsession: unknown;\n\t\t\tuser: { id: string } | null;\n\t\t\tviewerLoggedIn: boolean;\n\t\t\tviewerTokens: number;\n\t\t\tboostTokensPerHour: number;\n\t\t\tboostMaxTokens: number;\n\t\t\tisLoggedIn: boolean;\n\t\t\trevealVotersCost: number;\n\t\t\tvotersUnlocked: { a: boolean; b: boolean };\n\t\t\tvoters: {\n\t\t\t\ta: VoterRoster | null;\n\t\t\t\tb: VoterRoster | null;\n\t\t\t};\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tcomments: any[];\n\t\t\tcommentsHasMore: boolean;\n\t\t};\n\t}\n\n\tlet { data }: Props = $props();\n\n\t// Mirror the server media caps ($lib/server/beat.ts) for a fast client bounce.\n\tconst IMAGE_MIME = ['image/jpeg', 'image/png', 'image/webp'];\n\tconst VIDEO_MIME = ['video/mp4', 'video/webm', 'video/quicktime'];\n\tconst IMAGE_MAX = 5 * 1024 * 1024;\n\tconst VIDEO_MAX = 30 * 1024 * 1024;\n\tconst UPLOAD_TIMEOUT_MS = 60_000;\n\n\t// ── Reactive state (RAT-117: seed from data, resync on real server reloads) ──\n\tlet votesA = $state(data.challenge.votesA);\n\tlet votesB = $state(data.challenge.votesB);\n\tlet status = $state(data.challenge.status);\n\tlet winnerSide = $state<string | null>(data.challenge.winnerSide);\n\tlet myPick = $state<'a' | 'b' | null>(data.myVote?.side ?? null);\n\t// boost state (patched locally on a successful boost, resynced on reload)\n\tlet boostCount = $state(data.challenge.boostCount);\n\tlet boostedUntil = $state<string | Date | null>(data.challenge.boostedUntil);\n\tlet viewerTokens = $state(data.viewerTokens);\n\tlet showBuyTokens = $state(false);\n\t// shared buy-tokens modal reason — set per trigger (boost vs reveal)\n\tlet buyTokensReason = $state(t('get 10× more eyes on your beat'));\n\n\t$effect(() => {\n\t\tconst c = data.challenge;\n\t\tvotesA = c.votesA;\n\t\tvotesB = c.votesB;\n\t\tstatus = c.status;\n\t\twinnerSide = c.winnerSide;\n\t\tboostCount = c.boostCount;\n\t\tboostedUntil = c.boostedUntil;\n\t\tviewerTokens = data.viewerTokens;\n\t\t// Never clobber an optimistic pick with a null read-replica lag.\n\t\tconst dv = data.myVote?.side ?? null;\n\t\tif (dv) myPick = dv;\n\t});\n\n\tfunction handleBoosted(r: { boostCount: number; boostedUntil: string; tokensLeft: number }) {\n\t\tboostCount = r.boostCount;\n\t\tboostedUntil = r.boostedUntil;\n\t\tviewerTokens = r.tokensLeft;\n\t}\n\n\tconst roster = $derived<Roster | null>(data.roster);\n\tconst cap = $derived(roster?.cap ?? 0);\n\tconst teamLabel = $derived(data.challenge.format.toUpperCase()); // 2V2 / 4V4\n\n\tconst isPending = $derived(status === 'pending');\n\tconst isLive = $derived(status === 'live');\n\tconst isClosed = $derived(status === 'closed');\n\tconst isExpired = $derived(status === 'expired');\n\n\tconst inRoster = $derived(roster?.viewerInRoster ?? false);\n\tconst membersOnlyBlocked = $derived(\n\t\tisLive && !data.viewerLoggedIn && !data.challenge.allowAnonVotes\n\t);\n\tconst canVote = $derived(isLive && !inRoster && !myPick && !membersOnlyBlocked);\n\n\t// subtitle for the share block — mirrors the 1v1 page's voice per viewer state\n\tconst shareSubtitle = $derived(\n\t\tisPending\n\t\t\t? t('more eyes = more fighters. fill both teams to start.')\n\t\t\t: inRoster\n\t\t\t\t? t('more eyes = more votes for your team.')\n\t\t\t\t: myPick\n\t\t\t\t\t? t('you backed team {team}. now do the work.', { team: myPick.toUpperCase() })\n\t\t\t\t\t: t(\"every share is a vote you didn't have to ask for.\")\n\t);\n\n\tconst total = $derived(votesA + votesB);\n\tconst pctA = $derived(total > 0 ? Math.round((votesA / total) * 100) : 50);\n\tconst pctB = $derived(100 - pctA);\n\n\t// RAT-419: `data.challenge` can be briefly undefined on a navigation/teardown\n\t// tick (in-page next-nav + invalidateAll on /b/[code]). CountdownTimer's\n\t// setInterval keeps a live reactive read of this derived (via `expiresAt`),\n\t// so an unguarded `data.challenge.closesAt` threw a TypeError on that tick.\n\t// Guard the whole `data.challenge` access, not just `.closesAt`.\n\tconst closesIso = $derived(\n\t\tdata.challenge?.closesAt\n\t\t\t? data.challenge.closesAt instanceof Date\n\t\t\t\t? data.challenge.closesAt.toISOString()\n\t\t\t\t: String(data.challenge.closesAt)\n\t\t\t: null\n\t);\n\n\t// ── Share ────────────────────────────────────────────────────────────────\n\t// utm_source=beat_share keeps parity with the 1v1 beat + duel/contest shares\n\t// (inbound signups still attribute to beat sharing); utm_content=<format>\n\t// (2v2 / 4v4) distinguishes team-battle shares so their virality can be\n\t// segmented out. The /beat → /b 308 in hooks.server.ts preserves the query.\n\t// The copy + reddit + post-to-feed UI lives in <BeatShare>.\n\tconst shareUrl = $derived(\n\t\ttypeof window !== 'undefined'\n\t\t\t? `${window.location.origin}/beat/${data.challenge.code}?utm_source=beat_share&utm_content=${data.challenge.format}`\n\t\t\t: `/beat/${data.challenge.code}?utm_source=beat_share&utm_content=${data.challenge.format}`\n\t);\n\n\t// ── Sign-in sheet (members-only gate) ──────────────────────────────────────\n\tlet showAuth = $state(false);\n\tlet reportOpen = $state(false);\n\n\t// comment list ref so the form can prepend a posted comment without a reload\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tlet commentListRef = $state<{ prepend: (c: any) => void } | null>(null);\n\n\t// ── Join a team ────────────────────────────────────────────────────────────\n\tlet joinTeam = $state<'a' | 'b' | null>(null);\n\t// Slot the viewer tapped — drives the per-slot upload loader so the tile they\n\t// picked shows a spinner while the upload + moderation runs (otherwise the\n\t// picker closes and nothing visibly happens → feels broken).\n\tlet joinSlot = $state<number | null>(null);\n\tlet joinInput = $state<HTMLInputElement | null>(null);\n\tlet joining = $state(false);\n\tlet joinError = $state('');\n\t// Epic R: the category a picture refused by this boob or ass battle fits.\n\tlet joinStartAs = $state<BeatKind | null>(null);\n\n\tfunction validateFile(f: File): string | null {\n\t\tconst isImage = IMAGE_MIME.includes(f.type);\n\t\tconst isVideo = VIDEO_MIME.includes(f.type);\n\t\tif (!isImage && !isVideo) return t('unsupported file — use jpg/png/webp or mp4/webm/mov');\n\t\tif (f.size > (isVideo ? VIDEO_MAX : IMAGE_MAX)) {\n\t\t\treturn t('file too large (max {size})', { size: isVideo ? '30MB' : '5MB' });\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction startJoin(team: 'a' | 'b', slot: number) {\n\t\tif (joining) return;\n\t\tjoinTeam = team;\n\t\tjoinSlot = slot;\n\t\tjoinError = '';\n\t\tjoinInput?.click();\n\t}\n\n\tfunction resetJoin() {\n\t\tjoining = false;\n\t\tjoinTeam = null;\n\t\tjoinSlot = null;\n\t}\n\n\tasync function onJoinFile(e: Event) {\n\t\tconst input = e.currentTarget as HTMLInputElement;\n\t\tconst raw = input.files?.[0] ?? null;\n\t\tinput.value = ''; // allow re-picking the same file\n\t\tif (!raw || !joinTeam) return;\n\t\t// Flip the loader on the instant a file is chosen — HEIC conversion + strip\n\t\t// + upload + moderation can take a few seconds and the user needs to see\n\t\t// their slot is working, not sit on a dead-looking tile.\n\t\tjoining = true;\n\t\tjoinError = '';\n\t\tlet f = raw;\n\t\ttry {\n\t\t\tif (await isHeic(f)) {\n\t\t\t\tjoinError = t('converting heic photo…');\n\t\t\t\tf = await heicToJpeg(f);\n\t\t\t}\n\t\t} catch {\n\t\t\tjoinError = t('could not read that photo — try another.');\n\t\t\tresetJoin();\n\t\t\treturn;\n\t\t}\n\t\tconst v = validateFile(f);\n\t\tif (v) {\n\t\t\tjoinError = v;\n\t\t\tresetJoin();\n\t\t\treturn;\n\t\t}\n\t\tawait submitJoin(f, joinTeam);\n\t}\n\n\tasync function submitJoin(file: File, team: 'a' | 'b') {\n\t\t// `joining` is already set by onJoinFile (the loader is live by now).\n\t\tjoinError = '';\n\t\tjoinStartAs = null;\n\t\tconst clean = await stripExifClient(file);\n\t\tconst fd = new FormData();\n\t\tfd.append('file', clean);\n\t\tfd.append('team', team);\n\t\tfd.append('savePhoto', 'true');\n\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), UPLOAD_TIMEOUT_MS);\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${data.challenge.code}/join`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: fd,\n\t\t\t\tsignal: controller.signal\n\t\t\t});\n\t\t\tconst ct = res.headers.get('content-type') ?? '';\n\t\t\tconst body = ct.includes('application/json') ? await res.json().catch(() => ({})) : {};\n\t\t\tif (!res.ok) {\n\t\t\t\tconst wrong = wrongCategoryOf(body);\n\t\t\t\tif (wrong) {\n\t\t\t\t\tjoinError = wrong.text;\n\t\t\t\t\tjoinStartAs = wrong.suggest;\n\t\t\t\t} else if (body.error === 'team_full') {\n\t\t\t\t\tjoinError = t('that side just filled up — pick the other team.');\n\t\t\t\t} else if (body.error === 'already_joined') {\n\t\t\t\t\tjoinError = t(\"you're already in this fight.\");\n\t\t\t\t} else if (body.error === 'is_creator') {\n\t\t\t\t\tjoinError = t(\"you started this one — you're already team A.\");\n\t\t\t\t} else if (res.status === 413) {\n\t\t\t\t\tjoinError = t('file too large for upload');\n\t\t\t\t} else {\n\t\t\t\t\tjoinError = body.error || t('join failed ({status})', { status: res.status });\n\t\t\t\t}\n\t\t\t\t// Refresh the roster either way so a full/taken side re-renders.\n\t\t\t\tawait invalidateAll();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Seated (and maybe the roster just went live) — reload to reflect it.\n\t\t\tawait invalidateAll();\n\t\t} catch (e) {\n\t\t\tjoinError =\n\t\t\t\te instanceof DOMException && e.name === 'AbortError'\n\t\t\t\t\t? t('upload timed out — try a smaller file or stronger network')\n\t\t\t\t\t: t('network error');\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t\tresetJoin();\n\t\t}\n\t}\n\n\t// ── Vote for a team ──────────────────────────────────────────────────────────\n\tlet voteSubmitting = $state(false);\n\tasync function vote(team: 'a' | 'b') {\n\t\tif (voteSubmitting) return;\n\t\tif (membersOnlyBlocked) {\n\t\t\tshowAuth = true;\n\t\t\treturn;\n\t\t}\n\t\tif (!canVote) return;\n\t\tvoteSubmitting = true;\n\t\t// optimistic\n\t\tmyPick = team;\n\t\tif (team === 'a') votesA += 1;\n\t\telse votesB += 1;\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${data.challenge.code}/vote`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ side: team, source: 'beat_page' })\n\t\t\t});\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (!res.ok) {\n\t\t\t\t// revert optimistic\n\t\t\t\tmyPick = null;\n\t\t\t\tif (team === 'a') votesA -= 1;\n\t\t\t\telse votesB -= 1;\n\t\t\t\tif (body.error === 'members_only') {\n\t\t\t\t\tshowAuth = true;\n\t\t\t\t} else if (body.error === 'not_live') {\n\t\t\t\t\tawait invalidateAll();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// reconcile with authoritative counts\n\t\t\tif (typeof body.votesA === 'number') votesA = body.votesA;\n\t\t\tif (typeof body.votesB === 'number') votesB = body.votesB;\n\t\t\tif (body.alreadyVoted && body.mySide) myPick = body.mySide;\n\t\t\t// RAT-528: one more vote from this device.\n\t\t\tif (!body.alreadyVoted) countBeatVote();\n\t\t\tif (body.status && body.status !== status) await invalidateAll();\n\t\t} catch {\n\t\t\t// leave the optimistic state; a poll / reload will reconcile\n\t\t} finally {\n\t\t\tvoteSubmitting = false;\n\t\t}\n\t}\n\n\t// ── Polling ──────────────────────────────────────────────────────────────────\n\t// Pending: watch for the roster filling / going live (refresh tiles + state).\n\t// Live: refresh vote counts; reload on the close transition.\n\tonMount(() => {\n\t\tlet prevFilled = (roster?.filledA ?? 0) + (roster?.filledB ?? 0);\n\t\tconst tick = async () => {\n\t\t\tif (!(isPending || isLive)) return;\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`/api/beat/${data.challenge.code}/state`);\n\t\t\t\tif (!res.ok) return;\n\t\t\t\tconst s = await res.json();\n\t\t\t\tif (s.status && s.status !== status) {\n\t\t\t\t\tawait invalidateAll();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isPending && typeof s.filledA === 'number') {\n\t\t\t\t\tconst filled = s.filledA + s.filledB;\n\t\t\t\t\tif (filled !== prevFilled) {\n\t\t\t\t\t\tprevFilled = filled;\n\t\t\t\t\t\tawait invalidateAll(); // new tile(s) landed — pull their media\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isLive) {\n\t\t\t\t\tif (typeof s.votesA === 'number') votesA = s.votesA;\n\t\t\t\t\tif (typeof s.votesB === 'number') votesB = s.votesB;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// transient — next tick retries\n\t\t\t}\n\t\t};\n\t\tconst id = setInterval(tick, isPending ? 8000 : 30000);\n\t\treturn () => clearInterval(id);\n\t});\n</script>\n\n<!-- hidden file input shared by both teams' join buttons -->\n<input\n\ttype=\"file\"\n\taccept=\"image/*,video/*\"\n\tclass=\"hidden\"\n\tbind:this={joinInput}\n\tonchange={onJoinFile}\n/>\n\n<section class=\"mx-auto w-full max-w-5xl px-4 pt-20 md:px-0 md:pt-24\">\n\t<!-- header -->\n\t<div class=\"mb-5 flex flex-wrap items-center gap-x-3 gap-y-1\">\n\t\t<span\n\t\t\tclass=\"rounded-md bg-yellow px-2 py-1 font-display text-xs font-bold tracking-tight text-bg\"\n\t\t\t>{teamLabel}</span\n\t\t>\n\t\t{#if isPending}\n\t\t\t<span class=\"font-display text-sm font-bold text-text\">{t('roster filling')}</span>\n\t\t\t<span class=\"text-sm text-muted\"\n\t\t\t\t>team A {roster?.filledA ?? 0}/{cap} · team B {roster?.filledB ?? 0}/{cap}</span\n\t\t\t>\n\t\t{:else if isLive}\n\t\t\t<span class=\"font-display text-sm font-bold text-text\">{t('live · pick a team')}</span>\n\t\t\t{#if closesIso}\n\t\t\t\t<span class=\"text-sm text-muted\">{#each t('{timer} left').split('{timer}') as part, i (i)}{#if i}<CountdownTimer expiresAt={closesIso} />{/if}{part}{/each}</span>\n\t\t\t{/if}\n\t\t{:else if isClosed}\n\t\t\t<span class=\"font-display text-sm font-bold text-text\">\n\t\t\t\t{winnerSide === 'tie' ? t(\"it's a tie\") : winnerSide === 'a' ? t('team A wins') : t('team B wins')}\n\t\t\t</span>\n\t\t{:else if isExpired}\n\t\t\t<span class=\"font-display text-sm font-bold text-muted\">{t('expired — the roster never filled')}</span\n\t\t\t>\n\t\t{/if}\n\t</div>\n\n\t<!-- boost: sits at the top (parity with 1v1) — any fighter can spotlight the\n\t     match. pending (fill the roster faster) or live (more votes). -->\n\t{#if inRoster && (isPending || isLive)}\n\t\t<BeatBoostControl\n\t\t\tcode={data.challenge.code}\n\t\t\t{boostCount}\n\t\t\t{boostedUntil}\n\t\t\tloggedIn={data.viewerLoggedIn}\n\t\t\ttokens={viewerTokens}\n\t\t\ttokensPerHour={data.boostTokensPerHour}\n\t\t\tmaxTokens={data.boostMaxTokens}\n\t\t\tvariant={isPending ? 'pending' : 'live'}\n\t\t\tonBoosted={handleBoosted}\n\t\t\tonNeedTokens={() => {\n\t\t\t\tbuyTokensReason = t('get 10× more eyes on your beat');\n\t\t\t\tshowBuyTokens = true;\n\t\t\t}}\n\t\t\tonNeedLogin={() => (showAuth = true)}\n\t\t/>\n\t{/if}\n\n\t{#if isLive || isClosed}\n\t\t<!-- live/closed: meter + rosters + vote CTA form the swipeable stage; the\n\t\t     skip/next/prev nav + swipe + keyboard live in <BeatNextNav>. -->\n\t\t<BeatNextNav code={data.challenge.code} myVote={!!myPick} {isLive}>\n\t\t\t{#snippet stage()}\n\t\t\t\t{@render rostersGrid()}\n\n\t\t\t\t<!-- vote CTA — participants can't vote on their own fight, so no CTA -->\n\t\t\t\t{#if isLive && !inRoster}\n\t\t\t\t\t<div class=\"mt-6\">\n\t\t\t\t\t\t{#if myPick}\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclass=\"rounded-xl border border-border bg-surface px-4 py-3 text-center text-sm text-text\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#each t('you backed {team}.').split('{team}') as part, i (i)}{#if i}<span class=\"font-bold {myPick === 'a' ? 'text-blue' : 'text-coral'}\"\n\t\t\t\t\t\t\t\t\t>{t('team {team}', { team: myPick.toUpperCase() })}</span\n\t\t\t\t\t\t\t\t>{/if}{part}{/each}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{:else if membersOnlyBlocked}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonclick={() => (showAuth = true)}\n\t\t\t\t\t\t\t\tclass=\"w-full rounded-xl bg-yellow px-4 py-3.5 text-center font-display text-sm font-bold text-bg\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t('sign in to vote — members-only fight')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"grid grid-cols-2 gap-3\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={voteSubmitting}\n\t\t\t\t\t\t\t\t\tonclick={() => vote('a')}\n\t\t\t\t\t\t\t\t\tclass=\"rounded-xl bg-blue px-4 py-3.5 font-display text-sm font-bold text-white transition-transform hover:-translate-y-0.5 disabled:opacity-50\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('vote team A')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={voteSubmitting}\n\t\t\t\t\t\t\t\t\tonclick={() => vote('b')}\n\t\t\t\t\t\t\t\t\tclass=\"rounded-xl bg-coral px-4 py-3.5 font-display text-sm font-bold text-white transition-transform hover:-translate-y-0.5 disabled:opacity-50\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('vote team B')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t{/snippet}\n\t\t</BeatNextNav>\n\t{:else}\n\t\t{@render rostersGrid()}\n\n\t\t{#if joinError}\n\t\t\t<p class=\"mt-4 rounded-lg border border-coral/30 bg-coral/[.08] px-3 py-2.5 text-xs text-coral\">\n\t\t\t\t{joinError}\n\t\t\t</p>\n\t\t\t{#if joinStartAs}\n\t\t\t\t<a\n\t\t\t\t\thref=\"/b/start?kind={joinStartAs}\"\n\t\t\t\t\tclass=\"mt-2 inline-block text-xs font-semibold text-text underline decoration-border underline-offset-4 hover:decoration-text\"\n\t\t\t\t>\n\t\t\t\t\t{startAsLabel(joinStartAs)}\n\t\t\t\t</a>\n\t\t\t{/if}\n\t\t{/if}\n\n\t\t<!-- participant / share prompt (pending) -->\n\t\t{#if isPending}\n\t\t\t<div class=\"mt-6 rounded-2xl border border-border bg-surface p-5\">\n\t\t\t\t{#if inRoster}\n\t\t\t\t\t<p class=\"font-display text-base font-bold text-text\">{t(\"you're in.\")}</p>\n\t\t\t\t\t<p class=\"mt-1 text-sm text-muted\">\n\t\t\t\t\t\t{t('share the link so teammates and rivals fill the empty slots — voting starts the moment both teams are full.')}\n\t\t\t\t\t</p>\n\t\t\t\t{:else}\n\t\t\t\t\t<p class=\"font-display text-base font-bold text-text\">{t('jump into the fight.')}</p>\n\t\t\t\t\t<p class=\"mt-1 text-sm text-muted\">\n\t\t\t\t\t\t{t('tap an open slot above to pick your side. or share it around to pull people in.')}\n\t\t\t\t\t</p>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t{/if}\n\t{/if}\n\n\t<!-- who voted — paid per-side reveal (live + closed, once votes exist) -->\n\t{#if isLive || isClosed}\n\t\t<BeatVoters\n\t\t\tcode={data.challenge.code}\n\t\t\t{votesA}\n\t\t\t{votesB}\n\t\t\tvoters={data.voters}\n\t\t\tunlocked={data.votersUnlocked}\n\t\t\tcost={data.revealVotersCost}\n\t\t\tisLoggedIn={data.isLoggedIn}\n\t\t\tonNeedTokens={() => {\n\t\t\t\tbuyTokensReason = t('not enough tokens to reveal who voted — top up to unlock.');\n\t\t\t\tshowBuyTokens = true;\n\t\t\t}}\n\t\t\tonNeedLogin={() => (showAuth = true)}\n\t\t/>\n\t{/if}\n\n\t<!-- share: copy link + post-to-feed + arena cross-sell + reddit (pending + live) -->\n\t{#if isPending || isLive}\n\t\t<div class=\"mt-8\">\n\t\t\t<BeatShare\n\t\t\t\tcode={data.challenge.code}\n\t\t\t\t{shareUrl}\n\t\t\t\tvariant={isPending ? 'pending' : 'live'}\n\t\t\t\tsubtitle={shareSubtitle}\n\t\t\t\tshowPostToFeed={isLive}\n\t\t\t/>\n\t\t</div>\n\t{/if}\n\n\t<!-- report -->\n\t<div class=\"mt-6 flex justify-end\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={() => (reportOpen = true)}\n\t\t\tclass=\"text-xs text-muted/70 underline-offset-4 hover:underline\"\n\t\t>\n\t\t\t{t('report this')}\n\t\t</button>\n\t</div>\n</section>\n\n<!-- comments (shared surface, reused from the 1v1 page) -->\n<section class=\"mx-auto w-full max-w-3xl px-4 py-10 md:px-0\">\n\t<header class=\"mb-5 flex items-baseline justify-between gap-4\">\n\t\t<h2 class=\"font-display text-xl font-bold tracking-tight text-text md:text-2xl\">{t('comments')}</h2>\n\t\t<p class=\"text-[11px] text-muted/60\">{data.comments.length}{data.commentsHasMore ? '+' : ''}</p>\n\t</header>\n\n\t<BeatCommentForm\n\t\tcode={data.challenge.code}\n\t\tisLoggedIn={!!data.session}\n\t\tonposted={(c) => commentListRef?.prepend(c)}\n\t/>\n\n\t<div class=\"mt-6\">\n\t\t<BeatCommentList\n\t\t\tbind:this={commentListRef}\n\t\t\tcode={data.challenge.code}\n\t\t\tinitialComments={data.comments}\n\t\t\tinitialHasMore={data.commentsHasMore}\n\t\t\tcurrentUserId={data.user?.id ?? null}\n\t\t/>\n\t</div>\n</section>\n\n<ReportContentModal\n\tbind:open={reportOpen}\n\tentityType=\"beat_challenge\"\n\tentityId={data.challenge.id}\n\tonclose={() => (reportOpen = false)}\n/>\n\n<AuthSheet bind:open={showAuth} next={`/b/${data.challenge.code}`} />\n\n<BuyTokensModal\n\topen={showBuyTokens}\n\tonclose={() => (showBuyTokens = false)}\n\treason={buyTokensReason}\n\tsuccessPath={`/b/${data.challenge.code}`}\n\tsource=\"beat_boost\"\n/>\n\n{#snippet rostersGrid()}\n\t<!-- mt-8 matches the 1v1's boost→stage gap -->\n\t<div class=\"mt-8 grid grid-cols-2 gap-3 md:gap-5\">\n\t\t{@render teamPanel('a', roster?.teamA ?? [])}\n\t\t{@render teamPanel('b', roster?.teamB ?? [])}\n\t</div>\n{/snippet}\n\n{#snippet teamPanel(team: 'a' | 'b', slots: TeamSlot[])}\n\t{@const isWinner = isClosed && winnerSide === team}\n\t{@const accent = team === 'a' ? 'text-blue' : 'text-coral'}\n\t<div\n\t\tclass=\"rounded-2xl border p-3 transition-colors {isWinner\n\t\t\t? team === 'a'\n\t\t\t\t? 'border-blue bg-blue/[.06]'\n\t\t\t\t: 'border-coral bg-coral/[.06]'\n\t\t\t: 'border-border bg-surface'}\"\n\t>\n\t\t<div class=\"mb-2.5\">\n\t\t\t<div class=\"flex items-baseline justify-between\">\n\t\t\t\t<span class=\"font-display text-sm font-bold {accent}\">{t('team {team}', { team: team.toUpperCase() })}</span>\n\t\t\t\t{#if isLive || isClosed}\n\t\t\t\t\t<!-- 1v1-style score: big count + small percent -->\n\t\t\t\t\t<span class=\"flex items-baseline gap-1.5\">\n\t\t\t\t\t\t<span class=\"font-display text-2xl leading-none font-bold text-text tabular-nums\"\n\t\t\t\t\t\t\t>{team === 'a' ? votesA : votesB}</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"text-[10px] tracking-widest text-text/70 uppercase\"\n\t\t\t\t\t\t\t>{team === 'a' ? pctA : pctB}%</span\n\t\t\t\t\t\t>\n\t\t\t\t\t</span>\n\t\t\t\t{:else}\n\t\t\t\t\t<span class=\"text-xs text-muted\"\n\t\t\t\t\t\t>{team === 'a' ? roster?.filledA ?? 0 : roster?.filledB ?? 0}/{cap}</span\n\t\t\t\t\t>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t\t{#if isLive || isClosed}\n\t\t\t\t<!-- 1v1-style vote-share bar (blue A / coral B) -->\n\t\t\t\t<div class=\"mt-2 h-1 overflow-hidden rounded-full bg-black/40\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"h-full transition-all duration-700 {team === 'a' ? 'bg-blue' : 'bg-coral'}\"\n\t\t\t\t\t\tstyle=\"width:{team === 'a' ? pctA : pctB}%; transition-timing-function: var(--ease-out-expo);\"\n\t\t\t\t\t></div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t</div>\n\t\t<div class=\"grid gap-2 {cap > 2 ? 'grid-cols-2' : 'grid-cols-1'}\">\n\t\t\t{#each slots as slot (slot.slot)}\n\t\t\t\t{#if slot.filled}\n\t\t\t\t\t<div class=\"relative aspect-[4/5] overflow-hidden rounded-xl bg-bg\">\n\t\t\t\t\t\t{#if slot.url && slot.mediaType === 'video'}\n\t\t\t\t\t\t\t<!-- svelte-ignore a11y_media_has_caption -->\n\t\t\t\t\t\t\t<video\n\t\t\t\t\t\t\t\tsrc={slot.url}\n\t\t\t\t\t\t\t\tmuted\n\t\t\t\t\t\t\t\tloop\n\t\t\t\t\t\t\t\tautoplay\n\t\t\t\t\t\t\t\tplaysinline\n\t\t\t\t\t\t\t\tclass=\"h-full w-full object-cover\"\n\t\t\t\t\t\t\t></video>\n\t\t\t\t\t\t{:else if slot.url}\n\t\t\t\t\t\t\t<img src={slot.url} alt=\"\" class=\"h-full w-full object-cover\" />\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"flex h-full w-full items-center justify-center text-muted/50\">\n\t\t\t\t\t\t\t\t<span class=\"text-xs\">{t('media')}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"absolute bottom-1 left-1 max-w-[calc(100%-0.5rem)] truncate rounded bg-bg/70 px-1.5 py-0.5 text-[10px] font-medium text-text\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{slot.isYou\n\t\t\t\t\t\t\t\t? t('you')\n\t\t\t\t\t\t\t\t: slot.isCreator\n\t\t\t\t\t\t\t\t\t? slot.nickname ?? t('creator')\n\t\t\t\t\t\t\t\t\t: slot.nickname ?? t('anon')}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{#if !slot.isYou && (slot.isCreator || slot.participantId)}\n\t\t\t\t\t\t\t<ReportTrigger\n\t\t\t\t\t\t\t\tvariant=\"flag\"\n\t\t\t\t\t\t\t\tentityType={slot.isCreator ? 'beat_challenge' : 'beat_participant'}\n\t\t\t\t\t\t\t\tentityId={slot.isCreator ? data.challenge.id : slot.participantId!}\n\t\t\t\t\t\t\t\tlabel={t('report this entry')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{:else if isPending && !inRoster}\n\t\t\t\t\t{#if joining && joinTeam === team && joinSlot === slot.slot}\n\t\t\t\t\t\t<!-- the tile the viewer picked → live upload loader so it never\n\t\t\t\t\t\t     looks like the tap did nothing. -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"flex aspect-[4/5] flex-col items-center justify-center gap-2 rounded-xl border border-dashed {team ===\n\t\t\t\t\t\t\t'a'\n\t\t\t\t\t\t\t\t? 'border-blue/50'\n\t\t\t\t\t\t\t\t: 'border-coral/50'} bg-surface\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg class=\"h-6 w-6 animate-spin {accent}\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"2.5\" opacity=\"0.25\" />\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M21 12a9 9 0 0 0-9-9\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span class=\"text-[11px] font-semibold {accent}\">{t('uploading…')}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={joining}\n\t\t\t\t\t\t\tonclick={() => startJoin(team, slot.slot)}\n\t\t\t\t\t\t\tclass=\"flex aspect-[4/5] flex-col items-center justify-center gap-1.5 rounded-xl border border-dashed border-border text-muted transition-colors hover:border-muted hover:text-text disabled:opacity-50\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\twidth=\"22\"\n\t\t\t\t\t\t\t\theight=\"22\"\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=\"1.6\"\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>\n\t\t\t\t\t\t\t\t<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n\t\t\t\t\t\t\t\t<line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span class=\"text-[11px] font-semibold\">{t('join team {team}', { team: team.toUpperCase() })}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t{/if}\n\t\t\t\t{:else}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex aspect-[4/5] items-center justify-center rounded-xl border border-dashed border-border/60 text-[11px] text-muted/50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('waiting')}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t{/each}\n\t\t</div>\n\t</div>\n{/snippet}\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport { beatLobbyHref, sanitizeBeatKind, type BeatKind } from '$lib/types/beat';\n\timport { startAsLabel, wrongCategoryOf } from '$lib/components/beat/wrong-category';\n\timport { onMount } from 'svelte';\n\timport { goto, invalidateAll, preloadData, replaceState } from '$app/navigation';\n\timport { resolve } from '$app/paths';\n\timport { page } from '$app/state';\n\timport { dev } from '$app/environment';\n\timport { openAuthSheet } from '$lib/stores/authSheet';\n\timport { untrack } from 'svelte';\n\timport ReportContentModal from '$lib/components/ReportContentModal.svelte';\n\timport { activeMode } from '$lib/stores/activeMode';\n\n\t// RAT-328: yellow chrome + page accent for a beat challenge page.\n\tonMount(() => {\n\t\tactiveMode.set('beat');\n\t\treturn () => activeMode.set(null);\n\t});\n\timport {\n\t\ttrackBeatChallengeAccept,\n\t\ttrackBeatChallengeAcceptLost,\n\t\ttrackBeatChallengeView,\n\t\ttrackBeatLinkCopied,\n\t\ttrackBeatRedditClick,\n\t\ttrackBeatVoteRejected,\n\t\ttrackCtaClick,\n\t\ttype BeatStatusForView,\n\t\ttype BeatViewer\n\t} from '$lib/analytics';\n\timport VSBadge from '$lib/components/duel/VSBadge.svelte';\n\timport CountdownTimer from '$lib/components/duel/CountdownTimer.svelte';\n\timport BeatCommentForm from '$lib/components/beat/comments/BeatCommentForm.svelte';\n\timport BeatCommentList from '$lib/components/beat/comments/BeatCommentList.svelte';\n\timport PostToFeedCta from '$lib/components/post/PostToFeedCta.svelte';\n\timport ReusePhoto from '$lib/components/ReusePhoto.svelte';\n\timport BuyTokensModal from '$lib/components/BuyTokensModal.svelte';\n\timport AuthSheet from '$lib/components/AuthSheet.svelte';\n\timport BeatBoostControl from '$lib/components/beat/BeatBoostControl.svelte';\n\timport BeatTeamMatch from '$lib/components/beat/BeatTeamMatch.svelte';\n\timport { stripExifClient } from '$lib/utils/strip-exif-client';\n\timport { getAvatarUrl } from '$lib/avatar';\n\timport {\n\t\tTHROW_YOUR_OWN_AFTER,\n\t\tbeatVotesOnDevice,\n\t\tcountBeatVote,\n\t\tdismissThrowOwn,\n\t\tthrowOwnDismissed\n\t} from '$lib/beat-voter-next';\n\timport type { PageData } from './$types';\n\n\tlet { data }: { data: PageData } = $props();\n\n\t// Mutable copies so vote / accept can update without a full page reload.\n\t// invalidateAll() is reserved for status transitions (pending → live, live → closed).\n\tlet challenge = $state(data.challenge);\n\tlet myVote = $state(data.myVote);\n\tlet viewerSide = $state(data.viewerSide);\n\tlet isCreator = $state(data.isCreator);\n\t// viewer's token balance — seeded from the load, patched locally on boost,\n\t// resynced from data on real server reloads (see the $effect below).\n\tlet viewerTokens = $state(data.viewerTokens);\n\t// boost state, decoupled from `challenge` (boostedUntil is a Date there; the\n\t// boost API returns it as a string). Patched on boost, resynced on reload.\n\tlet boostCount = $state(data.challenge.boostCount);\n\tlet boostedUntil = $state<string | Date | null>(data.challenge.boostedUntil);\n\n\t// RAT-117: the bits above are seeded from data once and then mutated\n\t// locally (vote / accept). When invalidateAll() reruns the server load\n\t// (status flips, accept submission), the new `data` prop arrives but\n\t// these locals stay frozen — the page kept showing the \"take the\n\t// fight\" upload form until a manual refresh. Re-sync from data on\n\t// every server-side change. Local-only patches (e.g. polling vote\n\t// counts) don't touch `data`, so this effect only fires on real\n\t// server reloads, not optimistic UI updates.\n\t//\n\t// myVote guard: don't overwrite a non-null local vote with a null from\n\t// data. The cast-vote API write commits and returns success, but the\n\t// next server load can race and re-read the row before the vote is\n\t// visible to the read replica — `data.myVote` flickers back to null,\n\t// the $effect resets local state, and the user sees the vote button\n\t// pop back into existence (RAT-168 follow-up).\n\t//\n\t// RAT-232: the guard above is only correct WHEN we're still on the same\n\t// beat. With in-page next-navigation, `data.challenge.code` changes —\n\t// the local `myVote` from the previous beat would survive the guard\n\t// (because `data.myVote || !myVote` evaluates falsy on null+truthy) and\n\t// the new page would falsely show the \"voted\" pill. Reset locals\n\t// unconditionally on code change; only honor the flicker guard within\n\t// a single beat. `untrack` so a write to `challenge` doesn't re-run\n\t// this effect.\n\t$effect(() => {\n\t\tconst next = data;\n\t\tconst prevCode = untrack(() => challenge.code);\n\t\tconst codeChanged = prevCode !== next.challenge.code;\n\t\tchallenge = next.challenge;\n\t\tif (codeChanged || next.myVote || !untrack(() => myVote)) {\n\t\t\tmyVote = next.myVote;\n\t\t}\n\t\tviewerSide = next.viewerSide;\n\t\tisCreator = next.isCreator;\n\t\t// RAT-76: reveal-voters state is per-beat — resync on every server load\n\t\t// (covers code change on in-page navigation + a fresh unlock elsewhere).\n\t\tvotersUnlocked = next.votersUnlocked;\n\t\tvoters = next.voters;\n\t\t// resync wallet + boost state on real server reloads; local boosts patch\n\t\t// them directly in between.\n\t\tviewerTokens = next.viewerTokens;\n\t\tboostCount = next.challenge.boostCount;\n\t\tboostedUntil = next.challenge.boostedUntil;\n\t});\n\n\t// ─── Token boost (Stage 0 spotlight) — control is BeatBoostControl ──────────\n\t// The component owns the amount picker + the fetch; the page owns the wallet\n\t// modal + login redirect + patching local boost state on success.\n\t// Shared with the reveal-voters flow — reason/source are set per trigger.\n\tlet showBuyTokens = $state(false);\n\tlet buyTokensReason = $state(t('boost a beat into the spotlight'));\n\tlet buyTokensSource = $state('beat_boost');\n\n\tfunction handleBoosted(r: { boostCount: number; boostedUntil: string; tokensLeft: number }) {\n\t\tboostCount = r.boostCount;\n\t\tboostedUntil = r.boostedUntil;\n\t\tviewerTokens = r.tokensLeft;\n\t}\n\t// RAT-527: \"ping me when someone bites\" — an anonymous creator signs in (or\n\t// already is) and the beat is tied to that account for its notifications.\n\t// `refused`: the server can't tie this beat to the account — it wasn't made\n\t// on this device, or it's no longer running — so there's nothing to retry.\n\tlet pingState = $state<'idle' | 'saving' | 'on' | 'failed' | 'refused'>('idle');\n\tconst pingOn = $derived(pingState === 'on' || !!data.beatPinged);\n\tasync function pingMe() {\n\t\tif (!data.isLoggedIn) {\n\t\t\topenAuthSheet(`/b/${challenge.code}?ping=1`, 'beat_ping');\n\t\t\treturn;\n\t\t}\n\t\tpingState = 'saving';\n\t\t// Dev-only QA: the creator preview can't claim someone else's beat.\n\t\tconst qa = dev && page.url.searchParams.get('beatpreview') === 'creator' ? '?preview=1' : '';\n\t\ttry {\n\t\t\tconst r = await fetch(`/api/beat/${challenge.code}/ping${qa}`, { method: 'POST' });\n\t\t\tif (r.ok) pingState = 'on';\n\t\t\telse if (r.status === 401) {\n\t\t\t\tpingState = 'idle';\n\t\t\t\topenAuthSheet(`/b/${challenge.code}?ping=1`, 'beat_ping');\n\t\t\t} else pingState = r.status === 409 ? 'refused' : 'failed';\n\t\t} catch {\n\t\t\tpingState = 'failed';\n\t\t}\n\t}\n\t// Back from signing in for it: finish the opt-in, once, and tidy the address.\n\tlet pingResumed = false;\n\t$effect(() => {\n\t\tif (pingResumed || !data.isLoggedIn || !data.beatPing) return;\n\t\tif (page.url.searchParams.get('ping') !== '1') return;\n\t\tpingResumed = true;\n\t\tuntrack(() => {\n\t\t\tconst clean = new URL(page.url);\n\t\t\tclean.searchParams.delete('ping');\n\t\t\ttry {\n\t\t\t\t// The page's own address minus one parameter: nothing to resolve.\n\t\t\t\t// eslint-disable-next-line svelte/no-navigation-without-resolve\n\t\t\t\treplaceState(clean, page.state);\n\t\t\t} catch {\n\t\t\t\t// router not ready — the parameter stays, harmlessly\n\t\t\t}\n\t\t\tvoid pingMe();\n\t\t});\n\t});\n\n\tfunction goToSignIn() {\n\t\tgoto(`/auth/sign-in?next=${encodeURIComponent(`/b/${challenge.code}`)}`);\n\t}\n\n\t// RAT-217: ref to the comment list so the form can prepend a posted\n\t// comment without a server round-trip. Shape must match the row props.\n\ttype PostedComment = {\n\t\tid: string;\n\t\tuserId: string | null;\n\t\tnickname: string | null;\n\t\tliveNickname: string | null;\n\t\tavatarPath: string | null;\n\t\tbody: string;\n\t\tcreatedAt: Date | string;\n\t};\n\tlet commentListRef = $state<{ prepend: (c: PostedComment) => void } | null>(null);\n\n\tlet voteSubmitting = $state<'a' | 'b' | null>(null);\n\tlet voteError = $state('');\n\t// Neutral feedback for a vote tap that can't become a vote (already voted /\n\t// own beat / closed) — so the button is never a silent dead-end.\n\tlet voteNotice = $state('');\n\t// \"members only\" beats: anon viewers get the sign-in sheet instead of a vote.\n\tlet showAuth = $state(false);\n\t// Which trigger raised the sheet. `flow=\"beat\"` was shared by every\n\t// entry point here (vote gate x2, server members_only fallback, the\n\t// reuse-row signup), so none of them were separately measurable.\n\tlet authFlow = $state('beat');\n\tlet acceptFile = $state<File | null>(null);\n\tlet savePhotoAccept = $state(true);\n\tlet acceptSubmitting = $state(false);\n\tlet acceptError = $state('');\n\t// Epic R: the category a picture refused by this boob or ass beat fits, for\n\t// as long as that picture is the one picked.\n\tlet acceptRefused = $state<{ file: File; fits: BeatKind } | null>(null);\n\tconst startAsKind = $derived(\n\t\tacceptRefused && acceptRefused.file === acceptFile ? acceptRefused.fits : null\n\t);\n\t// RAT-272 follow-up: per-upload csamAck checkbox dropped. Submit-time\n\t// audit row still gets written server-side.\n\tconst csamAckAccept = true;\n\t// RAT-236: report modal trigger. Per-entry reporting: side A (creator media)\n\t// = the beat_challenge itself, side B (accepter media) = beat_challenge_accept.\n\tlet reportOpen = $state(false);\n\tlet reportEntityType = $state<'beat_challenge' | 'beat_challenge_accept'>('beat_challenge');\n\n\tfunction openReport(type: 'beat_challenge' | 'beat_challenge_accept') {\n\t\treportEntityType = type;\n\t\treportOpen = true;\n\t}\n\tlet acceptDragOver = $state(false);\n\tlet copied = $state(false);\n\tlet lightboxSide = $state<'a' | 'b' | null>(null);\n\n\t// RAT-76: reveal-voters unlock — per side. Seeded from the load; mutated\n\t// locally on unlock. Reset on beat change via the resync $effect below.\n\ttype SideVoters = (typeof data.voters)['a']; // BeatSideVoters | null\n\tlet votersUnlocked = $state(data.votersUnlocked);\n\tlet voters = $state(data.voters);\n\tlet revealing = $state<'a' | 'b' | null>(null);\n\tlet revealError = $state('');\n\n\tasync function revealVoters(side: 'a' | 'b') {\n\t\tif (revealing || votersUnlocked[side]) return;\n\t\trevealing = side;\n\t\trevealError = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${challenge.code}/reveal-voters`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ side })\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst body = (await res.json()) as { voters: (typeof voters)['a'] };\n\t\t\t\tvoters = { ...voters, [side]: body.voters };\n\t\t\t\tvotersUnlocked = { ...votersUnlocked, [side]: true };\n\t\t\t} else if (res.status === 402) {\n\t\t\t\tbuyTokensReason = t('not enough tokens to reveal who voted — top up to unlock.');\n\t\t\t\tbuyTokensSource = 'beat_reveal_voters';\n\t\t\t\tshowBuyTokens = true;\n\t\t\t} else if (res.status === 401) {\n\t\t\t\tgoto(`/auth/sign-in?next=/b/${challenge.code}`);\n\t\t\t} else {\n\t\t\t\trevealError = t('could not reveal — try again.');\n\t\t\t}\n\t\t} catch {\n\t\t\trevealError = t('network error — try again.');\n\t\t} finally {\n\t\t\trevealing = null;\n\t\t}\n\t}\n\n\t// RAT-223: ref to the accept-form aside so the side-B \"you?\" tile can\n\t// scroll the joiner to it instead of popping a bare file-picker dialog.\n\tlet joinFormEl = $state<HTMLElement | null>(null);\n\tfunction scrollToJoinForm() {\n\t\tjoinFormEl?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\t}\n\n\t// RAT-76: the who-voted block sits below the skip CTA, so on mobile a small\n\t// shimmering hint next to the vote tally scrolls the viewer down to it.\n\tlet votersEl = $state<HTMLElement | null>(null);\n\tfunction scrollToVoters() {\n\t\tvotersEl?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\t}\n\n\t// RAT-419: team battles (2v2 / 4v4) render BeatTeamMatch instead of the 1v1\n\t// VS body below — the whole 1v1 template is gated on !isTeamMatch.\n\tconst isTeamMatch = $derived(challenge.format === '2v2' || challenge.format === '4v4');\n\tconst isPending = $derived(challenge.status === 'pending');\n\tconst isLive = $derived(challenge.status === 'live');\n\tconst isClosed = $derived(challenge.status === 'closed');\n\tconst isExpired = $derived(challenge.status === 'expired');\n\tconst isParticipant = $derived(viewerSide !== null);\n\tconst totalVotes = $derived(challenge.votesA + challenge.votesB);\n\tconst pctA = $derived(totalVotes ? (challenge.votesA / totalVotes) * 100 : 50);\n\tconst pctB = $derived(100 - pctA);\n\n\t// utm_source=beat_share so inbound signups attribute to beat sharing (parity\n\t// with duel_share / contest_share). The /beat → /b 308 in hooks.server.ts\n\t// preserves the query string, so the param survives the redirect.\n\tconst shareUrl = $derived(\n\t\ttypeof window !== 'undefined'\n\t\t\t? `${window.location.origin}/beat/${challenge.code}?utm_source=beat_share`\n\t\t\t: `/b/${challenge.code}?utm_source=beat_share`\n\t);\n\n\tconst acceptFileLabel = $derived.by(() => {\n\t\tif (!acceptFile) return null;\n\t\tconst size =\n\t\t\tacceptFile.size > 1024 * 1024\n\t\t\t\t? `${(acceptFile.size / 1024 / 1024).toFixed(1)} MB`\n\t\t\t\t: `${Math.ceil(acceptFile.size / 1024)} KB`;\n\t\tconst kind = acceptFile.type.startsWith('video/') ? t('video') : t('image');\n\t\treturn { name: acceptFile.name, size, kind };\n\t});\n\n\tconst closesIso = $derived(\n\t\tchallenge.closesAt\n\t\t\t? typeof challenge.closesAt === 'string'\n\t\t\t\t? challenge.closesAt\n\t\t\t\t: new Date(challenge.closesAt).toISOString()\n\t\t\t: null\n\t);\n\n\t// Pending challenges expire 7 days after createdAt; live ones use closesAt.\n\tconst expiresIso = $derived.by(() => {\n\t\tif (isPending) {\n\t\t\tconst created = new Date(challenge.createdAt);\n\t\t\treturn new Date(created.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString();\n\t\t}\n\t\treturn closesIso;\n\t});\n\n\t// Polling: while pending+owner watch for B accept; while live refresh vote counts\n\t$effect(() => {\n\t\tconst intervalMs = isPending && isCreator ? 8000 : isLive ? 30000 : null;\n\t\tif (!intervalMs) return;\n\t\tconst code = challenge.code;\n\t\tconst prevStatus = challenge.status;\n\t\tconst t = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`/api/beat/${code}/state`);\n\t\t\t\tif (!res.ok) return;\n\t\t\t\tconst fresh = await res.json();\n\t\t\t\tif (fresh.status !== prevStatus) {\n\t\t\t\t\tawait invalidateAll();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tchallenge = {\n\t\t\t\t\t...challenge,\n\t\t\t\t\tvotesA: fresh.votesA,\n\t\t\t\t\tvotesB: fresh.votesB,\n\t\t\t\t\twinnerSide: fresh.winnerSide\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\t// polling failures are silent\n\t\t\t}\n\t\t}, intervalMs);\n\t\treturn () => clearInterval(t);\n\t});\n\n\tfunction viewerRole(): BeatViewer {\n\t\tif (viewerSide === 'a') return 'owner';\n\t\tif (viewerSide === 'b') return 'accepter';\n\t\tif (challenge.status === 'pending' && !isCreator) return 'visitor';\n\t\treturn 'voter';\n\t}\n\n\t// RAT-232: onMount only fires once because the page component is reused\n\t// during in-page next-navigation — so view tracking would never fire for\n\t// beats reached via \"next beat →\". Switch to an effect that fires once\n\t// per unique code. Plain `let` (not $state) so the guard read doesn't\n\t// pull this effect into a reactive loop.\n\tlet lastTrackedViewCode: string | null = null;\n\t$effect(() => {\n\t\tconst code = challenge.code;\n\t\tif (code === lastTrackedViewCode) return;\n\t\tlastTrackedViewCode = code;\n\t\t// Read status / role untracked — we only want to fire once per code,\n\t\t// not re-fire when status flips mid-visit (live → closed via polling).\n\t\tuntrack(() =>\n\t\t\ttrackBeatChallengeView(code, challenge.status as BeatStatusForView, viewerRole())\n\t\t);\n\t});\n\n\t// Every tap on a side routes through here so the button always responds —\n\t// vote, sign-in sheet, or a one-line reason it can't count.\n\tfunction handleVoteClick(side: 'a' | 'b') {\n\t\tif (voteSubmitting) return;\n\t\tvoteNotice = '';\n\t\tvoteError = '';\n\t\t// Pending beat: side B is the \"join this duel\" tile for non-creators.\n\t\tif (side === 'b' && isPending && !isCreator) {\n\t\t\tscrollToJoinForm();\n\t\t\treturn;\n\t\t}\n\t\tif (isParticipant) {\n\t\t\tvoteNotice = t(\"that's your own beat — sit this one out\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isLive) {\n\t\t\tvoteNotice = t(\"voting's closed on this one\");\n\t\t\treturn;\n\t\t}\n\t\t// members-only beat + signed-out viewer → sign-in sheet.\n\t\tif (membersOnlyBlocked) {\n\t\t\tauthFlow = 'beat';\n\t\t\tshowAuth = true;\n\t\t\treturn;\n\t\t}\n\t\tif (myVote) {\n\t\t\tvoteNotice = t('you already voted on this one');\n\t\t\treturn;\n\t\t}\n\t\tcastVote(side);\n\t}\n\n\t// RAT-528: votes this device has cast on beats, and whether \"not now\" is on.\n\tlet deviceVotes = $state(0);\n\tlet throwOwnHidden = $state(true);\n\tonMount(() => {\n\t\tdeviceVotes = beatVotesOnDevice();\n\t\tthrowOwnHidden = throwOwnDismissed();\n\t});\n\tfunction hideThrowOwn() {\n\t\tdismissThrowOwn();\n\t\tthrowOwnHidden = true;\n\t}\n\n\tasync function castVote(side: 'a' | 'b') {\n\t\tif (myVote || voteSubmitting || isParticipant || !isLive) return;\n\t\t// \"members only\" beat + signed-out viewer → open the sign-in sheet instead\n\t\t// of firing a vote that the endpoint would 403. Brings them back here after.\n\t\tif (!data.viewerLoggedIn && !challenge.allowAnonVotes) {\n\t\t\tauthFlow = 'beat';\n\t\t\tshowAuth = true;\n\t\t\treturn;\n\t\t}\n\t\tvoteSubmitting = side;\n\t\tvoteError = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${challenge.code}/vote`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ side, source: 'beat_page' })\n\t\t\t});\n\t\t\tconst body = await res.json();\n\t\t\tif (!res.ok) {\n\t\t\t\t// Server-side members-only guard (e.g. session expired mid-visit).\n\t\t\t\tif (body.error === 'members_only') {\n\t\t\t\t\tauthFlow = 'beat';\n\t\t\t\t\tshowAuth = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoteError = body.error || t('vote failed');\n\t\t\t\tif (body.error === 'not_live') trackBeatVoteRejected(challenge.code, 'not_live');\n\t\t\t\telse if (body.error === 'cannot vote on your own duel')\n\t\t\t\t\ttrackBeatVoteRejected(challenge.code, 'self_vote');\n\t\t\t\tif (body.status && body.status !== challenge.status) await invalidateAll();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (body.alreadyVoted) {\n\t\t\t\ttrackBeatVoteRejected(challenge.code, 'already_voted');\n\t\t\t} else {\n\t\t\t\tdeviceVotes = countBeatVote();\n\t\t\t}\n\t\t\tmyVote = { side: body.mySide ?? side };\n\t\t\tchallenge = {\n\t\t\t\t...challenge,\n\t\t\t\tvotesA: body.votesA,\n\t\t\t\tvotesB: body.votesB,\n\t\t\t\tstatus: body.status,\n\t\t\t\twinnerSide: body.winnerSide\n\t\t\t};\n\t\t} catch {\n\t\t\tvoteError = t('network error');\n\t\t} finally {\n\t\t\tvoteSubmitting = null;\n\t\t}\n\t}\n\n\tfunction pickAcceptFile(input: HTMLInputElement) {\n\t\tacceptFile = input.files?.[0] ?? null;\n\t\tacceptError = '';\n\t}\n\n\tfunction handleAcceptDrop(e: DragEvent) {\n\t\te.preventDefault();\n\t\tacceptDragOver = false;\n\t\tconst f = e.dataTransfer?.files?.[0];\n\t\tif (f) {\n\t\t\tacceptFile = f;\n\t\t\tacceptError = '';\n\t\t}\n\t}\n\n\tasync function submitAccept() {\n\t\tif (!acceptFile || acceptSubmitting) return;\n\t\tconst picked = acceptFile;\n\t\tacceptSubmitting = true;\n\t\tacceptError = '';\n\t\tconst clean = await stripExifClient(acceptFile);\n\t\tconst fd = new FormData();\n\t\tfd.append('file', clean);\n\t\tfd.append('csamAck', String(csamAckAccept));\n\t\tfd.append('savePhoto', savePhotoAccept ? 'true' : 'false');\n\t\tconst fileType = clean.type.startsWith('video/') ? 'video' : 'image';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/beat/${challenge.code}/accept`, { method: 'POST', body: fd });\n\t\t\tconst body = await res.json();\n\t\t\tif (!res.ok) {\n\t\t\t\tconst wrong = wrongCategoryOf(body);\n\t\t\t\tif (body.error === 'already_accepted') {\n\t\t\t\t\tacceptError = t('someone else got in first. start your own challenge instead.');\n\t\t\t\t\ttrackBeatChallengeAcceptLost(challenge.code);\n\t\t\t\t} else if (wrong) {\n\t\t\t\t\tacceptError = wrong.text;\n\t\t\t\t\tacceptRefused = wrong.suggest ? { file: picked, fits: wrong.suggest } : null;\n\t\t\t\t} else {\n\t\t\t\t\tacceptError = body.error || t('accept failed');\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttrackBeatChallengeAccept(challenge.code, fileType);\n\t\t\tawait invalidateAll();\n\t\t} catch {\n\t\t\tacceptError = t('network error');\n\t\t} finally {\n\t\t\tacceptSubmitting = false;\n\t\t}\n\t}\n\n\t// Photo reuse: pull the saved photo down as a File and accept right away —\n\t// the accept form has no other inputs, and first upload wins.\n\tasync function useSavedPhotoAccept() {\n\t\tif (!data.lastPhotoUrl) return;\n\t\ttry {\n\t\t\tconst res = await fetch(data.lastPhotoUrl);\n\t\t\tconst blob = await res.blob();\n\t\t\tacceptFile = new File([blob], 'reused.jpg', { type: blob.type || 'image/jpeg' });\n\t\t\tacceptError = '';\n\t\t} catch {\n\t\t\tacceptError = t('could not load your saved photo — upload a new one.');\n\t\t\treturn;\n\t\t}\n\t\tawait submitAccept();\n\t}\n\n\tasync function copyLink() {\n\t\t// The button is labeled \"copy\" — write the URL straight to the\n\t\t// clipboard. The previous shareOrCopy() opened the native share sheet,\n\t\t// where on iOS several targets pasted the share text instead of the URL\n\t\t// when the user tapped \"Copy\" (the same trap RAT-301 fixed on the\n\t\t// profile copy link). The reddit / post-to-feed / group-chat blocks\n\t\t// below remain the \"share elsewhere\" affordances, so no native-share\n\t\t// entry point is lost.\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(shareUrl);\n\t\t\tcopied = true;\n\t\t\ttrackBeatLinkCopied(challenge.code, isPending ? 'waiting' : 'live');\n\t\t\tsetTimeout(() => (copied = false), 2500);\n\t\t} catch {\n\t\t\t// Clipboard blocked (rare) — the URL stays visible for manual copy.\n\t\t}\n\t}\n\n\tfunction countdownFmt(iso: string | null): string {\n\t\tif (!iso) return t('soon');\n\t\tconst ms = new Date(iso).getTime() - Date.now();\n\t\tif (ms <= 0) return t('soon');\n\t\tconst h = Math.floor(ms / 3600000);\n\t\tconst m = Math.floor((ms % 3600000) / 60000);\n\t\treturn h > 0 ? `${h}h ${m}m` : `${m}m`;\n\t}\n\n\t// Lightbox state — opens a fullscreen overlay showing the chosen side's\n\t// media. ESC dismisses; clicking outside dismisses.\n\tconst canVote = $derived(isLive && !isParticipant && !myVote);\n\t// Anon viewer on a \"members only\" beat: they can never vote here, so a tap on\n\t// a side opens the sign-in sheet instead (even if the side would otherwise be\n\t// disabled — e.g. a stale pre-gate vote from this device).\n\tconst membersOnlyBlocked = $derived(isLive && !data.viewerLoggedIn && !challenge.allowAnonVotes);\n\n\t$effect(() => {\n\t\tif (!lightboxSide) return;\n\t\tfunction onKey(e: KeyboardEvent) {\n\t\t\tif (e.key === 'Escape') lightboxSide = null;\n\t\t}\n\t\twindow.addEventListener('keydown', onKey);\n\t\treturn () => window.removeEventListener('keydown', onKey);\n\t});\n\n\tconst lightboxUrl = $derived(\n\t\tlightboxSide === 'a' ? data.mediaUrlA : lightboxSide === 'b' ? data.mediaUrlB : null\n\t);\n\tconst lightboxIsVideo = $derived(\n\t\tlightboxSide === 'a'\n\t\t\t? challenge.mediaTypeA === 'video'\n\t\t\t: lightboxSide === 'b'\n\t\t\t\t? challenge.mediaTypeB === 'video'\n\t\t\t\t: false\n\t);\n\n\t// Reddit subs we know already vote on this kind of content. Same list as\n\t// the duel ShareCommunityModal — the audience overlaps. Reddit's modern\n\t// composer fetches og:image from the linked URL so a link-post still gets\n\t// a thumbnail without needing image-post mode.\n\tconst SUBREDDITS = ['cockcompareing', 'AskDickPic', 'DM_DickPicsForOlder', 'DickPicRequestv2'];\n\n\tfunction redditSubmitUrl(sub: string): string {\n\t\tconst params = new URLSearchParams({ url: shareUrl, title: 'beat me — pick a winner' });\n\t\treturn `https://www.reddit.com/r/${sub}/submit?${params.toString()}`;\n\t}\n\n\tfunction onRedditClick(sub: string) {\n\t\ttrackBeatRedditClick(challenge.code, sub, isPending ? 'waiting' : 'live');\n\t}\n\n\t// ─── RAT-232: next / prev beat navigation ──────────────────────────────\n\t// Continuous-flow voting — after a vote (or as a pre-vote skip), the user\n\t// can hop to the next live beat without going back to /b. Prev uses a\n\t// session-storage stack so the back behavior matches what the user just\n\t// came from inside this flow (different from browser back, which would\n\t// take them out of the loop).\n\tconst PREV_STACK_KEY = 'beat:prevStack';\n\t// RAT-234 follow-up: monotonic set of every code the user has landed on\n\t// this session, sent to /api/beat/next as `seen` so the server can\n\t// exclude them. Without it, with 2 live beats the next-skip flow\n\t// ping-ponged: A → next → B → next → A. Capped at ~50.\n\tconst VISITED_KEY = 'beat:visited';\n\tconst VISITED_MAX = 50;\n\t// RAT-381: the sort the user picked on /b, stashed there so continuous-flow\n\t// voting (next / swipe) keeps the same order instead of resetting to\n\t// closing-soon. Absent (cold deep-link) → server defaults to closing-soon.\n\tconst SORT_KEY = 'beat:sort';\n\tconst DEFAULT_SORT = 'closing-soon';\n\t// undefined = not yet fetched, null = nothing left to vote on, string = next code\n\tlet nextCodePrefetch = $state<string | null | undefined>(undefined);\n\tlet nextNavigating = $state(false); // true between click and goto resolve\n\tlet prevAvailable = $state(false);\n\n\t// Continuous-vote flow: skip/next/swipe/prev navigate to another beat with\n\t// the component reused. Without help the page would sit at the top (hero) and\n\t// the user would have to scroll back down to the stage every time. We mark the\n\t// navigation, keep the scroll (noScroll), then snap the stage into view on the\n\t// code change — so the voting stage always lands in the same spot. Plain (not\n\t// $state) so reading/writing it never re-triggers the effect.\n\tlet stageEl = $state<HTMLElement | null>(null);\n\tlet pendingVoteScroll = false;\n\n\t// Request-id guard so a stale prefetch (from a previous code) can't\n\t// overwrite the current one. Plain let — never read in a reactive context.\n\tlet prefetchReqId = 0;\n\n\tfunction readPrevStack(): string[] {\n\t\tif (typeof window === 'undefined') return [];\n\t\ttry {\n\t\t\tconst raw = sessionStorage.getItem(PREV_STACK_KEY);\n\t\t\treturn raw ? (JSON.parse(raw) as string[]) : [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\tfunction writePrevStack(stack: string[]) {\n\t\ttry {\n\t\t\tsessionStorage.setItem(PREV_STACK_KEY, JSON.stringify(stack.slice(-20)));\n\t\t} catch {\n\t\t\t// quota / privacy mode — silent fallback, prev just won't work\n\t\t}\n\t}\n\n\tfunction readVisited(): string[] {\n\t\tif (typeof window === 'undefined') return [];\n\t\ttry {\n\t\t\tconst raw = sessionStorage.getItem(VISITED_KEY);\n\t\t\treturn raw ? (JSON.parse(raw) as string[]) : [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\tfunction addVisited(code: string) {\n\t\tif (typeof window === 'undefined') return;\n\t\ttry {\n\t\t\tconst list = readVisited().filter((c) => c !== code);\n\t\t\tlist.push(code);\n\t\t\tsessionStorage.setItem(VISITED_KEY, JSON.stringify(list.slice(-VISITED_MAX)));\n\t\t} catch {\n\t\t\t// quota / privacy mode — server-side `after=` exclusion still\n\t\t\t// catches the current code, just no protection against earlier\n\t\t\t// ones cycling back.\n\t\t}\n\t}\n\n\tfunction readSort(): string | null {\n\t\tif (typeof window === 'undefined') return null;\n\t\ttry {\n\t\t\treturn sessionStorage.getItem(SORT_KEY);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction buildNextUrl(code: string): string {\n\t\tconst params = new URLSearchParams({ after: code });\n\t\tconst visited = readVisited().filter((c) => c !== code);\n\t\tif (visited.length > 0) params.set('seen', visited.join(','));\n\t\t// RAT-381: carry the user's chosen order across the next/swipe flow so\n\t\t// the queue matches what they were browsing on /b.\n\t\tconst sort = readSort();\n\t\tif (sort && sort !== DEFAULT_SORT) params.set('sort', sort);\n\t\t// The queue stays in the category of the beat being viewed.\n\t\tparams.set('kind', challenge.kind);\n\t\treturn `/api/beat/next?${params.toString()}`;\n\t}\n\n\tasync function prefetchNext(code: string) {\n\t\tconst myReq = ++prefetchReqId;\n\t\ttry {\n\t\t\tconst res = await fetch(buildNextUrl(code));\n\t\t\tif (myReq !== prefetchReqId) return; // a newer prefetch took over\n\t\t\tif (!res.ok) {\n\t\t\t\tnextCodePrefetch = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst body = (await res.json()) as { code: string | null };\n\t\t\tnextCodePrefetch = body.code;\n\t\t\t// RAT-232: warm the SvelteKit data cache for the next beat so\n\t\t\t// goToNext renders instantly. preloadData triggers the +page\n\t\t\t// server load (DB + signed-URL minting, ~200-400ms) in the\n\t\t\t// background while the user is still on the current beat —\n\t\t\t// goto() then reuses the cached load with no roundtrip. The\n\t\t\t// stale request-id check above already prevents a slow\n\t\t\t// prefetch from clobbering a newer one.\n\t\t\tif (body.code) {\n\t\t\t\tvoid preloadData(`/b/${body.code}`);\n\t\t\t}\n\t\t} catch {\n\t\t\tif (myReq === prefetchReqId) nextCodePrefetch = null;\n\t\t}\n\t}\n\n\tasync function goToNext() {\n\t\tif (nextNavigating) return;\n\t\tnextNavigating = true;\n\t\t// Push current onto the prev stack before leaving so the next page's\n\t\t// prev button can come back here.\n\t\tconst stack = readPrevStack();\n\t\tstack.push(challenge.code);\n\t\twritePrevStack(stack);\n\n\t\ttry {\n\t\t\tlet target = nextCodePrefetch;\n\t\t\tif (target === undefined) {\n\t\t\t\t// Cache miss — fetch synchronously. Rare path; prefetch normally\n\t\t\t\t// covers this.\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetch(buildNextUrl(challenge.code));\n\t\t\t\t\tif (res.ok) {\n\t\t\t\t\t\tconst body = (await res.json()) as { code: string | null };\n\t\t\t\t\t\ttarget = body.code;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\ttarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (target) {\n\t\t\t\t// keep the scroll + snap to the stage on arrival (see the effect below).\n\t\t\t\tpendingVoteScroll = true;\n\t\t\t\tawait goto(`/b/${target}`, { noScroll: true });\n\t\t\t} else {\n\t\t\t\t// Nothing else live to vote on — bounce back to the hub, in this beat's category.\n\t\t\t\tawait goto(beatLobbyHref(sanitizeBeatKind(challenge.kind)));\n\t\t\t}\n\t\t} finally {\n\t\t\tnextNavigating = false;\n\t\t}\n\t}\n\n\tasync function goToPrev() {\n\t\tif (nextNavigating) return;\n\t\tconst stack = readPrevStack();\n\t\tconst prev = stack.pop();\n\t\tif (!prev) return;\n\t\twritePrevStack(stack);\n\t\tpendingVoteScroll = true;\n\t\tawait goto(`/b/${prev}`, { noScroll: true });\n\t}\n\n\t// On mount and on every code change (in-place navigation between beats),\n\t// warm the prefetch and recompute prev availability.\n\t//\n\t// Critical: this effect ONLY reads `challenge.code`. Writes to\n\t// `nextCodePrefetch` / `prevAvailable` happen here but those vars are\n\t// never read inside the effect (or any sync code it calls), so we don't\n\t// re-trigger ourselves. The prefetch function does its work entirely\n\t// inside async continuations, where Svelte's tracker is no longer\n\t// associated with this effect.\n\t$effect(() => {\n\t\tconst code = challenge.code;\n\t\t// Record this visit so future /api/beat/next calls can exclude it.\n\t\t// Must run before prefetchNext so the seen-set is up to date.\n\t\taddVisited(code);\n\t\tprevAvailable = readPrevStack().length > 0;\n\t\tnextCodePrefetch = undefined;\n\t\tvoid prefetchNext(code);\n\t});\n\n\t// After a skip/next/swipe/prev navigation (component reused), snap the voting\n\t// stage into the same spot so the user never has to scroll back down. Only on\n\t// the flow navigation — a cold deep-link lands at the top (hero) as normal.\n\t// reads challenge.code to fire on every in-place beat change; pendingVoteScroll\n\t// is a plain var so the read/write here doesn't re-trigger the effect.\n\t$effect(() => {\n\t\t// read challenge.code in the condition so this re-runs on every in-place\n\t\t// beat change (and the read can't be optimized away).\n\t\tif (challenge.code && pendingVoteScroll) {\n\t\t\tpendingVoteScroll = false;\n\t\t\t// next frame so the new beat's media has laid out before we measure.\n\t\t\trequestAnimationFrame(() =>\n\t\t\t\tstageEl?.scrollIntoView({ block: 'start', behavior: 'instant' })\n\t\t\t);\n\t\t}\n\t});\n\n\t// Keyboard: ← / → navigation. Skip when typing in an input/textarea\n\t// (comment form, etc.) so the comment composer keeps working.\n\t$effect(() => {\n\t\tfunction onKey(e: KeyboardEvent) {\n\t\t\tconst t = e.target as HTMLElement | null;\n\t\t\tif (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return;\n\t\t\tif (e.metaKey || e.ctrlKey || e.altKey) return;\n\t\t\tif (e.key === 'ArrowRight') {\n\t\t\t\te.preventDefault();\n\t\t\t\tvoid goToNext();\n\t\t\t} else if (e.key === 'ArrowLeft' && prevAvailable) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvoid goToPrev();\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('keydown', onKey);\n\t\treturn () => window.removeEventListener('keydown', onKey);\n\t});\n\n\t// Touch swipe on the stage — horizontal drag > 80px, vertical drift < 60px,\n\t// not landing on the vote/expand buttons. The vote buttons handle their\n\t// own click; swipe handler only steps in if the gesture is clearly a\n\t// horizontal flick.\n\tlet touchStartX = 0;\n\tlet touchStartY = 0;\n\tlet touchActive = false;\n\t// RAT-236: live swipe feedback — stage translates with the finger and a\n\t// hint chip appears on the leading edge once we're past the commit\n\t// threshold (80px). swipeDx stays at 0 until a touch starts, and resets\n\t// the moment touch ends regardless of outcome.\n\tlet swipeDx = $state(0);\n\tconst SWIPE_COMMIT_PX = 80;\n\tfunction onTouchStart(e: TouchEvent) {\n\t\tif (e.touches.length !== 1) return;\n\t\ttouchStartX = e.touches[0].clientX;\n\t\ttouchStartY = e.touches[0].clientY;\n\t\ttouchActive = true;\n\t}\n\tfunction onTouchMove(e: TouchEvent) {\n\t\tif (!touchActive || e.touches.length !== 1) return;\n\t\tconst dx = e.touches[0].clientX - touchStartX;\n\t\tconst dy = e.touches[0].clientY - touchStartY;\n\t\tif (Math.abs(dy) > Math.abs(dx)) {\n\t\t\t// Vertical scroll — drop into \"not swiping\" mode so the page\n\t\t\t// can scroll normally and we don't fight the user.\n\t\t\tswipeDx = 0;\n\t\t\treturn;\n\t\t}\n\t\t// Block prev when there's nothing to go back to. Damp the visual\n\t\t// movement so it feels resistive — never beyond 30% of the stage.\n\t\tconst allowed = dx < 0 || prevAvailable;\n\t\tswipeDx = allowed ? dx * 0.45 : 0;\n\t}\n\tfunction onTouchEnd(e: TouchEvent) {\n\t\tif (!touchActive) return;\n\t\ttouchActive = false;\n\t\tswipeDx = 0;\n\t\tconst t = e.changedTouches[0];\n\t\tconst dx = t.clientX - touchStartX;\n\t\tconst dy = t.clientY - touchStartY;\n\t\tif (Math.abs(dy) > 60) return; // mostly vertical → ignore\n\t\tif (Math.abs(dx) < SWIPE_COMMIT_PX) return; // not a real swipe → let click through\n\t\tif (dx < 0) {\n\t\t\tvoid goToNext();\n\t\t} else if (prevAvailable) {\n\t\t\tvoid goToPrev();\n\t\t}\n\t}\n</script>\n\n{#if isTeamMatch}\n\t<BeatTeamMatch {data} />\n{:else}\n<!-- RAT-76: one side's voter list — a paid reveal button when locked, the\n\t roster (clickable named voters + anonymous silhouettes) once unlocked. -->\n{#snippet voterBlock(side: 'a' | 'b', label: string, count: number, sv: SideVoters, unlocked: boolean)}\n\t<div class=\"rounded-lg border border-border bg-bg/40 p-3\">\n\t\t<p class=\"font-display text-[10px] font-bold tracking-[0.2em] text-muted uppercase\">\n\t\t\t{label} · {count === 1 ? t('1 vote') : t('{n} votes', { n: count })}\n\t\t</p>\n\t\t{#if unlocked && sv}\n\t\t\t{@const CAP = 12}\n\t\t\t{@const namedAll = sv.users.filter((u) => u.nickname)}\n\t\t\t{@const named = namedAll.slice(0, CAP)}\n\t\t\t{@const namedOverflow = namedAll.length - named.length}\n\t\t\t{@const anonTotal = sv.anonCount + (sv.users.length - namedAll.length)}\n\t\t\t{#if count === 0}\n\t\t\t\t<p class=\"mt-2 text-[11px] text-muted/60\">{t('no votes on this side.')}</p>\n\t\t\t{:else}\n\t\t\t\t<ul class=\"mt-2.5 flex flex-col gap-1.5\">\n\t\t\t\t\t{#each named as u, i (i)}\n\t\t\t\t\t\t{@const url = getAvatarUrl(u.avatarPath)}\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"/u/{encodeURIComponent(u.nickname ?? '')}\"\n\t\t\t\t\t\t\t\tclass=\"flex items-center gap-2 no-underline transition-opacity hover:opacity-80\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#if url}\n\t\t\t\t\t\t\t\t\t<img src={url} alt=\"\" class=\"h-6 w-6 shrink-0 rounded-full border border-border object-cover\" />\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<span class=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-surface text-[10px] font-bold text-muted\">{u.nickname?.charAt(0).toUpperCase()}</span>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t<span class=\"truncate text-[12px] font-medium text-text\">@{u.nickname}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t{/each}\n\t\t\t\t\t{#if namedOverflow > 0}\n\t\t\t\t\t\t<li class=\"pl-8 text-[11px] text-muted\">{t('+{n} more named', { n: namedOverflow })}</li>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if anonTotal > 0}\n\t\t\t\t\t\t<li class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span class=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-surface text-muted/40\">\n\t\t\t\t\t\t\t\t<svg class=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10zm0 2c-4.4 0-8 2.2-8 5v1h16v-1c0-2.8-3.6-5-8-5z\" /></svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"truncate text-[12px] text-muted\">\n\t\t\t\t\t\t\t\t{t('{n} anonymous', { n: anonTotal })}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t{/if}\n\t\t\t\t</ul>\n\t\t\t{/if}\n\t\t{:else}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonclick={() => revealVoters(side)}\n\t\t\t\tdisabled={revealing !== null}\n\t\t\t\tclass=\"mt-2.5 inline-flex items-center gap-1.5 rounded-lg bg-yellow px-3 py-1.5 font-display text-[12px] font-bold tracking-tight text-black transition-colors hover:bg-yellow/85 disabled:opacity-50\"\n\t\t\t>\n\t\t\t\t{#if revealing === side}{t('revealing…')}{:else if data.isLoggedIn}{t('reveal · {n} tokens', { n: data.revealVotersCost })}{:else}{t('sign in to reveal')}{/if}\n\t\t\t</button>\n\t\t{/if}\n\t</div>\n{/snippet}\n\n<section class=\"relative overflow-hidden px-5 pt-24 pb-10 md:pt-28 md:pb-14\">\n\t<div class=\"pointer-events-none absolute inset-0 bg-[linear-gradient(rgba(255,255,255,.005)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.005)_1px,transparent_1px)] bg-[size:60px_60px]\"></div>\n\t<div class=\"pointer-events-none absolute -top-40 -right-40 hidden h-[500px] w-[500px] rounded-full bg-yellow/[.04] blur-[180px] md:block\"></div>\n\n\t<div class=\"relative mx-auto max-w-5xl\">\n\t\t<!-- ─── BACK + STATUS ─── -->\n\t\t<div class=\"flex items-center justify-between gap-3\">\n\t\t\t<a href={beatLobbyHref(sanitizeBeatKind(challenge.kind))} class=\"inline-flex items-center gap-1.5 text-xs font-medium tracking-widest text-muted uppercase no-underline transition-colors hover:text-text\">\n\t\t\t\t<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t<polyline points=\"15 18 9 12 15 6\"></polyline>\n\t\t\t\t</svg>\n\t\t\t\t{t('all challenges')}\n\t\t\t</a>\n\n\t\t\t{#if isLive && closesIso}\n\t\t\t\t<span class=\"inline-flex items-center rounded-md bg-black/65 px-2.5 py-1 backdrop-blur\">\n\t\t\t\t\t<CountdownTimer expiresAt={closesIso} />\n\t\t\t\t</span>\n\t\t\t{:else if isClosed}\n\t\t\t\t<span class=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-surface px-3 py-1 text-[10px] font-medium tracking-widest text-muted uppercase\">{t('closed')}</span>\n\t\t\t{:else if isExpired}\n\t\t\t\t<span class=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-surface px-3 py-1 text-[10px] font-medium tracking-widest text-muted uppercase\">{t('expired')}</span>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t{#if (isLive || isPending) && isParticipant}\n\t\t\t<!-- Stage 0 boost: only the two fighters (creator side A + accepter\n\t\t\t\t side B) can push their own beat into the /b spotlight — live (more\n\t\t\t\t votes) or pending (get accepted faster). Buys exposure only; the\n\t\t\t\t vote tally stays earned. -->\n\t\t\t<BeatBoostControl\n\t\t\t\tcode={challenge.code}\n\t\t\t\t{boostCount}\n\t\t\t\t{boostedUntil}\n\t\t\t\tloggedIn={data.viewerLoggedIn}\n\t\t\t\ttokens={viewerTokens}\n\t\t\t\ttokensPerHour={data.boostTokensPerHour}\n\t\t\t\tmaxTokens={data.boostMaxTokens}\n\t\t\t\tvariant={isPending ? 'pending' : 'live'}\n\t\t\t\tonBoosted={handleBoosted}\n\t\t\t\tonNeedTokens={() => {\n\t\t\t\t\tbuyTokensReason = t('get 10× more eyes on your beat');\n\t\t\t\t\tbuyTokensSource = 'beat_boost';\n\t\t\t\t\tshowBuyTokens = true;\n\t\t\t\t}}\n\t\t\t\tonNeedLogin={goToSignIn}\n\t\t\t/>\n\t\t{/if}\n\n\t\t{#snippet pingCard(live: boolean)}\n\t\t\t{#if data.beatPing}\n\t\t\t\t<div\n\t\t\t\t\tclass=\"mt-6 flex max-w-md items-center gap-3 rounded-xl bg-surface-2 p-4\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t>\n\t\t\t\t\t{#if pingOn}\n\t\t\t\t\t\t<p class=\"text-sm text-text\">\n\t\t\t\t\t\t\t<span class=\"text-green\">✓</span> {live\n\t\t\t\t\t\t\t\t? t(\"you'll be pinged when it closes.\")\n\t\t\t\t\t\t\t\t: t(\"you'll be pinged the moment someone takes it.\")}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t{:else if pingState === 'refused'}\n\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<p class=\"font-display text-sm font-bold text-text\">{t(\"can't turn pings on here\")}</p>\n\t\t\t\t\t\t\t<p class=\"mt-0.5 text-xs leading-snug text-muted-2\">\n\t\t\t\t\t\t\t\t{t('only the device that posted this beat can — open it there.')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<p class=\"font-display text-sm font-bold text-text\">\n\t\t\t\t\t\t\t\t{live ? t('get pinged when it closes') : t('get pinged when someone bites')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{#if pingState === 'failed'}\n\t\t\t\t\t\t\t\t<p class=\"mt-0.5 text-xs leading-snug text-coral\">{t(\"didn't go through — try again.\")}</p>\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<p class=\"mt-0.5 text-xs leading-snug text-muted-2\">\n\t\t\t\t\t\t\t\t\t{data.isLoggedIn\n\t\t\t\t\t\t\t\t\t\t? t('on this account. your beat stays anonymous.')\n\t\t\t\t\t\t\t\t\t\t: t('sign in with google or email. your beat stays anonymous.')}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"shrink-0 rounded-lg bg-yellow px-4 py-2.5 font-display text-sm font-bold text-bg disabled:opacity-50\"\n\t\t\t\t\t\t\tdisabled={pingState === 'saving'}\n\t\t\t\t\t\t\tonclick={pingMe}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{pingState === 'saving' ? '…' : pingState === 'failed' ? t('try again') : t('ping me')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/snippet}\n\n\t\t<!-- ─── EDITORIAL HEADLINE PER STATE ─── -->\n\t\t<div class=\"mt-8\">\n\t\t\t{#if isPending && isCreator}\n\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-yellow uppercase\">{t('waiting')}</p>\n\t\t\t\t<h1 class=\"mt-3 font-display text-[clamp(2.4rem,8vw,5.5rem)] font-bold leading-[0.9] tracking-tighter\">\n\t\t\t\t\t{t('your shot is up.')}<br /><span class=\"text-muted\">{t('spread it.')}</span>\n\t\t\t\t</h1>\n\t\t\t\t<p class=\"mt-5 max-w-md text-sm leading-relaxed text-muted md:text-base\">\n\t\t\t\t\t{t(\"nobody's brave enough yet. share the link — first stranger to upload accepts. don't share, it dies.\")}\n\t\t\t\t</p>\n\t\t\t\t{@render pingCard(false)}\n\t\t\t{:else if isPending && !isCreator}\n\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-coral uppercase\">{t('called out')}</p>\n\t\t\t\t<h1 class=\"mt-3 font-display text-[clamp(2.4rem,8vw,5.5rem)] font-bold leading-[0.9] tracking-tighter\">\n\t\t\t\t\t{#each t('beat {guy}').split('{guy}') as part, i (i)}{#if i}<br /><span class=\"text-yellow\">{t('this guy.')}</span>{/if}{part}{/each}\n\t\t\t\t</h1>\n\t\t\t\t<p class=\"mt-5 max-w-md text-sm leading-relaxed text-muted md:text-base\">\n\t\t\t\t\t{t(\"first stranger to upload takes the fight. once you're in, twenty-four hours of public voting. there is no rematch.\")}\n\t\t\t\t</p>\n\t\t\t{:else if isLive && isParticipant}\n\t\t\t\t<!-- participant live: no editorial header — straight to the VS -->\n\t\t\t\t{#if isCreator}{@render pingCard(true)}{/if}\n\t\t\t{:else if isLive && myVote}\n\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-accent uppercase\">{t('vote locked')}</p>\n\t\t\t\t<h1 class=\"mt-3 font-display text-[clamp(2.4rem,8vw,5.5rem)] font-bold leading-[0.9] tracking-tighter\">\n\t\t\t\t\t{t('you backed')}<br /><span class=\"text-muted\">{t('your guy.')}</span>\n\t\t\t\t</h1>\n\t\t\t\t<!-- RAT-528: a few votes in, the next step is their own. -->\n\t\t\t\t{#if deviceVotes >= THROW_YOUR_OWN_AFTER && !throwOwnHidden}\n\t\t\t\t\t<div class=\"relative mt-6 flex max-w-md items-center gap-3 rounded-xl bg-surface-2 p-4 pr-10\">\n\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<p class=\"font-display text-sm font-bold text-text\">{t('your turn.')}</p>\n\t\t\t\t\t\t\t<p class=\"mt-0.5 text-xs leading-snug text-muted-2\">\n\t\t\t\t\t\t\t\t{t(\"you've judged {n}. throw your own — most get an opponent within minutes.\", { n: deviceVotes })}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={resolve('/b/start')}\n\t\t\t\t\t\t\tclass=\"shrink-0 rounded-lg bg-yellow px-4 py-2.5 font-display text-sm font-bold text-bg no-underline\"\n\t\t\t\t\t\t\tonclick={() => trackCtaClick('beat_throw_own', 'beat_voted')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t('throw yours')}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"absolute top-2 right-2 flex h-7 w-7 items-center justify-center rounded-full text-muted hover:text-text\"\n\t\t\t\t\t\t\taria-label={t('not now')}\n\t\t\t\t\t\t\tonclick={hideThrowOwn}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg class=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18M6 6l12 12\" /></svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t{:else if isLive}\n\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-coral uppercase\">{t('live · vote')}</p>\n\t\t\t\t<!-- RAT-217: headline + write-comment CTA share the row. Mobile\n\t\t\t\t\t shows just the bubble icon; sm+ adds the label. Button aligns\n\t\t\t\t\t to the top of the h1 (\"one vote\" line). -->\n\t\t\t\t<div class=\"mt-3 flex items-start justify-between gap-3\">\n\t\t\t\t\t<h1\n\t\t\t\t\t\tclass=\"font-display text-[clamp(2.4rem,8vw,5.5rem)] font-bold leading-[0.9] tracking-tighter\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('one vote')}<br /><span class=\"text-muted\">{t('per device.')}</span>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"#comments\"\n\t\t\t\t\t\tclass=\"mt-2 inline-flex shrink-0 items-center gap-2 rounded-lg border border-border bg-transparent px-3 py-2 font-display text-[12px] font-semibold tracking-tight text-text/85 no-underline transition-colors hover:border-muted/60 hover:text-text\"\n\t\t\t\t\t\taria-label={t('write a comment')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"1.8\"\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>\n\t\t\t\t\t\t\t<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<span class=\"hidden sm:inline\">{t('write some sh*t')}</span>\n\t\t\t\t\t\t{#if data.comments.length > 0}\n\t\t\t\t\t\t\t<span class=\"text-muted/70 tabular-nums\">\n\t\t\t\t\t\t\t\t{data.comments.length}{data.commentsHasMore ? '+' : ''}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t{:else if isClosed}\n\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-blue uppercase\">{t('settled')}</p>\n\t\t\t\t<h1 class=\"mt-3 font-display text-[clamp(2.4rem,8vw,5.5rem)] font-bold leading-[0.9] tracking-tighter\">\n\t\t\t\t\t{#if challenge.winnerSide === 'tie'}\n\t\t\t\t\t\t{t('a tie.')}<br /><span class=\"text-muted\">{t('somehow.')}</span>\n\t\t\t\t\t{:else if challenge.winnerSide === 'a'}\n\t\t\t\t\t\t{t('{a} to {b}.', { a: challenge.votesA, b: challenge.votesB })}<br /><span class=\"text-muted\">{t('left walks.')}</span>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{t('{a} to {b}.', { a: challenge.votesB, b: challenge.votesA })}<br /><span class=\"text-muted\">{t('right walks.')}</span>\n\t\t\t\t\t{/if}\n\t\t\t\t</h1>\n\t\t\t\t<p class=\"mt-5 max-w-md text-sm leading-relaxed text-muted md:text-base\">\n\t\t\t\t\t{t('results are permanent. yes, even if you cry.')}\n\t\t\t\t</p>\n\t\t\t{:else if isExpired}\n\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-muted uppercase\">{t('expired')}</p>\n\t\t\t\t<h1 class=\"mt-3 font-display text-[clamp(2.4rem,8vw,5.5rem)] font-bold leading-[0.9] tracking-tighter\">\n\t\t\t\t\t{t('nobody bit')}<br /><span class=\"text-muted\">{t('in seven days.')}</span>\n\t\t\t\t</h1>\n\t\t\t\t<p class=\"mt-5 max-w-md text-sm leading-relaxed text-muted md:text-base\">\n\t\t\t\t\t{isCreator\n\t\t\t\t\t\t? t(\"happens to the best of us. throw another one in if you've got the spine.\")\n\t\t\t\t\t\t: t('this challenge is dead. start your own if you want.')}\n\t\t\t\t</p>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t<!-- ─── 12-COL LAYOUT: STAGE + ASIDE ─── -->\n\t\t<div class=\"mt-10 grid gap-8 md:grid-cols-12 md:gap-10\">\n\t\t\t<!-- ─── STAGE (col-span-7 desktop) ─── -->\n\t\t\t<!-- min-w-0 prevents grid blowout: a grid item's default min-width is\n\t\t\t     auto (= content size), so intrinsic photo width can otherwise push\n\t\t\t     this column past the parent on mobile. -->\n\t\t\t<div class=\"min-w-0 scroll-mt-20 md:col-span-7\" bind:this={stageEl}>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"relative grid aspect-square grid-cols-2 overflow-hidden rounded-2xl bg-bg ring-1 ring-border ring-inset\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\taria-label={t('beat stage (swipe left or right to navigate)')}\n\t\t\t\t\tontouchstart={onTouchStart}\n\t\t\t\t\tontouchmove={onTouchMove}\n\t\t\t\t\tontouchend={onTouchEnd}\n\t\t\t\t\tstyle=\"transform: translate3d({swipeDx}px, 0, 0); transition: {touchActive ? 'none' : 'transform 0.25s cubic-bezier(0.18, 0.89, 0.32, 1.28)'};\"\n\t\t\t\t>\n\t\t\t\t\t<!-- Swipe commit hint chips — visible only while actively dragging.\n\t\t\t\t\t     Once past the 80px commit threshold the relevant side lights up\n\t\t\t\t\t     so the user can feel that releasing now will navigate. -->\n\t\t\t\t\t{#if swipeDx <= -SWIPE_COMMIT_PX}\n\t\t\t\t\t\t<div class=\"pointer-events-none absolute top-1/2 right-3 z-30 -translate-y-1/2 rounded-full bg-yellow px-3 py-1.5 font-display text-[11px] font-bold tracking-tight text-bg shadow-lg\">{t('next →')}</div>\n\t\t\t\t\t{:else if swipeDx >= SWIPE_COMMIT_PX && prevAvailable}\n\t\t\t\t\t\t<div class=\"pointer-events-none absolute top-1/2 left-3 z-30 -translate-y-1/2 rounded-full bg-surface px-3 py-1.5 font-display text-[11px] font-bold tracking-tight text-text shadow-lg\">{t('← prev')}</div>\n\t\t\t\t\t{/if}\n\t\t\t\t\t<!-- Side A — click anywhere to vote (when eligible). Hover shows\n\t\t\t\t\t     yellow ring + \"vote left\" overlay. Top-right has expand\n\t\t\t\t\t     icon for lightbox (separate hit-target). -->\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => handleVoteClick('a')}\n\t\t\t\t\t\tdisabled={voteSubmitting !== null}\n\t\t\t\t\t\taria-label={canVote || membersOnlyBlocked ? t('vote left') : t('left side')}\n\t\t\t\t\t\tclass=\"vote-side group/side relative overflow-hidden text-left {canVote || membersOnlyBlocked ? 'cursor-pointer' : 'cursor-default'} {isLive && (myVote?.side === 'b' || viewerSide === 'b') ? 'opacity-50' : ''} {isClosed && challenge.winnerSide === 'b' ? 'opacity-45 grayscale' : ''}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{#if challenge.mediaTypeA === 'video' && data.mediaUrlA}\n\t\t\t\t\t\t\t<video src={data.mediaUrlA} autoplay loop muted playsinline class=\"h-full w-full object-cover\"></video>\n\t\t\t\t\t\t{:else if data.mediaUrlA}\n\t\t\t\t\t\t\t<img src={data.mediaUrlA} alt=\"\" class=\"h-full w-full object-cover\" />\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"h-full w-full bg-gradient-to-br from-coral/20 to-coral/5\"></div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<!-- Hover-only \"vote left\" overlay (live, eligible only) -->\n\t\t\t\t\t\t{#if canVote}\n\t\t\t\t\t\t\t<div class=\"vote-hint pointer-events-none absolute inset-0 flex items-center justify-center bg-coral/10\">\n\t\t\t\t\t\t\t\t<span class=\"rounded-full bg-yellow px-5 py-2 font-display text-xs font-bold tracking-[0.2em] text-bg uppercase shadow-[0_8px_24px_-4px_rgba(255,229,0,.4)]\">\n\t\t\t\t\t\t\t\t\t{voteSubmitting === 'a' ? '…' : t('vote left')}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<!-- Live / closed: vote bar + score chip + percent -->\n\t\t\t\t\t\t{#if isLive || isClosed}\n\t\t\t\t\t\t\t<div class=\"pointer-events-none absolute inset-x-0 bottom-0 h-28 bg-gradient-to-t from-black/75 via-black/20 to-transparent\"></div>\n\t\t\t\t\t\t\t<div class=\"absolute right-3 bottom-3 left-3 h-1 overflow-hidden rounded-full bg-black/40\">\n\t\t\t\t\t\t\t\t<span class=\"block h-full transition-all duration-700 {isClosed && challenge.winnerSide === 'a' ? 'bg-accent' : 'bg-coral'}\" style=\"width: {pctA}%; transition-timing-function: var(--ease-out-expo);\"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span class=\"absolute bottom-7 left-3 font-display text-2xl font-bold text-text tabular-nums leading-none drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]\">\n\t\t\t\t\t\t\t\t{challenge.votesA}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"absolute bottom-9 left-14 text-[10px] tracking-widest text-text/70 uppercase\">\n\t\t\t\t\t\t\t\t{Math.round(pctA)}%\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<!-- State pills top-left -->\n\t\t\t\t\t\t{#if isLive && myVote?.side === 'a'}\n\t\t\t\t\t\t\t<div class=\"absolute top-3 left-3 z-20 rounded bg-accent px-2 py-0.5 text-[9px] font-bold tracking-[0.18em] text-bg uppercase\">{t('voted')}</div>\n\t\t\t\t\t\t{:else if isLive && viewerSide === 'a'}\n\t\t\t\t\t\t\t<div class=\"absolute top-3 left-3 z-20 rounded bg-yellow px-2 py-0.5 text-[9px] font-bold tracking-[0.18em] text-bg uppercase\">{t('★ your side')}</div>\n\t\t\t\t\t\t{:else if isClosed && challenge.winnerSide === 'a'}\n\t\t\t\t\t\t\t<div class=\"absolute top-3 left-3 z-20 rounded bg-accent px-2 py-0.5 font-display text-[10px] font-bold tracking-[0.18em] text-bg uppercase\">{t('won')}</div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<!-- Expand icon top-right — separate hit target, doesn't trigger\n\t\t\t\t\t\t     vote. Always visible (low opacity); brightens on hover. -->\n\t\t\t\t\t\t{#if data.mediaUrlA}\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tonclick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tlightboxSide = 'a';\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonkeydown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tlightboxSide = 'a';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label={t('enlarge left photo')}\n\t\t\t\t\t\t\t\tclass=\"absolute top-3 right-3 z-30 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-bg/70 text-text/70 backdrop-blur transition-all hover:bg-bg/90 hover:text-text\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<polyline points=\"15 3 21 3 21 9\"></polyline>\n\t\t\t\t\t\t\t\t\t<polyline points=\"9 21 3 21 3 15\"></polyline>\n\t\t\t\t\t\t\t\t\t<line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line>\n\t\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tonclick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\topenReport('beat_challenge');\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonkeydown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\topenReport('beat_challenge');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label={t('report left entry')}\n\t\t\t\t\t\t\t\tclass=\"absolute top-14 right-3 z-30 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-bg/70 text-text/70 backdrop-blur transition-all hover:bg-bg/90 hover:text-text\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<path d=\"M5 21V4\" />\n\t\t\t\t\t\t\t\t\t<path d=\"M5 4h12l-2.5 3.5L17 11H5\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<!-- Side B — same pattern as A. RAT-223: when pending and the\n\t\t\t\t\t     viewer is not the creator, the \"you?\" tile smooth-scrolls\n\t\t\t\t\t     to the accept form so the joiner sees the whole flow\n\t\t\t\t\t     (consent + drop zone + button) instead of having a bare\n\t\t\t\t\t     file-picker dialog dropped on them. -->\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => handleVoteClick('b')}\n\t\t\t\t\t\tdisabled={voteSubmitting !== null}\n\t\t\t\t\t\taria-label={canVote || membersOnlyBlocked\n\t\t\t\t\t\t\t? t('vote right')\n\t\t\t\t\t\t\t: isPending && !isCreator\n\t\t\t\t\t\t\t\t? t('join this duel')\n\t\t\t\t\t\t\t\t: t('right side')}\n\t\t\t\t\t\tclass=\"vote-side group/side relative overflow-hidden text-left {canVote ||\n\t\t\t\t\t\tmembersOnlyBlocked ||\n\t\t\t\t\t\t(isPending && !isCreator)\n\t\t\t\t\t\t\t? 'cursor-pointer'\n\t\t\t\t\t\t\t: 'cursor-default'} {isLive && (myVote?.side === 'a' || viewerSide === 'a') ? 'opacity-50' : ''} {isClosed && challenge.winnerSide === 'a' ? 'opacity-45 grayscale' : ''}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{#if isPending}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"flex h-full w-full flex-col items-center justify-center gap-3.5 px-4 text-center\"\n\t\t\t\t\t\t\t\tstyle=\"background: repeating-linear-gradient(45deg, var(--color-surface-2), var(--color-surface-2) 8px, var(--color-surface) 8px, var(--color-surface) 16px);\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class=\"join-circle relative flex h-28 w-28 items-center justify-center rounded-full\">\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"font-display text-lg font-bold tracking-tight text-yellow\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isCreator ? t('empty') : t('you?')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{#if !isCreator}\n\t\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\t\tclass=\"font-mono text-[10px] font-bold tracking-[0.28em] text-muted/60 uppercase\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{#each t('{tap} to join').split('{tap}') as part, i (i)}{#if i}<span class=\"text-yellow\">{t('tap')}</span>{/if}{part}{/each}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{:else if challenge.mediaTypeB === 'video' && data.mediaUrlB}\n\t\t\t\t\t\t\t<video src={data.mediaUrlB} autoplay loop muted playsinline class=\"h-full w-full object-cover\"></video>\n\t\t\t\t\t\t{:else if data.mediaUrlB}\n\t\t\t\t\t\t\t<img src={data.mediaUrlB} alt=\"\" class=\"h-full w-full object-cover\" />\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"h-full w-full bg-gradient-to-br from-blue/20 to-blue/5\"></div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t{#if canVote}\n\t\t\t\t\t\t\t<div class=\"vote-hint pointer-events-none absolute inset-0 flex items-center justify-center bg-blue/10\">\n\t\t\t\t\t\t\t\t<span class=\"rounded-full bg-yellow px-5 py-2 font-display text-xs font-bold tracking-[0.2em] text-bg uppercase shadow-[0_8px_24px_-4px_rgba(255,229,0,.4)]\">\n\t\t\t\t\t\t\t\t\t{voteSubmitting === 'b' ? '…' : t('vote right')}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t{#if isLive || isClosed}\n\t\t\t\t\t\t\t<div class=\"pointer-events-none absolute inset-x-0 bottom-0 h-28 bg-gradient-to-t from-black/75 via-black/20 to-transparent\"></div>\n\t\t\t\t\t\t\t<div class=\"absolute right-3 bottom-3 left-3 h-1 overflow-hidden rounded-full bg-black/40\">\n\t\t\t\t\t\t\t\t<span class=\"block h-full transition-all duration-700 {isClosed && challenge.winnerSide === 'b' ? 'bg-accent' : 'bg-blue'}\" style=\"width: {pctB}%; transition-timing-function: var(--ease-out-expo);\"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span class=\"absolute right-3 bottom-7 font-display text-2xl font-bold text-text tabular-nums leading-none drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]\">\n\t\t\t\t\t\t\t\t{challenge.votesB}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"absolute right-14 bottom-9 text-[10px] tracking-widest text-text/70 uppercase\">\n\t\t\t\t\t\t\t\t{Math.round(pctB)}%\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<!-- State pills (top-right is expand-icon territory; pills go top-left\n\t\t\t\t\t\t     so they don't collide with the icon). -->\n\t\t\t\t\t\t{#if isLive && myVote?.side === 'b'}\n\t\t\t\t\t\t\t<div class=\"absolute top-3 left-3 z-20 rounded bg-accent px-2 py-0.5 text-[9px] font-bold tracking-[0.18em] text-bg uppercase\">{t('voted')}</div>\n\t\t\t\t\t\t{:else if isLive && viewerSide === 'b'}\n\t\t\t\t\t\t\t<div class=\"absolute top-3 left-3 z-20 rounded bg-yellow px-2 py-0.5 text-[9px] font-bold tracking-[0.18em] text-bg uppercase\">{t('★ your side')}</div>\n\t\t\t\t\t\t{:else if isClosed && challenge.winnerSide === 'b'}\n\t\t\t\t\t\t\t<div class=\"absolute top-3 left-3 z-20 rounded bg-accent px-2 py-0.5 font-display text-[10px] font-bold tracking-[0.18em] text-bg uppercase\">{t('won')}</div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t{#if data.mediaUrlB && !isPending}\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tonclick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tlightboxSide = 'b';\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonkeydown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tlightboxSide = 'b';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label={t('enlarge right photo')}\n\t\t\t\t\t\t\t\tclass=\"absolute top-3 right-3 z-30 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-bg/70 text-text/70 backdrop-blur transition-all hover:bg-bg/90 hover:text-text\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<polyline points=\"15 3 21 3 21 9\"></polyline>\n\t\t\t\t\t\t\t\t\t<polyline points=\"9 21 3 21 3 15\"></polyline>\n\t\t\t\t\t\t\t\t\t<line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line>\n\t\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tonclick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\topenReport('beat_challenge_accept');\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonkeydown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\topenReport('beat_challenge_accept');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label={t('report right entry')}\n\t\t\t\t\t\t\t\tclass=\"absolute top-14 right-3 z-30 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full bg-bg/70 text-text/70 backdrop-blur transition-all hover:bg-bg/90 hover:text-text\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<path d=\"M5 21V4\" />\n\t\t\t\t\t\t\t\t\t<path d=\"M5 4h12l-2.5 3.5L17 11H5\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<!-- VS -->\n\t\t\t\t\t<div class=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n\t\t\t\t\t\t<VSBadge />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{#if isClosed && challenge.winnerSide === 'tie'}\n\t\t\t\t\t\t<div class=\"pointer-events-none absolute top-3 left-1/2 z-20 -translate-x-1/2 rounded-full border border-yellow/40 bg-bg/85 px-3 py-1 font-display text-[10px] font-bold tracking-[0.18em] text-yellow uppercase\">{t('tied')}</div>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Vote summary strip below stage -->\n\t\t\t\t{#if isLive || isClosed}\n\t\t\t\t\t<div class=\"mt-3 flex items-center justify-between text-xs\">\n\t\t\t\t\t\t<span class=\"flex items-center gap-2.5\">\n\t\t\t\t\t\t\t<span class=\"font-medium text-text tabular-nums\">{totalVotes === 1 ? t('1 vote') : t('{n} votes', { n: totalVotes })}</span>\n\t\t\t\t\t\t\t{#if totalVotes > 0}\n\t\t\t\t\t\t\t\t<button type=\"button\" onclick={scrollToVoters} class=\"beat-reveal-hint\">\n\t\t\t\t\t\t\t\t\t{t('who voted')}\n\t\t\t\t\t\t\t\t\t<svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"text-muted\">{isClosed ? t('final') : t('live')}</span>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\n\t\t\t\t{#if voteError}\n\t\t\t\t\t<p class=\"mt-3 rounded-lg border border-coral/30 bg-coral/[.08] px-3 py-2 text-xs text-coral\">\n\t\t\t\t\t\t{voteError}\n\t\t\t\t\t</p>\n\t\t\t\t{:else if voteNotice}\n\t\t\t\t\t<p class=\"mt-3 rounded-lg border border-border bg-surface px-3 py-2 text-xs text-muted\">\n\t\t\t\t\t\t{voteNotice}\n\t\t\t\t\t</p>\n\t\t\t\t{/if}\n\n\t\t\t\t<!-- RAT-232 / RAT-236: next/prev beat navigation + report.\n\t\t\t\t\t Both nav buttons share the same h-11 rounded-xl shape and icon\n\t\t\t\t\t style (stroke-2, 18px) for visual consistency. Post-vote: the\n\t\t\t\t\t main next button fills as a prominent yellow CTA. Pre-vote (or\n\t\t\t\t\t closed): outlined / muted. Prev only renders if the session\n\t\t\t\t\t stack has something to pop.\n\n\t\t\t\t\t Footer row carries: swipe indicator (mobile) + keyboard hint\n\t\t\t\t\t (desktop) + faint report link. -->\n\t\t\t\t{#if isLive || isClosed}\n\t\t\t\t\t<div class=\"beat-nav mt-5 flex items-center gap-2.5\">\n\t\t\t\t\t\t{#if prevAvailable}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonclick={goToPrev}\n\t\t\t\t\t\t\t\tdisabled={nextNavigating}\n\t\t\t\t\t\t\t\taria-label={t('previous beat')}\n\t\t\t\t\t\t\t\tclass=\"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border bg-surface text-muted transition-colors hover:border-muted/80 hover:text-text disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<path d=\"M19 12H5\"></path>\n\t\t\t\t\t\t\t\t\t<polyline points=\"11 18 5 12 11 6\"></polyline>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonclick={goToNext}\n\t\t\t\t\t\t\tdisabled={nextNavigating}\n\t\t\t\t\t\t\tclass=\"beat-nav-next group/next inline-flex h-11 flex-1 items-center justify-between gap-3 rounded-xl px-5 font-display text-[14px] font-bold tracking-tight transition-all\n\t\t\t\t\t\t\t\t{myVote && nextCodePrefetch !== null\n\t\t\t\t\t\t\t\t\t? 'bg-yellow text-bg shadow-[0_8px_24px_-8px_rgba(255,229,0,0.5)] hover:-translate-y-0.5'\n\t\t\t\t\t\t\t\t\t: 'border border-border bg-surface text-text/85 hover:border-muted/80 hover:text-text'}\n\t\t\t\t\t\t\t\tdisabled:opacity-60 disabled:hover:translate-y-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{#if nextCodePrefetch === null}\n\t\t\t\t\t\t\t\t\t{t('back to hub')}\n\t\t\t\t\t\t\t\t{:else if myVote}\n\t\t\t\t\t\t\t\t\t{t('next beat')}\n\t\t\t\t\t\t\t\t{:else if isLive}\n\t\t\t\t\t\t\t\t\t{t('skip · next beat')}\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t{t('next beat')}\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"transition-transform group-hover/next:translate-x-0.5\">\n\t\t\t\t\t\t\t\t<path d=\"M5 12h14\"></path>\n\t\t\t\t\t\t\t\t<polyline points=\"13 6 19 12 13 18\"></polyline>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Swipe / keyboard hint + report — unified footer row.\n\t\t\t\t\t\t RAT-76: sits directly under the nav CTA, above the who-voted\n\t\t\t\t\t\t roster. -->\n\t\t\t\t\t<div class=\"mt-3 flex items-center justify-between text-[10.5px] tracking-[0.18em] text-muted/55 uppercase\">\n\t\t\t\t\t\t<span class=\"inline-flex items-center gap-1.5 md:hidden\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t<polyline points=\"15 18 9 12 15 6\"></polyline>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t{t('swipe')}\n\t\t\t\t\t\t\t<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t<polyline points=\"9 18 15 12 9 6\"></polyline>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"hidden font-mono md:inline\">\n\t\t\t\t\t\t\t{prevAvailable ? t('← / → keys') : t('→ key')}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{#if !isCreator}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonclick={() => openReport('beat_challenge')}\n\t\t\t\t\t\t\t\tclass=\"font-sans normal-case tracking-normal underline-offset-2 transition-colors hover:text-muted hover:underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t('report')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<span></span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- RAT-76: who voted — token-gated roster, each side unlocks\n\t\t\t\t\t\t separately. Sits below the swipe/report footer row. -->\n\t\t\t\t\t{#if totalVotes > 0}\n\t\t\t\t\t\t<div class=\"mt-5\" bind:this={votersEl}>\n\t\t\t\t\t\t\t<p class=\"flex items-center gap-2 font-display text-[11px] font-bold tracking-[0.2em] text-muted uppercase\">\n\t\t\t\t\t\t\t\t{t('who voted')}\n\t\t\t\t\t\t\t\t<span class=\"beat-new-badge\">{t('new')}</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"mt-2 grid grid-cols-2 gap-2.5\">\n\t\t\t\t\t\t\t\t{@render voterBlock('a', t('left'), challenge.votesA, voters.a, votersUnlocked.a)}\n\t\t\t\t\t\t\t\t{@render voterBlock('b', t('right'), challenge.votesB, voters.b, votersUnlocked.b)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{#if revealError}\n\t\t\t\t\t\t\t\t<p class=\"mt-2 text-[11px] text-coral\">{revealError}</p>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\n\t\t\t<!-- ─── ASIDE (col-span-5 desktop) ─── -->\n\t\t\t<aside class=\"min-w-0 md:col-span-5\" bind:this={joinFormEl}>\n\t\t\t\t<!-- Pending visitor: accept form. Chat-invited fights are reserved\n\t\t\t\t\t for the DM recipient — everyone else gets the lock notice. -->\n\t\t\t\t{#if isPending && !isCreator && challenge.inviteLocked}\n\t\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-muted uppercase\">{t('private challenge')}</p>\n\t\t\t\t\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight md:text-3xl\">\n\t\t\t\t\t\t{t(\"this one's spoken for.\")}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\t\t{t('the creator sent this challenge to someone specific — only they can accept it. want a fight of your own?')}\n\t\t\t\t\t</p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"/b/start\"\n\t\t\t\t\t\tclass=\"mt-5 inline-flex items-center justify-center rounded-xl bg-yellow px-5 py-3 font-display text-sm font-bold text-black transition-opacity hover:opacity-90\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('start your own challenge →')}\n\t\t\t\t\t</a>\n\t\t\t\t{:else if isPending && !isCreator}\n\t\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-yellow uppercase\">{t('first upload wins')}</p>\n\t\t\t\t\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight md:text-3xl\">{t('take the fight.')}</h2>\n\t\t\t\t\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\t\t{t(\"somebody else might beat you to it. that's literally the point.\")}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<form\n\t\t\t\t\t\tonsubmit={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsubmitAccept();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclass=\"mt-5\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{#snippet acceptUpload()}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rounded-2xl border px-5 py-9 transition-all duration-300\n\t\t\t\t\t\t\t\t{acceptDragOver\n\t\t\t\t\t\t\t\t? 'border-yellow/30 bg-yellow/[.03] shadow-[inset_0_1px_20px_rgba(255,229,0,.05)]'\n\t\t\t\t\t\t\t\t: acceptFile\n\t\t\t\t\t\t\t\t\t? 'border-yellow/40 bg-surface'\n\t\t\t\t\t\t\t\t\t: 'border-border bg-surface shadow-[inset_0_1px_10px_rgba(0,0,0,.2)] hover:border-muted'}\"\n\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\tondrop={handleAcceptDrop}\n\t\t\t\t\t\t\tondragover={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tacceptDragOver = true;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tondragleave={() => (acceptDragOver = false)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#if acceptFileLabel}\n\t\t\t\t\t\t\t\t<div class=\"mx-auto flex h-11 w-11 items-center justify-center rounded-xl border border-yellow/40 bg-yellow/10 text-yellow\">\n\t\t\t\t\t\t\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mt-3 text-center font-display text-sm font-bold\">{acceptFileLabel.name}</p>\n\t\t\t\t\t\t\t\t<p class=\"mt-1 text-center text-[11px] text-muted\">{acceptFileLabel.kind} · {acceptFileLabel.size}</p>\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<div class=\"mx-auto flex h-11 w-11 items-center justify-center rounded-xl border border-border bg-bg text-muted\">\n\t\t\t\t\t\t\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t\t<path d=\"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\t\t\t</svg>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mt-3 text-center font-display text-sm font-bold\">{t('drop your shot')}</p>\n\t\t\t\t\t\t\t\t<p class=\"mt-1 text-center text-[11px] text-muted\">{t('jpg / png / mp4 · 18+')}</p>\n\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t<div class=\"mt-4 text-center\">\n\t\t\t\t\t\t\t\t<label class=\"inline-block cursor-pointer rounded-lg bg-yellow px-5 py-2.5 font-display text-[13px] font-semibold tracking-tight text-bg transition-all hover:-translate-y-0.5\">\n\t\t\t\t\t\t\t\t\t{acceptFile ? t('change file') : t('choose file')}\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\t\t\t\taccept=\"image/*,video/*\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hidden\"\n\t\t\t\t\t\t\t\t\t\tonchange={(e) => pickAcceptFile(e.currentTarget)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t<ReusePhoto\n\t\t\t\t\t\t\tloggedIn={!!data.session}\n\t\t\t\t\t\t\tlastPhotoUrl={data.lastPhotoUrl ?? null}\n\t\t\t\t\t\t\tothers=\"Arena\"\n\t\t\t\t\t\t\tuseBtnClass=\"bg-yellow text-bg\"\n\t\t\t\t\t\t\ttoggleOnClass=\"bg-yellow\"\n\t\t\t\t\t\t\tsaveMode={acceptFile && acceptFile.type.startsWith('video/')\n\t\t\t\t\t\t\t\t? 'none'\n\t\t\t\t\t\t\t\t: data.session\n\t\t\t\t\t\t\t\t\t? 'toggle'\n\t\t\t\t\t\t\t\t\t: 'signup'}\n\t\t\t\t\t\t\thasSelection={!!acceptFile}\n\t\t\t\t\t\t\tbind:save={savePhotoAccept}\n\t\t\t\t\t\t\tonSignUp={() => {\n\t\t\t\t\t\t\t\tauthFlow = 'beat_accept_reuse';\n\t\t\t\t\t\t\t\tshowAuth = true;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonBack={() => (acceptFile = null)}\n\t\t\t\t\t\t\tonUseSaved={useSavedPhotoAccept}\n\t\t\t\t\t\t\tupload={acceptUpload}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{#if acceptError}\n\t\t\t\t\t\t\t<p class=\"mt-3 rounded-lg border border-coral/30 bg-coral/[.08] px-3 py-2 text-xs text-coral\">\n\t\t\t\t\t\t\t\t{acceptError}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{#if startAsKind}\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref=\"/b/start?kind={startAsKind}\"\n\t\t\t\t\t\t\t\t\tclass=\"mt-2 inline-block text-xs font-semibold text-text underline decoration-border underline-offset-4 hover:decoration-text\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{startAsLabel(startAsKind)}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tdisabled={!acceptFile || acceptSubmitting}\n\t\t\t\t\t\t\tclass=\"submit-btn mt-4 inline-flex w-full items-center justify-center rounded-lg bg-yellow px-5 py-3.5 font-display text-sm font-bold tracking-tight text-bg disabled:cursor-not-allowed disabled:opacity-40\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{acceptSubmitting ? t('uploading…') : t('take the fight →')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\n\t\t\t\t<!-- Pending creator OR live: share block -->\n\t\t\t\t{:else if (isPending && isCreator) || isLive}\n\t\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-yellow uppercase\">{t('share')}</p>\n\t\t\t\t\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight md:text-3xl\">\n\t\t\t\t\t\t{#if isPending}\n\t\t\t\t\t\t\t{t('spread it.')}\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{t('push it.')}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\t\t{#if isPending}\n\t\t\t\t\t\t\t{t('more eyes = more chance someone bites.')}\n\t\t\t\t\t\t{:else if isParticipant}\n\t\t\t\t\t\t\t{t('more eyes = more votes = more humiliation. for the other guy, hopefully.')}\n\t\t\t\t\t\t{:else if myVote}\n\t\t\t\t\t\t\t{myVote.side === 'a' ? t('you voted left. now do the work.') : t('you voted right. now do the work.')}\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{t(\"every share is a vote you didn't have to ask for.\")}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Link row: copy URL or copy a share-template (auto-formatted) -->\n\t\t\t\t\t<div class=\"mt-5 flex items-center gap-2 rounded-lg bg-surface px-3 py-2.5 ring-1 ring-border ring-inset\">\n\t\t\t\t\t\t<code class=\"flex-1 truncate font-mono text-[12px] text-text/80\">{shareUrl}</code>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonclick={copyLink}\n\t\t\t\t\t\t\tclass=\"copy-btn rounded-md bg-yellow px-3 py-1.5 font-display text-[11px] font-bold tracking-tight text-bg\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{copied ? t('copied') : t('copy')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- RAT-271 + RAT-272 polish: post-to-feed only once the\n\t\t\t\t\t\t challenge has actually been accepted (mediaB exists). A\n\t\t\t\t\t\t pending solo upload posted to feed renders a one-sided\n\t\t\t\t\t\t 1v1 with no opponent — confusing in the feed card.\n\t\t\t\t\t\t Gating on status (live | closed | expired) covers\n\t\t\t\t\t\t every accepted state. -->\n\t\t\t\t\t{#if !isPending}\n\t\t\t\t\t\t<div class=\"mt-3\">\n\t\t\t\t\t\t\t<PostToFeedCta kind=\"beat_me\" sourceContentId={challenge.code} variant=\"block\" label={t('post this beat to your feed')} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\n\t\t\t\t\t<!-- Cross-sell into the arena: the swipe→match→chat loop is the\n\t\t\t\t\t     strongest retainer for beat players, and beat users almost all\n\t\t\t\t\t     already duel, so arena (not duel) is the high-value next step.\n\t\t\t\t\t     /a/submit reuses this photo (one tap). -->\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"/a/submit\"\n\t\t\t\t\t\tonclick={() => trackCtaClick('arena', 'beat_result')}\n\t\t\t\t\t\tclass=\"mt-3 flex items-center gap-3 rounded-lg bg-bg/40 px-3.5 py-3 no-underline ring-1 ring-border ring-inset transition-all hover:ring-orange/40\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg class=\"h-5 w-5 shrink-0 text-orange\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12.963 2.286a.75.75 0 0 0-1.071-.136 9.742 9.742 0 0 0-3.539 6.177A7.547 7.547 0 0 1 6.648 6.61a.75.75 0 0 0-1.152.082A9 9 0 1 0 15.68 4.534a7.46 7.46 0 0 1-2.717-2.248ZM15.75 14.25a3.75 3.75 0 1 1-7.313-1.172c.628.465 1.35.81 2.133 1.005a5.99 5.99 0 0 1 1.925-3.547 3.75 3.75 0 0 1 3.255 3.71Z\"/></svg>\n\t\t\t\t\t\t<span class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<span class=\"block font-display text-sm font-bold text-text\">{t('post this to the arena')}</span>\n\t\t\t\t\t\t\t<span class=\"mt-0.5 block text-[12px] leading-snug text-muted\">{t('public feed · strangers vote · get matched · free')}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<svg class=\"h-4 w-4 shrink-0 text-muted/50 transition-transform group-hover:translate-x-0.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2.2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5l7 7-7 7\"/></svg>\n\t\t\t\t\t</a>\n\n\t\t\t\t\t<!-- Reddit sub recommendations — same set as the duel ShareCommunityModal\n\t\t\t\t\t     (same audience). Each opens reddit's submit form pre-filled with\n\t\t\t\t\t     the link + a sensible title. -->\n\t\t\t\t\t<p class=\"mt-7 text-xs font-medium tracking-widest text-muted uppercase\">{t('post the matchup')}</p>\n\t\t\t\t\t<div class=\"mt-3 flex flex-col gap-1.5\">\n\t\t\t\t\t\t{#each SUBREDDITS as sub (sub)}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={redditSubmitUrl(sub)}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tonclick={() => onRedditClick(sub)}\n\t\t\t\t\t\t\t\tclass=\"reddit-row group flex items-center justify-between rounded-lg bg-bg/40 px-3.5 py-2.5 text-sm font-medium text-text no-underline ring-1 ring-border ring-inset\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>r/{sub}</span>\n\t\t\t\t\t\t\t\t<svg class=\"h-3.5 w-3.5 text-muted/60 transition-all group-hover:translate-x-0.5 group-hover:text-blue\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t\t\t\t\t\t\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14 5l7 7m0 0l-7 7m7-7H3\"></path>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{#if isPending && expiresIso}\n\t\t\t\t\t\t<p class=\"mt-6 rounded-lg bg-coral/[.06] px-3 py-2 text-[11px] text-coral ring-1 ring-coral/20 ring-inset\">\n\t\t\t\t\t\t\t{#each t('quietly disappears in {timer} if no one bites.').split('{timer}') as part, i (i)}{#if i}<CountdownTimer expiresAt={expiresIso} />{/if}{part}{/each}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t{/if}\n\n\t\t\t\t{:else if isClosed}\n\t\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-blue uppercase\">{t('again?')}</p>\n\t\t\t\t\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight md:text-3xl\">\n\t\t\t\t\t\t{#if challenge.winnerSide === 'tie'}\n\t\t\t\t\t\t\t{t('both walk away.')}\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{(isCreator && challenge.winnerSide === 'a') || (viewerSide === 'b' && challenge.winnerSide === 'b')\n\t\t\t\t\t\t\t\t? t('go again.')\n\t\t\t\t\t\t\t\t: t('next time.')}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\t\t{t('lost? rough. now do it again with a better photo. or angle. or both.')}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- RAT-527: a beat that began as a chat invite — they know each other,\n\t\t\t\t\t\t so the chat is one tap back. -->\n\t\t\t\t\t{#if data.opponentNickname}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"{resolve('/(chat)/c/[nickname]', { nickname: data.opponentNickname })}?from=beat\"\n\t\t\t\t\t\t\tclass=\"mt-5 inline-flex w-full items-center justify-center rounded-lg bg-text px-5 py-3.5 font-display text-sm font-bold tracking-tight text-bg no-underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t('message @{name} — rematch?', { name: data.opponentNickname })}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t{/if}\n\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"/b/start\"\n\t\t\t\t\t\tclass=\"submit-btn mt-5 inline-flex w-full items-center justify-center rounded-lg bg-yellow px-5 py-3.5 font-display text-sm font-bold tracking-tight text-bg no-underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('throw your own →')}\n\t\t\t\t\t</a>\n\n\t\t\t\t{:else if isExpired}\n\t\t\t\t\t<p class=\"text-xs font-medium tracking-widest text-muted uppercase\">{t('try again')}</p>\n\t\t\t\t\t<h2 class=\"mt-3 font-display text-2xl font-bold tracking-tight md:text-3xl\">\n\t\t\t\t\t\t{isCreator ? t('re-post.') : t('start your own.')}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<p class=\"mt-2 text-[13px] leading-relaxed text-muted\">\n\t\t\t\t\t\t{isCreator\n\t\t\t\t\t\t\t? t('better angle, better timing, better dms.')\n\t\t\t\t\t\t\t: t('you came for a fight. there will be others.')}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"/b/start\"\n\t\t\t\t\t\tclass=\"submit-btn mt-5 inline-flex w-full items-center justify-center rounded-lg bg-yellow px-5 py-3.5 font-display text-sm font-bold tracking-tight text-bg no-underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{isCreator ? t('re-post →') : t('start your own →')}\n\t\t\t\t\t</a>\n\t\t\t\t{/if}\n\t\t\t</aside>\n\t\t</div>\n\t</div>\n</section>\n\n<!-- ─── COMMENTS (RAT-217) ─── -->\n<section id=\"comments\" class=\"relative scroll-mt-24 px-5 pb-20\">\n\t<div class=\"mx-auto max-w-3xl\">\n\t\t<header class=\"mb-5 flex items-baseline justify-between gap-4\">\n\t\t\t<h2 class=\"font-display text-xl font-bold tracking-tight text-text md:text-2xl\">\n\t\t\t\t{t('comments')}\n\t\t\t</h2>\n\t\t\t<p class=\"text-[11px] text-muted/60\">\n\t\t\t\t{data.comments.length}{data.commentsHasMore ? '+' : ''}\n\t\t\t</p>\n\t\t</header>\n\n\t\t<!-- keyed on the beat: going to the next beat reuses this page, and the\n\t\t\t list seeds its own state from the first beat's comments once -->\n\t\t{#key data.challenge.code}\n\t\t<BeatCommentForm\n\t\t\tcode={data.challenge.code}\n\t\t\tisLoggedIn={!!data.session}\n\t\t\tonposted={(c) => commentListRef?.prepend(c)}\n\t\t/>\n\n\t\t<div class=\"mt-6\">\n\t\t\t<BeatCommentList\n\t\t\t\tbind:this={commentListRef}\n\t\t\t\tcode={data.challenge.code}\n\t\t\t\tinitialComments={data.comments}\n\t\t\t\tinitialHasMore={data.commentsHasMore}\n\t\t\t\tcurrentUserId={data.user?.id ?? null}\n\t\t\t/>\n\t\t</div>\n\t\t{/key}\n\t</div>\n\n</section>\n\n<ReportContentModal\n\tbind:open={reportOpen}\n\tentityType={reportEntityType}\n\tentityId={challenge.id}\n\tonclose={() => (reportOpen = false)}\n/>\n\n<BuyTokensModal\n\topen={showBuyTokens}\n\tonclose={() => (showBuyTokens = false)}\n\treason={buyTokensReason}\n\tsuccessPath={`/b/${challenge.code}`}\n\tsource={buyTokensSource}\n/>\n\n<AuthSheet bind:open={showAuth} next={`/b/${challenge.code}`} flow={authFlow} />\n\n<!-- ─── LIGHTBOX ─── -->\n{#if lightboxSide && lightboxUrl}\n\t<div\n\t\tclass=\"lightbox-overlay fixed inset-0 z-50 flex items-center justify-center bg-bg/95 p-6 backdrop-blur-sm\"\n\t\trole=\"dialog\"\n\t\taria-modal=\"true\"\n\t\taria-label={t('enlarged photo')}\n\t>\n\t\t<!-- Backdrop close button covering the whole overlay. The image/video\n\t\t     sits on top with a higher z-index; clicking the image doesn't\n\t\t     bubble to the backdrop because z-stacking handles the hit-test. -->\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={() => (lightboxSide = null)}\n\t\t\taria-label={t('close')}\n\t\t\tclass=\"absolute inset-0 z-10 cursor-zoom-out\"\n\t\t></button>\n\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={() => (lightboxSide = null)}\n\t\t\taria-label={t('close')}\n\t\t\tclass=\"absolute top-5 right-5 z-30 flex h-10 w-10 items-center justify-center rounded-full bg-surface text-text ring-1 ring-border ring-inset transition-colors hover:bg-bg/60\"\n\t\t>\n\t\t\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t\t</svg>\n\t\t</button>\n\n\t\t<div class=\"relative z-20 max-h-[90vh] max-w-[92vw]\">\n\t\t\t{#if lightboxIsVideo}\n\t\t\t\t<!-- svelte-ignore a11y_media_has_caption -->\n\t\t\t\t<video\n\t\t\t\t\tsrc={lightboxUrl}\n\t\t\t\t\tautoplay\n\t\t\t\t\tloop\n\t\t\t\t\tcontrols\n\t\t\t\t\tplaysinline\n\t\t\t\t\tclass=\"block max-h-[90vh] max-w-[92vw] rounded-xl\"\n\t\t\t\t></video>\n\t\t\t{:else}\n\t\t\t\t<img src={lightboxUrl} alt=\"\" class=\"block max-h-[90vh] max-w-[92vw] rounded-xl\" />\n\t\t\t{/if}\n\t\t</div>\n\t</div>\n{/if}\n{/if}\n\n<style>\n\t/* Custom-styled checkbox shared with /b/start. Native sr-only + visual\n\t   .checkbox-box span; :has() reveals the checkmark when checked. */\n\t.checkbox-mark {\n\t\topacity: 0;\n\t\ttransition: opacity 0.2s var(--ease-out-quart);\n\t}\n\t.consent-row:has(input:checked) .checkbox-mark {\n\t\topacity: 1;\n\t}\n\n\t.submit-btn,\n\t.copy-btn {\n\t\ttransition:\n\t\t\ttransform 0.45s var(--ease-out-expo),\n\t\t\tbox-shadow 0.45s var(--ease-out-expo);\n\t}\n\t.submit-btn:not(:disabled):hover,\n\t.copy-btn:hover {\n\t\ttransform: translateY(-2px);\n\t\tbox-shadow: 0 12px 32px -10px rgb(255 229 0 / 0.4);\n\t}\n\n\t/* Whole-side click target for voting. Reset native button styling so the\n\t   image fills the cell, then layer a hover-only \"vote left/right\" hint.\n\t   The button is inert (cursor-default) when voting isn't allowed — the\n\t   .vote-hint only renders for canVote, so opacity transitions only happen\n\t   on eligible cells.\n\t   `min-width: 0` is critical: <button> elements default to min-content\n\t   sizing, which on a grid item means the image's intrinsic pixel width\n\t   pushes the cell wider than its 50% allocation — overflows the stage on\n\t   mobile. min-width:0 lets the grid track govern the size. */\n\t.vote-side {\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tappearance: none;\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmin-width: 0;\n\t}\n\t.vote-hint {\n\t\topacity: 1;\n\t\ttransition: opacity 0.4s var(--ease-out-expo);\n\t}\n\t.vote-side:not([disabled]) {\n\t\ttransition: filter 0.4s var(--ease-out-expo);\n\t}\n\t.vote-side:not([disabled]):hover {\n\t\tfilter: brightness(1.05);\n\t}\n\n\t/* Reddit submit row — subtle ring highlight on hover, no lift. */\n\t.reddit-row {\n\t\ttransition: background-color 0.3s var(--ease-out-quart), box-shadow 0.3s var(--ease-out-quart);\n\t}\n\t.reddit-row:hover {\n\t\tbackground-color: rgb(59 130 246 / 0.06);\n\t\tbox-shadow: inset 0 0 0 1px rgb(59 130 246 / 0.4);\n\t}\n\n\t/* RAT-223: \"you?\" placeholder — dashed neutral ring, no fill. The yellow\n\t   lives only in the \"you?\" label inside; the circle itself stays muted\n\t   so it doesn't read as a solid CTA. Slow breathing pulse keeps it\n\t   alive without color noise. */\n\t.join-circle {\n\t\tbackground: transparent;\n\t\tborder: 1.5px dashed rgba(255, 255, 255, 0.28);\n\t\tanimation: join-breathe 2.6s ease-in-out infinite;\n\t}\n\t.vote-side:hover .join-circle {\n\t\tborder-color: rgba(255, 255, 255, 0.55);\n\t}\n\t@keyframes join-breathe {\n\t\t0%, 100% { transform: scale(1); }\n\t\t50% { transform: scale(1.035); }\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.join-circle { animation: none; }\n\t}\n\n\t/* RAT-76: shimmering NEW badge next to \"who voted\". A light band sweeps\n\t   across the filled yellow pill — highlight motion, not a colored glow. */\n\t.beat-new-badge {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tpadding: 2px 7px;\n\t\tborder-radius: 999px;\n\t\tfont-size: 9px;\n\t\tfont-weight: 800;\n\t\tletter-spacing: 0.15em;\n\t\tcolor: #000;\n\t\tbackground-image: linear-gradient(\n\t\t\t110deg,\n\t\t\tvar(--color-yellow) 38%,\n\t\t\t#fff6bf 48%,\n\t\t\tvar(--color-yellow) 58%\n\t\t);\n\t\tbackground-size: 220% 100%;\n\t\tanimation: beat-new-shimmer 2.4s linear infinite;\n\t}\n\t@keyframes beat-new-shimmer {\n\t\tto { background-position: -220% 0; }\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.beat-new-badge { animation: none; }\n\t}\n\n\t/* RAT-76: small \"who voted\" hint beside the vote tally. Desktop = quiet\n\t   yellow text link; mobile = filled shimmering pill (same sweep as the NEW\n\t   badge) since the roster lives further down the scroll on phones. */\n\t.beat-reveal-hint {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 3px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: 0.01em;\n\t\tcolor: var(--color-yellow);\n\t\ttransition: color 0.15s ease;\n\t}\n\t.beat-reveal-hint:hover {\n\t\tcolor: #fff;\n\t}\n\t@media (max-width: 767px) {\n\t\t.beat-reveal-hint {\n\t\t\tpadding: 2px 8px;\n\t\t\tborder-radius: 999px;\n\t\t\tcolor: #000;\n\t\t\tbackground-image: linear-gradient(\n\t\t\t\t110deg,\n\t\t\t\tvar(--color-yellow) 38%,\n\t\t\t\t#fff6bf 48%,\n\t\t\t\tvar(--color-yellow) 58%\n\t\t\t);\n\t\t\tbackground-size: 220% 100%;\n\t\t\tanimation: beat-new-shimmer 2.4s linear infinite;\n\t\t}\n\t\t.beat-reveal-hint:hover {\n\t\t\tcolor: #000;\n\t\t}\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.beat-reveal-hint { animation: none; }\n\t}\n</style>\n"],"version":3}