{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4cbe-7002-a0db-682a91379c4b","file":"163.DJmpvfyJ.mjs","mappings":"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","names":["runningFor","$.derived","mins","a","root","div","$.child","img","root_1","$.template_effect","$.set_attribute","div_1","root_2","$$render","consequent","alternate","div_2","div_3","span","root_3","span_1","root_4","$$props","consequent_1","alternate_1","h3","$.sibling","node_1","div_4","div_5","root_5","consequent_2","span_2","root_6","$.append","$$anchor","span_3","root_7","consequent_3","alternate_2","$.reset","$.set_text","text_1","t","owns","$.state","$.proxy","busy","errorMsg","showBuy","hitWall","finishing","openWall","$.set","myRating","hoverRating","myBody","reviewBusy","reviewMsg","spiceLabel","shareState","shareTimer","shareStory","shareOrCopy","$.get","r","onMount","activeMode","page","stopped","clean","replaceState","start","late","onDestroy","play","goto","res","body","unlock","submitReview","invalidateAll","fmtDate","d","main","$.first_child","fragment","section","node","text","h1","text_2","node_2","p","text_3","fragment_2","consequent_4","span_4","text_7","consequent_5","section_1","root_8","div_6","s","RpLiveCard","consequent_6","section_2","node_6","p_1","section_3","fragment_4","p_2","section_4","root_11","p_3","text_10","consequent_7","text_9","section_5","root_12","p_4","text_11","consequent_8","section_6","root_13","div_7","role","div_8","root_14","p_5","root_15","text_13","consequent_9","div_9","root_16","stat","span_5","root_17","text_14","consequent_10","text_12","consequent_11","section_7","root_18","div_10","$.each","sample","div_11","root_19","p_6","p_7","root_20","text_16","consequent_12","text_15","consequent_13","section_8","node_12","h2","span_6","root_21","$0","text_17","consequent_14","div_12","root_22","p_8","div_13","n","button","root_23","$.set_class","textarea","$.remove_textarea_child","div_14","button_1","text_19","node_16","span_7","root_24","consequent_15","$$value","$.delegated","consequent_16","div_15","root_25","div_16","root_26","div_17","span_8","span_9","span_10","text_22","p_9","root_27","text_24","consequent_17","p_10","node_18","p_11","root_28","consequent_18","aside","div_18","div_19","div_20","span_11","TokenCoin","text_28","consequent_19","alternate_3","span_12","root_31","consequent_20","div_21","a_1","root_33","button_2","root_34","text_29","consequent_21","alternate_4","a_2","node_23","a_3","root_36","button_3","root_37","text_30","consequent_23","alternate_5","button_4","root_38","node_25","text_32","consequent_25","alternate_6","consequent_22","consequent_24","alternate_7","button_5","node_22","text_33","node_27","p_12","root_41","consequent_26","p_13","root_42","p_14","root_43","consequent_27","consequent_28","div_22","root_44","div_23","f","a_4","root_45","node_30","img_1","root_46","span_13","root_47","consequent_29","alternate_8","span_14","span_15","span_16","root_48","text_36","consequent_30","text_35","resolve","consequent_31","p_15","payoutUsd","text_38","consequent_32","consequent_34","alternate_9","div_24","root_53","tag","a_5","root_54","text_41","consequent_35","$1","BuyTokensModal","node_34","text_8"],"sources":["../../../../../../src/lib/components/roleplay/RpLiveCard.svelte","../../../../../../src/routes/roleplay/[slug]/+page.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport type { LiveSession } from '$lib/roleplay/types';\n\n\tlet { session }: { session: LiveSession } = $props();\n\n\tconst runningFor = $derived.by(() => {\n\t\tconst mins = Math.max(0, Math.round((Date.now() - new Date(session.startedAt).getTime()) / 60000));\n\t\tif (mins < 1) return 'just now';\n\t\tif (mins < 60) return `${mins}m`;\n\t\treturn `${Math.floor(mins / 60)}h ${mins % 60}m`;\n\t});\n</script>\n\n<a\n\thref=\"/g/{session.code}\"\n\tclass=\"group flex items-center gap-3 rounded-xl border border-border bg-surface p-3 transition-colors hover:border-purple/50\"\n>\n\t<div class=\"relative h-14 w-14 flex-none overflow-hidden rounded-lg bg-surface-2\">\n\t\t{#if session.coverImageUrl}\n\t\t\t<img src={session.coverImageUrl} alt=\"\" class=\"h-full w-full object-cover\" />\n\t\t{:else}\n\t\t\t<div class=\"absolute inset-0 bg-gradient-to-br from-purple/30 to-bg\"></div>\n\t\t{/if}\n\t</div>\n\n\t<div class=\"min-w-0 flex-1\">\n\t\t<div class=\"flex items-center gap-2\">\n\t\t\t{#if session.status === 'active'}\n\t\t\t\t<span class=\"flex items-center gap-1 text-[10px] font-bold tracking-wide text-green uppercase\">\n\t\t\t\t\t<span class=\"h-1.5 w-1.5 rounded-full bg-green\"></span>live\n\t\t\t\t</span>\n\t\t\t{:else}\n\t\t\t\t<span class=\"text-[10px] font-bold tracking-wide text-purple uppercase\">open lobby</span>\n\t\t\t{/if}\n\t\t\t<h3 class=\"truncate font-display text-[14px] font-bold text-text\">{session.title}</h3>\n\t\t</div>\n\t\t<div class=\"mt-0.5 truncate font-mono text-[11px] text-muted\">\n\t\t\t{session.playerCount}/{session.maxPlayers} players · {session.seatsLeft} open · {runningFor}\n\t\t</div>\n\t\t{#if session.hostNickname}\n\t\t\t<div class=\"truncate text-[11px] text-muted/70\">hosted by @{session.hostNickname}</div>\n\t\t{/if}\n\t</div>\n\n\t{#if session.status === 'active'}\n\t\t<!-- in-progress games aren't joinable (late-join is lobbies-only) — you can\n\t\t     still open the room to watch the story unfold. -->\n\t\t<span\n\t\t\tclass=\"flex-none rounded-lg border border-border px-3 py-1.5 text-[12px] font-bold text-muted transition-colors group-hover:text-text\"\n\t\t\t>watch</span\n\t\t>\n\t{:else}\n\t\t<span\n\t\t\tclass=\"flex-none rounded-lg bg-purple px-3 py-1.5 text-[12px] font-bold text-white transition-colors group-hover:bg-purple-dark\"\n\t\t\t>join</span\n\t\t>\n\t{/if}\n</a>\n","<script lang=\"ts\">\n\timport { onMount, onDestroy } from 'svelte';\n\timport { goto } from '$app/navigation';\n\timport { invalidateAll } from '$app/navigation';\n\timport { activeMode } from '$lib/stores/activeMode';\n\timport { shareOrCopy } from '$lib/share';\n\timport TokenCoin from '$lib/components/TokenCoin.svelte';\n\timport { payoutUsd } from '$lib/payout-rate';\n\timport RpLiveCard from '$lib/components/roleplay/RpLiveCard.svelte';\n\timport BuyTokensModal from '$lib/components/BuyTokensModal.svelte';\n\timport { page } from '$app/state';\n\timport { replaceState } from '$app/navigation';\n\timport { resolve } from '$app/paths';\n\timport type { PageData } from './$types';\n\n\tlet { data }: { data: PageData } = $props();\n\n\tconst t = $derived(data.template);\n\n\tlet owns = $state(data.owns);\n\tlet busy = $state(false);\n\tlet errorMsg = $state('');\n\t// RAT-535 (rp-unlock-wall): short on tokens → the buy sheet, not a red line.\n\tlet showBuy = $state(false);\n\tlet hitWall = $state(false);\n\tlet finishing = $state<'idle' | 'waiting' | 'late'>('idle');\n\tfunction openWall() {\n\t\thitWall = true;\n\t\tshowBuy = true;\n\t}\n\n\t// review form\n\tlet myRating = $state(data.myReview?.rating ?? 0);\n\tlet hoverRating = $state(0);\n\tlet myBody = $state(data.myReview?.body ?? '');\n\tlet reviewBusy = $state(false);\n\tlet reviewMsg = $state('');\n\n\tconst spiceLabel: Record<string, string> = {\n\t\tvanilla: 'vanilla',\n\t\tspicy: 'spicy',\n\t\texplicit: 'explicit · 18+'\n\t};\n\n\t// Share the story link (drives discovery + unlocks). Native sheet on mobile,\n\t// clipboard on desktop; called synchronously from the click per the iOS rule.\n\tlet shareState = $state<'idle' | 'shared' | 'copied'>('idle');\n\tlet shareTimer: ReturnType<typeof setTimeout> | undefined;\n\tfunction shareStory() {\n\t\tif (typeof window === 'undefined') return;\n\t\tvoid shareOrCopy({\n\t\t\turl: `${window.location.origin}/roleplay/${t.slug}?utm_source=rp_story_share`,\n\t\t\ttitle: t.title,\n\t\t\ttext: t.tagline ?? 'play this roleplay on ratemyd'\n\t\t}).then((r) => {\n\t\t\tif (r === 'shared' || r === 'copied') {\n\t\t\t\tshareState = r;\n\t\t\t\tclearTimeout(shareTimer);\n\t\t\t\tshareTimer = setTimeout(() => (shareState = 'idle'), 1800);\n\t\t\t}\n\t\t});\n\t}\n\n\tonMount(() => {\n\t\tactiveMode.set('roleplay');\n\t\treturn () => activeMode.set(null);\n\t});\n\n\t// RAT-535: back from checkout — the tokens arrive by webhook a moment later.\n\t// Keep trying the unlock (a 402 changes nothing) until it goes through.\n\tonMount(() => {\n\t\tif (page.url.searchParams.get('unlock') !== '1' || !data.isLoggedIn || owns) return;\n\t\tlet stopped = false;\n\t\tfinishing = 'waiting';\n\t\tvoid Promise.resolve().then(() => {\n\t\t\tconst clean = new URL(page.url);\n\t\t\tclean.searchParams.delete('unlock');\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});\n\t\t(async () => {\n\t\t\tconst start = Date.now();\n\t\t\twhile (!stopped && !owns && Date.now() - start < 140_000) {\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetch(`/api/rp/templates/${t.id}/unlock`, { method: 'POST' });\n\t\t\t\t\tif (res.ok) {\n\t\t\t\t\t\towns = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// try again on the next round\n\t\t\t\t}\n\t\t\t\tconst late = Date.now() - start >= 20_000;\n\t\t\t\tif (late && finishing === 'waiting') finishing = 'late';\n\t\t\t\tawait new Promise((r) => setTimeout(r, late ? 5000 : 1500));\n\t\t\t}\n\t\t\tif (!stopped && owns) finishing = 'idle';\n\t\t})();\n\t\treturn () => {\n\t\t\tstopped = true;\n\t\t};\n\t});\n\tonDestroy(() => clearTimeout(shareTimer));\n\n\tasync function play() {\n\t\tif (busy) return;\n\t\t// Logged-out users get sent to sign-in (with a return path back here),\n\t\t// mirroring the /g/[code] + (chat) layout gate — not silently bounced\n\t\t// to the homepage where the click looks like it just failed.\n\t\tif (!data.isLoggedIn) return goto(`/auth/sign-in?next=/roleplay/${t.slug}`);\n\t\tbusy = true;\n\t\terrorMsg = '';\n\t\ttry {\n\t\t\t// Matchmake: join an existing open public lobby for this template if one\n\t\t\t// exists, otherwise host a fresh public game — so seekers funnel together.\n\t\t\tconst res = await fetch('/api/rp/matchmake', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ templateId: t.id })\n\t\t\t});\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (res.status === 402) {\n\t\t\t\topenWall();\n\t\t\t} else if (!res.ok || !body.code) {\n\t\t\t\terrorMsg = \"couldn't start. try again.\";\n\t\t\t} else {\n\t\t\t\tawait goto(`/g/${body.code}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = 'network error. try again.';\n\t\t}\n\t\tbusy = false;\n\t}\n\n\tasync function unlock() {\n\t\tif (busy) return;\n\t\t// Same as play(): send logged-out users to sign-in with a return path\n\t\t// instead of the silent goto('/') dead-end.\n\t\tif (!data.isLoggedIn) return goto(`/auth/sign-in?next=/roleplay/${t.slug}`);\n\t\tbusy = true;\n\t\terrorMsg = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/rp/templates/${t.id}/unlock`, { method: 'POST' });\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (res.status === 402) {\n\t\t\t\topenWall();\n\t\t\t} else if (!res.ok) {\n\t\t\t\terrorMsg = \"couldn't unlock. try again.\";\n\t\t\t} else {\n\t\t\t\towns = true;\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = 'network error. try again.';\n\t\t}\n\t\tbusy = false;\n\t}\n\n\tasync function submitReview() {\n\t\tif (reviewBusy || myRating < 1) return;\n\t\treviewBusy = true;\n\t\treviewMsg = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/rp/templates/${t.id}/review`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ rating: myRating, body: myBody.trim() })\n\t\t\t});\n\t\t\tif (!res.ok) {\n\t\t\t\treviewMsg = \"couldn't save that.\";\n\t\t\t} else {\n\t\t\t\treviewMsg = \"verdict's live.\";\n\t\t\t\tawait invalidateAll();\n\t\t\t}\n\t\t} catch {\n\t\t\treviewMsg = 'network error. try again.';\n\t\t}\n\t\treviewBusy = false;\n\t}\n\n\tfunction fmtDate(d: string | Date): string {\n\t\treturn new Date(d).toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n\t}\n</script>\n\n<!-- OG/share meta rides through the layout's seo pipeline (page.data.seo, set\n\t in +page.server.ts) — page-level og tags here would duplicate the layout's\n\t and scrapers take the first one they see. -->\n\n<!-- pt clears the fixed 65px navbar. Without it the hero ran under it: the\n\t cover's top third and the back link sat behind solid chrome. Every other\n\t full-bleed page in the app carries the same offset. -->\n<main class=\"relative overflow-hidden pt-[65px] pb-32\">\n\t<!-- HERO -->\n\t<section class=\"relative h-[clamp(320px,46vw,520px)] w-full overflow-hidden\">\n\t\t{#if data.coverImageUrl}\n\t\t\t<img src={data.coverImageUrl} alt={t.title} class=\"absolute inset-0 h-full w-full object-cover\" />\n\t\t{:else}\n\t\t\t<div class=\"absolute inset-0 bg-gradient-to-br from-surface-2 to-bg\"></div>\n\t\t\t<div\n\t\t\t\tclass=\"pointer-events-none absolute inset-0 bg-[linear-gradient(rgba(255,255,255,.02)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.02)_1px,transparent_1px)] bg-[size:48px_48px]\"\n\t\t\t></div>\n\t\t{/if}\n\t\t<div class=\"absolute inset-0 bg-gradient-to-t from-bg via-bg/60 to-bg/10\"></div>\n\n\t\t<div class=\"absolute inset-x-0 bottom-0\">\n\t\t\t<div class=\"mx-auto w-full max-w-5xl px-5 pb-7 md:px-6\">\n\t\t\t\t<a\n\t\t\t\t\thref=\"/roleplay\"\n\t\t\t\t\tclass=\"mb-4 inline-flex items-center gap-1.5 font-mono text-[10px] tracking-[0.2em] text-muted uppercase no-underline transition-colors hover:text-text\"\n\t\t\t\t\t>← marketplace</a\n\t\t\t\t>\n\t\t\t\t<div class=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t\t{#if t.tone}\n\t\t\t\t\t\t<span class=\"rounded-md bg-purple/90 px-2 py-1 text-[10px] font-bold text-white\">{t.tone}</span>\n\t\t\t\t\t{/if}\n\t\t\t\t\t<span class=\"rounded-md bg-black/55 px-2 py-1 text-[10px] font-semibold text-text backdrop-blur\"\n\t\t\t\t\t\t>{spiceLabel[t.spiceLevel] ?? t.spiceLevel}</span\n\t\t\t\t\t>\n\t\t\t\t\t<!-- \"1–1 players\" is what a party game's seat count decays into once\n\t\t\t\t\t\t there's only ever one of you. Dropped; tone is guarded too because\n\t\t\t\t\t\t the generator stopped writing it. -->\n\t\t\t\t</div>\n\t\t\t\t<h1\n\t\t\t\t\tclass=\"mt-3 font-display text-[clamp(2rem,5.5vw,3.5rem)] leading-[0.95] font-bold tracking-[-0.02em] text-white\"\n\t\t\t\t>\n\t\t\t\t\t{t.title}\n\t\t\t\t</h1>\n\t\t\t\t{#if t.tagline}\n\t\t\t\t\t<p class=\"mt-2 max-w-2xl text-sm text-white/75 md:text-base\">{t.tagline}</p>\n\t\t\t\t{/if}\n\t\t\t\t<div class=\"mt-3 flex flex-wrap items-center gap-4 text-[12px] text-white/60\">\n\t\t\t\t\t{#if data.creatorNickname}\n\t\t\t\t\t\t<a href=\"/u/{data.creatorNickname}\" class=\"font-mono tracking-wide text-white/70 no-underline hover:text-white\"\n\t\t\t\t\t\t\t>by @{data.creatorNickname}</a\n\t\t\t\t\t\t>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if t.reviewCount > 0}\n\t\t\t\t\t\t<span class=\"font-semibold text-yellow\">★ {t.ratingAvg.toFixed(1)}</span>\n\t\t\t\t\t\t<span>{t.reviewCount} review{t.reviewCount === 1 ? '' : 's'}</span>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if t.playCount > 0}<span>{t.playCount} plays</span>{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</section>\n\n\t<div class=\"mx-auto grid w-full max-w-5xl gap-8 px-5 md:px-6 lg:grid-cols-[1fr_320px]\">\n\t\t<!-- LEFT: content -->\n\t\t<div class=\"flex flex-col gap-10 pt-8\">\n\t\t\t{#if !t.isCharacter && data.liveSessions.length}\n\t\t\t\t<section>\n\t\t\t\t\t<div class=\"mb-3 flex items-center gap-2\">\n\t\t\t\t\t\t<span class=\"h-2 w-2 rounded-full bg-green\"></span>\n\t\t\t\t\t\t<h2 class=\"font-display text-lg font-bold\">live now</h2>\n\t\t\t\t\t\t<span class=\"font-mono text-[11px] text-muted\">· jump into a running game</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid grid-cols-1 gap-3\">\n\t\t\t\t\t\t{#each data.liveSessions as s (s.code)}\n\t\t\t\t\t\t\t<RpLiveCard session={s} />\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t{/if}\n\n\t\t\t<section>\n\t\t\t\t<h2 class=\"mb-2 font-display text-lg font-bold\">the scene</h2>\n\t\t\t\t<p class=\"text-sm leading-relaxed whitespace-pre-line text-muted\">{t.setting}</p>\n\t\t\t</section>\n\n\t\t\t<!-- RAT-463: a migrated template describes a character; anything still on\n\t\t\t\t the old shape falls back to its game master. -->\n\t\t\t{#if t.isCharacter}\n\t\t\t\t<section>\n\t\t\t\t\t<h2 class=\"mb-2 font-display text-lg font-bold\">who you're texting</h2>\n\t\t\t\t\t<p class=\"text-sm leading-relaxed whitespace-pre-line text-muted\">{t.character}</p>\n\t\t\t\t</section>\n\n\t\t\t\t{#if t.you}\n\t\t\t\t\t<section>\n\t\t\t\t\t\t<h2 class=\"mb-2 font-display text-lg font-bold\">who you are</h2>\n\t\t\t\t\t\t<p class=\"text-sm leading-relaxed whitespace-pre-line text-muted\">{t.you}</p>\n\t\t\t\t\t</section>\n\t\t\t\t{/if}\n\t\t\t{:else}\n\t\t\t\t<section>\n\t\t\t\t\t<h2 class=\"mb-2 font-display text-lg font-bold\">your game master</h2>\n\t\t\t\t\t<p class=\"text-sm leading-relaxed whitespace-pre-line text-muted\">{t.gmPersona}</p>\n\t\t\t\t</section>\n\t\t\t{/if}\n\n\t\t\t{#if !t.isCharacter && t.roles.length}\n\t\t\t\t<section>\n\t\t\t\t\t<h2 class=\"mb-3 font-display text-lg font-bold\">roles</h2>\n\t\t\t\t\t<div class=\"grid gap-3 sm:grid-cols-2\">\n\t\t\t\t\t\t{#each t.roles as role (role.key)}\n\t\t\t\t\t\t\t<div class=\"rounded-xl border border-border bg-surface p-4\">\n\t\t\t\t\t\t\t\t<h3 class=\"font-display text-[15px] font-bold text-text\">{role.name}</h3>\n\t\t\t\t\t\t\t\t{#if role.blurb}<p class=\"mt-1 text-[13px] leading-snug text-muted\">{role.blurb}</p>{/if}\n\t\t\t\t\t\t\t\t{#if t.stats.length}\n\t\t\t\t\t\t\t\t\t<div class=\"mt-3 flex flex-wrap gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t{#each t.stats as stat (stat)}\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"rounded bg-surface-2 px-2 py-0.5 text-[10px] text-muted\">\n\t\t\t\t\t\t\t\t\t\t\t\t{stat} {role.startStats?.[stat] ?? 0}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t\t</div>\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{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t{/if}\n\n\t\t\t{#if t.samples.length}\n\t\t\t\t<section>\n\t\t\t\t\t<h2 class=\"mb-1 font-display text-lg font-bold\">a taste of it</h2>\n\t\t\t\t\t<p class=\"mb-3 text-[12px] text-muted\">a few beats the game master cooked up. this is what you're signing up for.</p>\n\t\t\t\t\t<div class=\"flex flex-col gap-3\">\n\t\t\t\t\t\t{#each t.samples as sample, i (i)}\n\t\t\t\t\t\t\t<div class=\"rounded-xl border border-border bg-surface p-4\">\n\t\t\t\t\t\t\t\t<p class=\"text-sm leading-relaxed text-text\">{sample.narration}</p>\n\t\t\t\t\t\t\t\t{#if sample.actionPrompt}\n\t\t\t\t\t\t\t\t\t<p class=\"mt-3 border-l-2 border-purple pl-3 text-[13px] text-purple\">\n\t\t\t\t\t\t\t\t\t\t{sample.actionPrompt}\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{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t{/if}\n\n\t\t\t<!-- REVIEWS -->\n\t\t\t<section>\n\t\t\t\t<h2 class=\"mb-3 font-display text-lg font-bold\">\n\t\t\t\t\treviews {#if t.reviewCount > 0}<span class=\"text-muted\">· ★ {t.ratingAvg.toFixed(1)}</span>{/if}\n\t\t\t\t</h2>\n\n\t\t\t\t{#if owns && !data.isCreator}\n\t\t\t\t\t<div class=\"mb-5 rounded-xl border border-border bg-surface p-4\">\n\t\t\t\t\t\t<p class=\"mb-2 text-[13px] font-semibold text-text\">\n\t\t\t\t\t\t\t{data.myReview ? 'change your verdict' : 'you played it. judge it.'}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div class=\"mb-3 flex gap-1\">\n\t\t\t\t\t\t\t{#each [1, 2, 3, 4, 5] as n (n)}\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\tclass=\"text-2xl leading-none transition-colors {(hoverRating || myRating) >= n\n\t\t\t\t\t\t\t\t\t\t? 'text-yellow'\n\t\t\t\t\t\t\t\t\t\t: 'text-border'}\"\n\t\t\t\t\t\t\t\t\tonclick={() => (myRating = n)}\n\t\t\t\t\t\t\t\t\tonmouseenter={() => (hoverRating = n)}\n\t\t\t\t\t\t\t\t\tonmouseleave={() => (hoverRating = 0)}\n\t\t\t\t\t\t\t\t\taria-label=\"{n} star{n === 1 ? '' : 's'}\">★</button\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tbind:value={myBody}\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\tmaxlength=\"1500\"\n\t\t\t\t\t\t\tplaceholder=\"how did it go? spare no one. (optional)\"\n\t\t\t\t\t\t\tclass=\"w-full resize-y rounded-lg border border-border bg-bg px-3 py-2 text-sm text-text placeholder:text-muted focus:border-purple focus:outline-none\"\n\t\t\t\t\t\t></textarea>\n\t\t\t\t\t\t<div class=\"mt-2 flex items-center gap-3\">\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\tclass=\"rounded-lg bg-purple px-4 py-2 text-[13px] font-bold text-white disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonclick={submitReview}\n\t\t\t\t\t\t\t\tdisabled={reviewBusy || myRating < 1}>{reviewBusy ? 'saving…' : 'post it'}</button\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#if reviewMsg}<span class=\"text-[12px] text-green\">{reviewMsg}</span>{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\n\t\t\t\t{#if data.reviews.length}\n\t\t\t\t\t<div class=\"flex flex-col gap-3\">\n\t\t\t\t\t\t{#each data.reviews as r (r.id)}\n\t\t\t\t\t\t\t<div class=\"rounded-xl border border-border bg-surface p-4\">\n\t\t\t\t\t\t\t\t<div class=\"flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t\t\t<span class=\"font-mono text-[12px] tracking-wide text-text\"\n\t\t\t\t\t\t\t\t\t\t>@{r.reviewerNickname ?? 'anon'}</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"text-yellow\">{'★'.repeat(r.rating)}<span class=\"text-border\">{'★'.repeat(5 - r.rating)}</span></span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{#if r.body}<p class=\"mt-2 text-[13px] leading-snug text-muted\">{r.body}</p>{/if}\n\t\t\t\t\t\t\t\t<p class=\"mt-2 text-[10px] text-muted/60\">{fmtDate(r.createdAt)}</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<p class=\"text-[13px] text-muted\">no reviews yet. {owns ? 'go on, be the first.' : 'unlock it if you want a say.'}</p>\n\t\t\t\t{/if}\n\t\t\t</section>\n\t\t</div>\n\n\t\t<!-- RIGHT: sticky unlock panel — first on mobile so the CTA is up top -->\n\t\t<aside class=\"order-first lg:order-none lg:pt-8\">\n\t\t\t<div class=\"lg:sticky lg:top-24\">\n\t\t\t\t<div class=\"rounded-2xl border border-border bg-surface p-5\">\n\t\t\t\t\t<div class=\"flex items-baseline justify-between\">\n\t\t\t\t\t\t<span class=\"inline-flex items-center gap-1.5 font-display text-2xl font-bold text-text\">\n\t\t\t\t\t\t\t{#if t.isFree}free{:else}{t.priceTokens}<TokenCoin size={20} />{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{#if owns && !t.isFree}\n\t\t\t\t\t\t\t<span class=\"text-[11px] font-semibold text-green\">unlocked</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"mt-4 flex flex-col gap-2\">\n\t\t\t\t\t\t<!-- RAT-463: a migrated character opens its thread. The old CTA ran\n\t\t\t\t\t\t\t matchmaking, so pressing it on a character started a legacy\n\t\t\t\t\t\t\t multiplayer lobby instead of the conversation. -->\n\t\t\t\t\t\t{#if data.isCreator}\n\t\t\t\t\t\t\t{#if t.isCharacter}\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref=\"/roleplay/c/{t.slug}\"\n\t\t\t\t\t\t\t\t\tclass=\"w-full rounded-xl bg-purple px-4 py-3 text-center text-sm font-bold text-white no-underline\"\n\t\t\t\t\t\t\t\t\t>start chatting</a\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{:else}\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\tclass=\"w-full rounded-xl bg-purple px-4 py-3 text-sm font-bold text-white disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\tonclick={play}\n\t\t\t\t\t\t\t\t\tdisabled={busy}>{busy ? 'starting…' : 'start a game'}</button\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"/roleplay/{t.slug}/edit\"\n\t\t\t\t\t\t\t\tclass=\"w-full rounded-xl border border-border bg-surface-2 px-4 py-3 text-center text-sm font-semibold text-text no-underline\"\n\t\t\t\t\t\t\t\t>edit</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t{:else if owns || t.isFree}\n\t\t\t\t\t\t\t{#if t.isCharacter}\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref=\"/roleplay/c/{t.slug}\"\n\t\t\t\t\t\t\t\t\tclass=\"w-full rounded-xl bg-purple px-4 py-3 text-center text-sm font-bold text-white no-underline\"\n\t\t\t\t\t\t\t\t\t>start chatting</a\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{:else}\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\tclass=\"w-full rounded-xl bg-purple px-4 py-3 text-sm font-bold text-white disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\tonclick={play}\n\t\t\t\t\t\t\t\t\tdisabled={busy}>{busy ? 'starting…' : 'start a game'}</button\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{:else}\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\tclass=\"inline-flex w-full items-center justify-center gap-1.5 rounded-xl bg-purple px-4 py-3 text-sm font-bold text-white disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonclick={unlock}\n\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t>{#if busy}unlocking…{:else}unlock — {t.priceTokens}<TokenCoin size={15} />{/if}</button\n\t\t\t\t\t\t\t>\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={shareStory}\n\t\t\t\t\t\t\tclass=\"inline-flex w-full items-center justify-center gap-1.5 rounded-xl border border-border bg-surface-2 px-4 py-3 text-sm font-semibold text-text transition-colors hover:border-white/20\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t><path\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\td=\"M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M16 6l-4-4-4 4M12 2v13\"\n\t\t\t\t\t\t\t\t/></svg\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{shareState === 'shared'\n\t\t\t\t\t\t\t\t? 'shared ✓'\n\t\t\t\t\t\t\t\t: shareState === 'copied'\n\t\t\t\t\t\t\t\t\t? 'link copied ✓'\n\t\t\t\t\t\t\t\t\t: 'share'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{#if errorMsg}<p class=\"text-[12px] text-coral\">{errorMsg}</p>{/if}\n\t\t\t\t\t\t{#if finishing === 'waiting'}\n\t\t\t\t\t\t\t<p class=\"text-[12px] text-muted-2\" role=\"status\">finishing your purchase…</p>\n\t\t\t\t\t\t{:else if finishing === 'late'}\n\t\t\t\t\t\t\t<p class=\"text-[12px] text-muted-2\" role=\"status\">\n\t\t\t\t\t\t\t\tyour tokens are on the way — it unlocks by itself the moment they land.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t<!-- RAT-535: not buying? free ones like it, one tap away. -->\n\t\t\t\t\t\t{#if hitWall && data.freeLike.length > 0 && !owns}\n\t\t\t\t\t\t\t<div class=\"mt-2 min-w-0 border-t border-border pt-3\">\n\t\t\t\t\t\t\t\t<p class=\"text-[12px] font-semibold text-text\">or start with a free one like it</p>\n\t\t\t\t\t\t\t\t<div class=\"mt-2 flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t{#each data.freeLike as f (f.slug)}\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref={resolve('/roleplay/[slug]', { slug: f.slug })}\n\t\t\t\t\t\t\t\t\t\t\tclass=\"flex min-w-0 items-center gap-3 rounded-xl bg-surface-2 p-2 no-underline\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{#if f.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t<img src={f.imageUrl} alt=\"\" class=\"h-10 w-10 shrink-0 rounded-lg object-cover\" />\n\t\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"h-10 w-10 shrink-0 rounded-lg bg-surface\"></span>\n\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"line-clamp-1 text-[13px] font-semibold break-all text-text\">{f.title}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{#if f.tagline}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"line-clamp-1 text-[11px] break-all text-muted\">{f.tagline}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"shrink-0 text-[11px] font-semibold text-green\">free</span>\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t</div>\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\n\t\t\t\t\t<p class=\"mt-4 text-[11px] leading-relaxed text-muted\">\n\t\t\t\t\t\t{#if data.isCreator}\n\t\t\t\t\t\t\t{t.isFree\n\t\t\t\t\t\t\t\t? 'your world, free for everyone.'\n\t\t\t\t\t\t\t\t: `your world. every unlock pays you ${payoutUsd(t.priceTokens)}.`}\n\t\t\t\t\t\t{:else if t.isFree}\n\t\t\t\t\t\t\t{t.isCharacter ? 'free. open the thread and start talking.' : 'free. start a room, drag your group in, let the chaos run.'}\n\t\t\t\t\t\t{:else if owns}\n\t\t\t\t\t\t\tit's yours — run it as many times as your friends can stomach.\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\tunlock once, replay forever. every unlock pays its creator.\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t{#if t.tags.length}\n\t\t\t\t\t\t<div class=\"mt-4 flex flex-wrap gap-1.5 border-t border-border pt-4\">\n\t\t\t\t\t\t\t{#each t.tags as tag (tag.slug)}\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref=\"/roleplay?tag={tag.slug}\"\n\t\t\t\t\t\t\t\t\tclass=\"rounded-full bg-surface-2 px-2.5 py-1 text-[11px] text-muted no-underline hover:text-text\"\n\t\t\t\t\t\t\t\t\t>{tag.label}</a\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</aside>\n\t</div>\n</main>\n\n<!-- RAT-535: the buy sheet for a paid character; back here, the unlock finishes. -->\n<BuyTokensModal\n\topen={showBuy}\n\tonclose={() => (showBuy = false)}\n\treason={`${t.title} is ${t.priceTokens} tokens — top up and it unlocks.`}\n\tsuccessPath={`/roleplay/${t.slug}?unlock=1`}\n\tsource=\"rp_unlock\"\n/>\n"],"version":3}