{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4cbd-7761-b9ac-e376402fa228","file":"162.Cji1cuu5.mjs","mappings":"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","names":["isLoggedIn","viewerId","$.prop","$$props","isMine","$.derived","busy","$.state","detailHref","cardHref","$.get","quickStart","e","goto","$.set","res","body","onCardClick","article","root","a","$.child","span","img","root_1","$.set_attribute","$.append","$$anchor","span_1","root_2","span_2","RpMonogram","node_1","$$render","consequent","alternate","span_3","root_3","consequent_1","span_4","root_4","consequent_2","span_5","span_6","span_7","span_8","root_5","consequent_3","span_9","root_6","consequent_4","span_10","$.sibling","node_5","span_11","$.first_child","fragment","span_12","consequent_5","span_13","node_6","span_14","root_8","span_15","root_9","TokenCoin","consequent_6","alternate_1","span_16","root_10","consequent_7","consequent_8","$.reset","div","node_11","a_1","root_12","$.template_effect","consequent_9","a_2","root_13","consequent_10","$.delegated","uid","$.props_id","size","svg","defs","linearGradient","path","styles","flame","scroller","canLeft","canRight","updateEdges","page","dir","onMount","$.user_effect","section","div_1","h2","RpFlame","p","div_2","button","button_1","div_3","$.each","item","div_4","RpMarketCard","node_3","$$value","classes","$.event","cards","READY","r","HOUSE","h","SCENARIOS","entered","to","trackVoiceSession","event_handler","c","$0","$.set_text","text","housePortrait","$$args","query","mineOnly","myCount","i","sort","tag","topTags","n","t","b","ago","iso","m","bySlug","pick","slugs","s","hottest","newest","trending","filtered","q","sorted","GRID_CHUNK","visibleCount","visible","gridSentinel","io","entries","characterCount","totalGames","SORT_OPTIONS","sortMenuOpen","sortMenuEl","sortLabel","o","selectSort","value","activeMode","onDocClick","onKey","scrollToGames","main","section_1","text_2","node","RpSessionsRail","node_2","RpCarousel","node_4","section_2","div_5","div_6","input","$.remove_input_defaults","div_7","node_7","div_8","button_2","root_7","text_7","svg_1","div_9","button_3","node_10","button_4","div_10","node_9","div_11","section_3","div_12","step","div_13","root_14","h3","p_1","text_9","text_10","text_11","Footer","node_14","$.set_class"],"sources":["../../../../../../src/lib/components/roleplay/RpMarketCard.svelte","../../../../../../src/lib/components/roleplay/RpFlame.svelte","../../../../../../src/lib/components/roleplay/RpCarousel.svelte","../../../../../../src/lib/components/roleplay/RpSessionsRail.svelte","../../../../../../src/routes/roleplay/+page.svelte"],"sourcesContent":["<script lang=\"ts\">\n\t/**\n\t * Marketplace card: picture on top (4:5), title / tagline / meta under it.\n\t * (2026-10 redesign — the earlier version put everything on a gradient over\n\t * the cover, which hid faces and left art-less characters as a giant ghost\n\t * letter.) Previous note:\n\t * Portrait-cover marketplace card. The old card spent a 16:10 cover strip +\n\t * body + button row (~420px tall) on every character while 87% of them have\n\t * no artwork — the cover was an empty placeholder most of the time. Here the\n\t * cover IS the card (3:4), all the info sits on a bottom gradient overlay,\n\t * and characters without art get their monogram tone full-bleed instead of\n\t * a shared sparkle. Half the height, same information.\n\t */\n\timport { goto } from '$app/navigation';\n\timport type { MarketplaceItem } from '$lib/roleplay/types';\n\timport TokenCoin from '$lib/components/TokenCoin.svelte';\n\timport RpMonogram from './RpMonogram.svelte';\n\n\tlet {\n\t\titem,\n\t\tisLoggedIn = false,\n\t\tviewerId = null\n\t}: { item: MarketplaceItem; isLoggedIn?: boolean; viewerId?: string | null } = $props();\n\n\t// RAT-463: your own characters get an edit shortcut. There was no route back\n\t// into one you'd published — 136 of 421 templates were drafts nobody could\n\t// reach again.\n\tconst isMine = $derived(!!viewerId && item.creatorId === viewerId);\n\n\tlet busy = $state(false);\n\n\t// RAT-463: a migrated character has no lobby to stage — tapping it should drop\n\t// you straight into the conversation. Un-migrated worlds keep the old detail\n\t// page until they're converted.\n\tconst detailHref = $derived(\n\t\titem.isCharacter ? `/roleplay/c/${item.slug}` : `/roleplay/${item.slug}`\n\t);\n\n\t// The whole card is the primary action now (the old button row is gone):\n\t// chat for free/owned characters, the unlock page for paid ones you don't\n\t// own, the lobby detail for un-migrated worlds.\n\tconst cardHref = $derived(\n\t\titem.isCharacter && !item.isFree && !isMine ? `/roleplay/${item.slug}` : detailHref\n\t);\n\n\t// Instant-start straight from the card: matchmake into an open public lobby for\n\t// this world (or host a fresh one) and drop into /g/<code>. Any failure — not\n\t// logged in, paid + not owned, network — falls back to the detail page where\n\t// the full unlock / sign-in flow lives, so the card never dead-ends.\n\tasync function quickStart(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tif (busy) return;\n\t\tif (!isLoggedIn) return goto(`/roleplay/${item.slug}`);\n\t\tbusy = true;\n\t\ttry {\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: item.id })\n\t\t\t});\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (res.ok && body.code) {\n\t\t\t\tawait goto(`/g/${body.code}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait goto(`/roleplay/${item.slug}`);\n\t\t} catch {\n\t\t\tawait goto(`/roleplay/${item.slug}`);\n\t\t} finally {\n\t\t\tbusy = false;\n\t\t}\n\t}\n\n\tfunction onCardClick(e: MouseEvent) {\n\t\tif (!item.isCharacter && item.isFree) quickStart(e);\n\t}\n\n</script>\n\n<article class=\"group relative\">\n\t<!-- preload off: the character page's server load creates the chat session,\n\t\t so the global tap-preload turned every touched (even scroll-cancelled)\n\t\t card into a ghost session in the inbox. Load only on real navigation. -->\n\t<a\n\t\thref={cardHref}\n\t\tonclick={onCardClick}\n\t\tdata-sveltekit-preload-data=\"off\"\n\t\tclass=\"flex flex-col gap-2.5 no-underline\"\n\t>\n\t\t<!-- the picture on top, everything else under it: a character without\n\t\t\t art still looks finished, and nothing covers a face -->\n\t\t<span class=\"relative block aspect-[4/5] overflow-hidden rounded-2xl bg-[#1c1a24]\">\n\t\t\t{#if item.cardImageUrl}\n\t\t\t\t<img\n\t\t\t\t\tsrc={item.cardImageUrl}\n\t\t\t\t\talt={item.title}\n\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\tclass=\"absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-[1.04]\"\n\t\t\t\t/>\n\t\t\t{:else}\n\t\t\t\t<span class=\"absolute inset-0 flex items-center justify-center\">\n\t\t\t\t\t<span class=\"block h-16 w-16 overflow-hidden rounded-full text-[1.4rem]\"><RpMonogram name={item.title} seed={item.slug} /></span>\n\t\t\t\t</span>\n\t\t\t{/if}\n\t\t\t{#if item.spiceLevel === 'explicit'}\n\t\t\t\t<span class=\"absolute top-2.5 left-2.5 rounded-md bg-black/55 px-1.5 py-0.5 text-[10px] font-bold text-white/90\">18+</span>\n\t\t\t{/if}\n\t\t\t{#if busy}\n\t\t\t\t<span class=\"absolute inset-0 flex items-center justify-center bg-black/50 text-[12px] font-semibold text-white\">starting…</span>\n\t\t\t{/if}\n\t\t</span>\n\n\t\t<span class=\"flex flex-col gap-1\">\n\t\t\t<span class=\"flex items-baseline justify-between gap-2\">\n\t\t\t\t<span class=\"line-clamp-1 text-[15px] font-semibold text-text\">{item.title}</span>\n\t\t\t\t{#if item.reviewCount > 0}\n\t\t\t\t\t<span class=\"shrink-0 text-[12px] font-semibold text-yellow\">★ {item.ratingAvg.toFixed(1)}</span>\n\t\t\t\t{/if}\n\t\t\t</span>\n\t\t\t{#if item.tagline}\n\t\t\t\t<span class=\"line-clamp-2 text-[13px] leading-snug text-[#a3a3a3]\">{item.tagline}</span>\n\t\t\t{/if}\n\t\t\t<span class=\"flex items-center gap-1.5 text-[12px] text-[#8a8a8a]\">\n\t\t\t\t{#if item.playerCount > 0}<span><span class=\"text-[#d4d4d4]\">{item.playerCount.toLocaleString('en-US')}</span> played</span><span aria-hidden=\"true\">·</span>{/if}\n\t\t\t\t<span>{item.tone}</span>\n\t\t\t\t<span aria-hidden=\"true\">·</span>\n\t\t\t\t{#if item.isFree}<span>free</span>{:else}<span class=\"inline-flex items-center gap-1 font-semibold text-[#c4b5fd]\">{item.priceTokens}<TokenCoin size={11} /></span>{/if}\n\t\t\t</span>\n\t\t\t{#if !item.isCharacter}\n\t\t\t\t<span class=\"font-mono text-[9px] tracking-wide text-white/40 uppercase\">\n\t\t\t\t\t{item.minPlayers}–{item.maxPlayers}P · {item.roleCount} roles{#if item.sessionCount > 0} · {item.sessionCount} games{/if}\n\t\t\t\t</span>\n\t\t\t{/if}\n\t\t</span>\n\t</a>\n\n\t<!-- corner chips: routes the overlay card can't carry inline. \"view\" opens the\n\t\t character's page (reviews, creator — the thing that tells you whether you\n\t\t want to talk to them); \"edit\" only on your own. Desktop reveals on hover,\n\t\t touch always shows them — hover never comes on a phone. -->\n\t<div\n\t\tclass=\"absolute top-2.5 right-2.5 flex flex-col gap-1.5 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:group-focus-within:opacity-100\"\n\t>\n\t\t{#if item.isCharacter}\n\t\t\t<a\n\t\t\t\thref=\"/roleplay/{item.slug}\"\n\t\t\t\taria-label=\"view this character's page\"\n\t\t\t\tclass=\"flex h-7 w-7 items-center justify-center rounded-full bg-black/55 text-white/75 no-underline backdrop-blur transition-colors hover:bg-black/75 hover:text-white\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"h-3.5 w-3.5\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"9\" />\n\t\t\t\t\t<path stroke-linecap=\"round\" d=\"M12 11v5M12 8v.5\" />\n\t\t\t\t</svg>\n\t\t\t</a>\n\t\t{/if}\n\t\t{#if isMine}\n\t\t\t<a\n\t\t\t\thref=\"/roleplay/{item.slug}/edit\"\n\t\t\t\taria-label=\"edit this character\"\n\t\t\t\tclass=\"flex h-7 w-7 items-center justify-center rounded-full bg-black/55 text-white/75 no-underline backdrop-blur transition-colors hover:bg-black/75 hover:text-white\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"h-3.5 w-3.5\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\td=\"M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</a>\n\t\t{/if}\n\t</div>\n</article>\n","<script lang=\"ts\">\n\t/**\n\t * Small animated flame for section headings (the \"hottest\" rail). Pure CSS\n\t * flicker on an inline SVG — no canvas, no colored glow (design rules), and\n\t * it holds still under prefers-reduced-motion.\n\t */\n\tlet { size = 22 }: { size?: number } = $props();\n\n\t// Gradient defs need a document-unique id; $props.id() is hydration-safe.\n\tconst uid = $props.id();\n</script>\n\n<span class=\"flame\" style:width=\"{size}px\" style:height=\"{size}px\" aria-hidden=\"true\">\n\t<svg viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t<defs>\n\t\t\t<linearGradient id=\"{uid}-body\" x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t\t<stop offset=\"0\" stop-color=\"#f97316\" />\n\t\t\t\t<stop offset=\"1\" stop-color=\"#ff4d6d\" />\n\t\t\t</linearGradient>\n\t\t</defs>\n\t\t<path\n\t\t\tclass=\"body\"\n\t\t\tfill=\"url(#{uid}-body)\"\n\t\t\td=\"M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36C5.21 7.51 4 10.62 4 14c0 4.42 3.58 8 8 8s8-3.58 8-8C20 8.61 17.41 3.8 13.5.67z\"\n\t\t/>\n\t\t<path\n\t\t\tclass=\"core\"\n\t\t\tfill=\"#ffd27a\"\n\t\t\td=\"M12 12.9c-2.13 2.6-1.5 5.05.3 6.4.87.65 2.2.65 3.07 0 1.8-1.35 2.43-3.8.3-6.4l-1.83-2.3-1.84 2.3z\"\n\t\t/>\n\t</svg>\n</span>\n\n<style>\n\t.flame {\n\t\tdisplay: inline-flex;\n\t\tflex-shrink: 0;\n\t}\n\tsvg {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: visible;\n\t}\n\t.body,\n\t.core {\n\t\ttransform-box: view-box;\n\t\ttransform-origin: 50% 95%;\n\t}\n\t.body {\n\t\tanimation: flame-body 1.4s ease-in-out infinite;\n\t}\n\t.core {\n\t\tanimation: flame-core 0.9s ease-in-out infinite;\n\t}\n\t@keyframes flame-body {\n\t\t0%,\n\t\t100% {\n\t\t\ttransform: scale(1, 1) rotate(0deg);\n\t\t}\n\t\t25% {\n\t\t\ttransform: scale(0.96, 1.06) rotate(-1.6deg);\n\t\t}\n\t\t50% {\n\t\t\ttransform: scale(1.04, 0.95) rotate(1.2deg);\n\t\t}\n\t\t75% {\n\t\t\ttransform: scale(0.98, 1.04) rotate(-0.8deg);\n\t\t}\n\t}\n\t@keyframes flame-core {\n\t\t0%,\n\t\t100% {\n\t\t\ttransform: scale(1) translateY(0);\n\t\t\topacity: 0.95;\n\t\t}\n\t\t30% {\n\t\t\ttransform: scale(1.12, 0.88) translateY(0.6px);\n\t\t\topacity: 0.8;\n\t\t}\n\t\t60% {\n\t\t\ttransform: scale(0.92, 1.1) translateY(-0.5px);\n\t\t\topacity: 1;\n\t\t}\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.body,\n\t\t.core {\n\t\t\tanimation: none;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * RAT-463: a horizontal rail above the grid.\n\t *\n\t * The grid is 310 characters in one undifferentiated wall and 88% of opened\n\t * threads never get a message — nothing on a card tells you which ones are\n\t * worth talking to. The rail answers that by *selection*: what's on the shelf\n\t * is the claim, so the card itself needs no extra badge arguing for it.\n\t *\n\t * It renders the same card as the grid rather than a slimmed-down twin. A\n\t * second card meant a second set of numbers to keep honest, and the first\n\t * attempt at one showed a percentage nobody could scale and a depth figure\n\t * computed from four people.\n\t *\n\t * The cut edge is deliberate UI, not an accident: the overflowing side fades\n\t * out (mask) and the header carries pager arrows, so \"there's more\" reads as\n\t * an affordance instead of a clipped row.\n\t */\n\timport { onMount } from 'svelte';\n\timport type { MarketplaceItem } from '$lib/roleplay/types';\n\timport RpMarketCard from './RpMarketCard.svelte';\n\timport RpFlame from './RpFlame.svelte';\n\n\tlet {\n\t\ttitle,\n\t\tblurb,\n\t\titems,\n\t\tisLoggedIn = false,\n\t\tviewerId = null,\n\t\tflame = false\n\t}: {\n\t\ttitle: string;\n\t\tblurb: string;\n\t\titems: MarketplaceItem[];\n\t\tisLoggedIn?: boolean;\n\t\tviewerId?: string | null;\n\t\t/** burn a little animated flame in front of the title (the \"hottest\" rail). */\n\t\tflame?: boolean;\n\t} = $props();\n\n\tlet scroller = $state<HTMLDivElement>();\n\tlet canLeft = $state(false);\n\tlet canRight = $state(false);\n\n\tfunction updateEdges() {\n\t\tif (!scroller) return;\n\t\tcanLeft = scroller.scrollLeft > 4;\n\t\tcanRight = scroller.scrollLeft < scroller.scrollWidth - scroller.clientWidth - 4;\n\t}\n\n\tfunction page(dir: 1 | -1) {\n\t\tscroller?.scrollBy({ left: dir * scroller.clientWidth * 0.9, behavior: 'smooth' });\n\t}\n\n\tonMount(updateEdges);\n\t// items can land after mount (client nav) — recheck whether the rail overflows.\n\t$effect(() => {\n\t\tvoid items.length;\n\t\tupdateEdges();\n\t});\n</script>\n\n<svelte:window onresize={updateEdges} />\n\n{#if items.length}\n\t<section class=\"rail\">\n\t\t<div class=\"rail-head\">\n\t\t\t<div class=\"rail-titles\">\n\t\t\t\t<h2>\n\t\t\t\t\t{#if flame}<RpFlame size={22} />{/if}\n\t\t\t\t\t{title}\n\t\t\t\t</h2>\n\t\t\t\t<p>{blurb}</p>\n\t\t\t</div>\n\t\t\t{#if canLeft || canRight}\n\t\t\t\t<div class=\"rail-pager\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label=\"scroll {title} back\"\n\t\t\t\t\t\tdisabled={!canLeft}\n\t\t\t\t\t\tonclick={() => page(-1)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m14.5 6-6 6 6 6\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label=\"scroll {title} forward\"\n\t\t\t\t\t\tdisabled={!canRight}\n\t\t\t\t\t\tonclick={() => page(1)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m9.5 6 6 6-6 6\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"rail-scroll\"\n\t\t\tclass:can-left={canLeft}\n\t\t\tclass:can-right={canRight}\n\t\t\tbind:this={scroller}\n\t\t\tonscroll={updateEdges}\n\t\t>\n\t\t\t{#each items as item (item.slug)}\n\t\t\t\t<div class=\"slot\">\n\t\t\t\t\t<RpMarketCard {item} {isLoggedIn} {viewerId} />\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t</section>\n{/if}\n\n<style>\n\t.rail {\n\t\tmargin-bottom: 30px;\n\t}\n\t.rail-head {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tjustify-content: space-between;\n\t\tgap: 16px;\n\t\tmargin-bottom: 12px;\n\t}\n\t.rail-titles h2 {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 22px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.01em;\n\t\tcolor: var(--color-text);\n\t}\n\t.rail-titles p {\n\t\tmargin-top: 2px;\n\t\tfont-size: 13px;\n\t\tcolor: var(--color-muted);\n\t}\n\n\t.rail-pager {\n\t\tdisplay: flex;\n\t\tgap: 6px;\n\t\tflex-shrink: 0;\n\t}\n\t.rail-pager button {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 9999px;\n\t\tborder: 1px solid var(--color-border);\n\t\tbackground: var(--color-surface);\n\t\tcolor: var(--color-text);\n\t\ttransition:\n\t\t\tborder-color 0.15s,\n\t\t\topacity 0.15s;\n\t}\n\t.rail-pager button:hover:not(:disabled) {\n\t\tborder-color: rgba(255, 255, 255, 0.2);\n\t}\n\t.rail-pager button:disabled {\n\t\topacity: 0.3;\n\t}\n\t.rail-pager svg {\n\t\twidth: 15px;\n\t\theight: 15px;\n\t}\n\n\t.rail-scroll {\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t\talign-items: stretch;\n\t\toverflow-x: auto;\n\t\tscroll-snap-type: x proximity;\n\t\t/* Left edge sits flush with the section title; only the right side bleeds\n\t\t   into the container padding. The fade masks below turn that cut edge into\n\t\t   a deliberate \"more this way\" signal instead of a clipped row. */\n\t\tmargin: 0 -20px 0 0;\n\t\tpadding: 6px 20px 10px 0;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tscrollbar-width: none;\n\t\t--fade-l: 0px;\n\t\t--fade-r: 0px;\n\t\t-webkit-mask-image: linear-gradient(\n\t\t\t90deg,\n\t\t\ttransparent 0,\n\t\t\t#000 var(--fade-l),\n\t\t\t#000 calc(100% - var(--fade-r)),\n\t\t\ttransparent 100%\n\t\t);\n\t\tmask-image: linear-gradient(\n\t\t\t90deg,\n\t\t\ttransparent 0,\n\t\t\t#000 var(--fade-l),\n\t\t\t#000 calc(100% - var(--fade-r)),\n\t\t\ttransparent 100%\n\t\t);\n\t}\n\t.rail-scroll.can-left {\n\t\t--fade-l: 36px;\n\t}\n\t.rail-scroll.can-right {\n\t\t--fade-r: 52px;\n\t}\n\t.rail-scroll::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\n\t.slot {\n\t\tflex: 0 0 auto;\n\t\twidth: 210px;\n\t\tmax-width: 55vw;\n\t\tscroll-snap-align: start;\n\t\tdisplay: flex;\n\t}\n\t.slot > :global(*) {\n\t\twidth: 100%;\n\t}\n</style>\n","<!-- Guided sessions, offered where people already talk to AI characters.\n\n     A session is the other way round from a roleplay: she leads, in her voice\n     and on screen, and you mostly listen. So it is a rail of its own under what\n     you were doing, not a fourth button beside \"Talk 1:1\" — whose purple is this\n     page's one accent and stays its one accent.\n\n     The three are the studio's ready-to-play sessions (READY in the session's\n     shared.ts): a tap opens that one, set up, in the studio on PornPilot, and it\n     waits for the press there. The same shape as the page's other rails\n     (RpCarousel): a 22px title, a line under it, 210px cards. -->\n<script lang=\"ts\">\n\timport { trackVoiceSession } from '$lib/analytics';\n\timport { HOUSE, READY, SCENARIOS, housePortrait } from '$lib/studio/session/shared';\n\n\tconst cards = READY.map((r) => ({\n\t\t...r,\n\t\thref: `/studio?session=${r.id}`,\n\t\tname: HOUSE.find((h) => h.id === r.her)?.name ?? '',\n\t\tkind: SCENARIOS[r.scenario].name\n\t}));\n\n\tconst entered = (to: string) => () => trackVoiceSession('entry', { from: 'roleplay', to });\n</script>\n\n<section class=\"rail\" aria-labelledby=\"rp-sessions\">\n\t<div class=\"rail-head\">\n\t\t<div class=\"rail-titles\">\n\t\t\t<h2 id=\"rp-sessions\">she leads.</h2>\n\t\t\t<p>10 or 20 minutes in her voice. you listen.</p>\n\t\t</div>\n\t\t<!-- The studio's address leaves ratemyd for PornPilot, so a full load. -->\n\t\t<a class=\"all\" href=\"/studio?session=1\" data-sveltekit-reload onclick={entered('home')}\n\t\t\t>all sessions<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"\n\t\t\t\t><path\n\t\t\t\t\td=\"m9.5 6 6 6-6 6\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2.2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t/></svg\n\t\t\t></a\n\t\t>\n\t</div>\n\t<div class=\"rail-scroll\">\n\t\t{#each cards as c (c.id)}\n\t\t\t<a class=\"card\" href={c.href} data-sveltekit-reload onclick={entered(c.id)}>\n\t\t\t\t<span class=\"pic\"><img src={housePortrait(c.her)} alt=\"\" loading=\"lazy\" /></span>\n\t\t\t\t<span class=\"t\">{c.title}</span>\n\t\t\t\t<span class=\"m\">{c.name} · {c.kind} · {c.minutes} min</span>\n\t\t\t</a>\n\t\t{/each}\n\t</div>\n</section>\n\n<style>\n\t.rail {\n\t\tmargin-bottom: 30px;\n\t}\n\t.rail-head {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tjustify-content: space-between;\n\t\tgap: 16px;\n\t\tmargin-bottom: 12px;\n\t}\n\t.rail-titles h2 {\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 22px;\n\t\tfont-weight: 700;\n\t\tletter-spacing: -0.02em;\n\t}\n\t.rail-titles p {\n\t\tmargin-top: 2px;\n\t\tfont-size: 13px;\n\t\tcolor: var(--color-muted);\n\t}\n\t.all {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tflex-shrink: 0;\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-muted);\n\t\ttext-decoration: none;\n\t\ttransition: color 0.15s;\n\t}\n\t.all:hover {\n\t\tcolor: var(--color-text);\n\t}\n\t.all svg {\n\t\twidth: 14px;\n\t\theight: 14px;\n\t}\n\t.rail-scroll {\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t\toverflow-x: auto;\n\t\tscroll-snap-type: x proximity;\n\t\tmargin: 0 -20px 0 0;\n\t\tpadding: 6px 20px 10px 0;\n\t\tscrollbar-width: none;\n\t}\n\t.rail-scroll::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\t.card {\n\t\tflex: 0 0 auto;\n\t\twidth: 210px;\n\t\tmax-width: 55vw;\n\t\tscroll-snap-align: start;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 3px;\n\t\tcolor: var(--color-text);\n\t\ttext-decoration: none;\n\t}\n\t.pic {\n\t\tdisplay: block;\n\t\taspect-ratio: 4 / 5;\n\t\tmargin-bottom: 7px;\n\t\toverflow: hidden;\n\t\tborder-radius: 18px;\n\t\tbackground: #141414;\n\t}\n\t.pic img {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tobject-fit: cover;\n\t\tobject-position: 50% 22%;\n\t\ttransition: transform 0.4s cubic-bezier(0.32, 0.72, 0, 1);\n\t}\n\t.card:hover .pic img {\n\t\ttransform: scale(1.03);\n\t}\n\t.t {\n\t\tfont-size: 15px;\n\t\tfont-weight: 600;\n\t}\n\t.m {\n\t\toverflow: hidden;\n\t\tfont-size: 13px;\n\t\tcolor: #a3a3a3;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.pic img {\n\t\t\ttransition: none;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport RpCarousel from '$lib/components/roleplay/RpCarousel.svelte';\n\timport RpSessionsRail from '$lib/components/roleplay/RpSessionsRail.svelte';\n\timport { onMount } from 'svelte';\n\timport { activeMode } from '$lib/stores/activeMode';\n\timport RpMarketCard from '$lib/components/roleplay/RpMarketCard.svelte';\n\timport Footer from '$lib/components/Footer.svelte';\n\timport RpMonogram from '$lib/components/roleplay/RpMonogram.svelte';\n\timport type { PageData } from './$types';\n\n\tlet { data }: { data: PageData } = $props();\n\n\tlet query = $state('');\n\t// RAT-463: creators had no way back to their own characters — the only route\n\t// in was remembering the slug. `delisted` already existed in the schema with\n\t// no surface, so a third of all templates sat as drafts nobody could find.\n\tlet mineOnly = $state(false);\n\tconst myCount = $derived(\n\t\tdata.viewerId ? data.items.filter((i) => i.creatorId === data.viewerId).length : 0\n\t);\n\tlet sort = $state<'popular' | 'new' | 'top' | 'price'>('popular');\n\t// mood chips over the grid: the most used tags, so a chip never comes up empty\n\tlet tag = $state<string | null>(null);\n\tconst topTags = $derived.by(() => {\n\t\tconst n = new Map<string, number>();\n\t\tfor (const i of data.items) for (const t of i.tags) n.set(t, (n.get(t) ?? 0) + 1);\n\t\treturn [...n.entries()].sort((a, b) => b[1] - a[1]).slice(0, 8).map(([t]) => t);\n\t});\n\tconst ago = (iso: string) => {\n\t\tconst m = Math.max(1, Math.round((Date.now() - new Date(iso).getTime()) / 60000));\n\t\treturn m < 60 ? `${m}m` : m < 1440 ? `${Math.round(m / 60)}h` : `${Math.round(m / 1440)}d`;\n\t};\n\n\t// The rails carry an order, not a payload: the server ranks slugs and the page\n\t// resolves them against the items it already loaded. One card shape, one set of\n\t// numbers, nothing to keep in sync between the rail and the grid.\n\tconst bySlug = $derived(new Map(data.items.map((i) => [i.slug, i])));\n\tconst pick = (slugs: string[]) =>\n\t\tslugs.map((s) => bySlug.get(s)).filter((i): i is (typeof data.items)[number] => !!i);\n\tconst hottest = $derived(pick(data.hottest));\n\tconst newest = $derived(pick(data.newest));\n\tconst trending = $derived(pick(data.trending ?? []));\n\n\tconst filtered = $derived.by(() => {\n\t\tconst q = query.trim().toLowerCase();\n\t\tconst list = data.items.filter((i) => {\n\t\t\tif (mineOnly && i.creatorId !== data.viewerId) return false;\n\t\t\tif (tag && !i.tags.includes(tag)) return false;\n\t\t\tif (!q) return true;\n\t\t\treturn (\n\t\t\t\ti.title.toLowerCase().includes(q) ||\n\t\t\t\t(i.tagline ?? '').toLowerCase().includes(q) ||\n\t\t\t\ti.tags.some((t) => t.includes(q)) ||\n\t\t\t\t(i.creatorNickname ?? '').toLowerCase().includes(q)\n\t\t\t);\n\t\t});\n\t\tconst sorted = [...list];\n\t\tif (sort === 'popular')\n\t\t\tsorted.sort((a, b) => b.playerCount - a.playerCount || b.totalUnlocks - a.totalUnlocks);\n\t\telse if (sort === 'new') sorted.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n\t\telse if (sort === 'top')\n\t\t\tsorted.sort((a, b) => b.ratingAvg - a.ratingAvg || b.reviewCount - a.reviewCount);\n\t\telse if (sort === 'price') sorted.sort((a, b) => a.priceTokens - b.priceTokens);\n\t\treturn sorted;\n\t});\n\n\t// Incremental grid: mounting all ~450 cards at once was the slow part of this\n\t// page (layout + image fetch storm), especially on phones. Render one chunk\n\t// and reveal the next when the sentinel below the grid scrolls near — the\n\t// full list is already client-side (search/filter/sort need it), so no\n\t// server roundtrip is involved.\n\tconst GRID_CHUNK = 48;\n\tlet visibleCount = $state(GRID_CHUNK);\n\tconst visible = $derived(filtered.slice(0, visibleCount));\n\t// A new search/filter/sort restarts from the first chunk.\n\t$effect(() => {\n\t\tvoid filtered;\n\t\tvisibleCount = GRID_CHUNK;\n\t});\n\tlet gridSentinel = $state<HTMLDivElement>();\n\t$effect(() => {\n\t\tif (!gridSentinel) return;\n\t\tconst io = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tif (entries.some((e) => e.isIntersecting)) {\n\t\t\t\t\tvisibleCount = Math.min(visibleCount + GRID_CHUNK, filtered.length);\n\t\t\t\t}\n\t\t\t},\n\t\t\t// Start revealing well before the user actually reaches the bottom.\n\t\t\t{ rootMargin: '800px 0px' }\n\t\t);\n\t\tio.observe(gridSentinel);\n\t\treturn () => io.disconnect();\n\t});\n\n\t// Only the curated tags that at least one published character actually uses — so\n\t// the filter never shows an empty category. New ones pick from this fixed set, so\n\t// a tag appears here automatically the moment a published character carries it.\n\n\t// \"characters\" excludes the one surviving multiplayer world — it is a lobby,\n\t// not someone you text, and the label promises the latter.\n\tconst characterCount = $derived(data.items.filter((i) => i.isCharacter).length);\n\tconst totalGames = $derived(data.items.reduce((n, i) => n + i.sessionCount, 0));\n\n\t// Tag filter dropdown (collapses the old chip wall). `all` = no filter.\n\n\t// Sort dropdown — same compact pill style as the filter, so the control bar reads\n\t// as one consistent unit.\n\ttype SortKey = 'popular' | 'new' | 'top' | 'price';\n\tconst SORT_OPTIONS: { value: SortKey; label: string }[] = [\n\t\t{ value: 'popular', label: 'most played' },\n\t\t{ value: 'new', label: 'newest' },\n\t\t{ value: 'top', label: 'top rated' },\n\t\t{ value: 'price', label: 'price' }\n\t];\n\tlet sortMenuOpen = $state(false);\n\tlet sortMenuEl = $state<HTMLDivElement>();\n\tconst sortLabel = $derived(SORT_OPTIONS.find((o) => o.value === sort)?.label ?? 'most played');\n\tfunction selectSort(value: SortKey) {\n\t\tsort = value;\n\t\tsortMenuOpen = false;\n\t}\n\n\tonMount(() => {\n\t\tactiveMode.set('roleplay');\n\t\t// Close the sort dropdown on outside-click / Escape.\n\t\tconst onDocClick = (e: MouseEvent) => {\n\t\t\tconst t = e.target as Node;\n\t\t\tif (sortMenuOpen && sortMenuEl && !sortMenuEl.contains(t)) sortMenuOpen = false;\n\t\t};\n\t\tconst onKey = (e: KeyboardEvent) => {\n\t\t\tif (e.key === 'Escape') sortMenuOpen = false;\n\t\t};\n\t\tdocument.addEventListener('click', onDocClick);\n\t\tdocument.addEventListener('keydown', onKey);\n\t\treturn () => {\n\t\t\tactiveMode.set(null);\n\t\t\tdocument.removeEventListener('click', onDocClick);\n\t\t\tdocument.removeEventListener('keydown', onKey);\n\t\t};\n\t});\n\n\t// Hero CTA → smooth-scroll down to the browse grid so the user can pick\n\t// and filter a game (rather than navigating away). Plain in-page scroll — no\n\t// setTimeout/navigation chained after.\n\tfunction scrollToGames(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tdocument.getElementById('rp-browse')?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\t}\n</script>\n\n<main class=\"relative overflow-hidden pt-20 pb-16 md:pt-24\">\n\t<div\n\t\tclass=\"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]\"\n\t></div>\n\n\t<div class=\"relative mx-auto w-full max-w-6xl px-5 md:px-6\">\n\t\t<!-- HERO -->\n\t\t<section class=\"max-w-3xl\">\n\t\t\t<h1\n\t\t\t\tclass=\"mt-3 font-display text-[clamp(2.2rem,6vw,4rem)] leading-[0.92] font-bold tracking-[-0.02em]\"\n\t\t\t>\n\t\t\t\troleplay, just<br /><span class=\"text-purple\">you and them.</span>\n\t\t\t</h1>\n\t\t\t<p class=\"mt-4 max-w-md text-sm leading-relaxed text-muted\">\n\t\t\t\t<span class=\"font-semibold text-text\">pick a character</span> and start talking — or put a few\n\t\t\t\tin one room together. it goes wherever you take it.\n\t\t\t</p>\n\t\t\t<!-- One primary, two alternates in one row (2026-10 redesign). -->\n\t\t\t<div class=\"mt-6 flex flex-wrap gap-2.5\">\n\t\t\t\t<a\n\t\t\t\t\thref=\"#rp-browse\"\n\t\t\t\t\tonclick={scrollToGames}\n\t\t\t\t\tclass=\"inline-flex h-[52px] items-center gap-2.5 rounded-[14px] bg-purple px-6 font-body text-[16px] font-bold text-white no-underline transition-colors hover:bg-purple-dark\"\n\t\t\t\t>\n\t\t\t\t\t<svg class=\"h-[18px] w-[18px]\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" /></svg>\n\t\t\t\t\tTalk 1:1\n\t\t\t\t</a>\n\t\t\t\t<!-- Group rooms live here rather than on a character card: you pick\n\t\t\t\t\t the room's cast first, so the entry point belongs where you're\n\t\t\t\t\t still choosing, not inside one character's page. -->\n\t\t\t\t<a\n\t\t\t\t\thref=\"/roleplay/group/new\"\n\t\t\t\t\tclass=\"inline-flex h-[52px] items-center gap-2.5 rounded-[14px] bg-[#161616] px-5 text-[15px] font-semibold text-text no-underline transition-colors hover:bg-[#1e1e1e]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"flex\" aria-hidden=\"true\">\n\t\t\t\t\t\t<span class=\"h-[22px] w-[22px] rounded-full border-2 border-[#161616] bg-[#4c3a6e]\"></span>\n\t\t\t\t\t\t<span class=\"-ml-2 h-[22px] w-[22px] rounded-full border-2 border-[#161616] bg-[#3d5245]\"></span>\n\t\t\t\t\t\t<span class=\"-ml-2 h-[22px] w-[22px] rounded-full border-2 border-[#161616] bg-[#563b3b]\"></span>\n\t\t\t\t\t</span>\n\t\t\t\t\tGroup scene\n\t\t\t\t</a>\n\t\t\t\t<a\n\t\t\t\t\thref=\"/roleplay/new\"\n\t\t\t\t\tclass=\"inline-flex h-[52px] items-center gap-2 rounded-[14px] bg-[#161616] px-5 text-[15px] font-semibold text-text no-underline transition-colors hover:bg-[#1e1e1e]\"\n\t\t\t\t>\n\t\t\t\t\t<svg class=\"h-[18px] w-[18px] text-[#c4b5fd]\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\" /></svg>\n\t\t\t\t\tBuild one\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<div class=\"mt-4 flex items-center gap-5 font-mono text-[10px] tracking-[0.14em] text-muted uppercase\">\n\t\t\t\t<span><span class=\"text-text\">{characterCount}</span> characters</span>\n\t\t\t\t<span><span class=\"text-text\">{totalGames}</span> chats started</span>\n\t\t\t</div>\n\t\t</section>\n\n\t\t{#if data.resume?.length}\n\t\t\t<section class=\"mt-12\">\n\t\t\t\t<h2 class=\"font-display text-2xl font-bold tracking-tight\">continue</h2>\n\t\t\t\t<div class=\"mt-3.5 grid gap-3 md:grid-cols-3\">\n\t\t\t\t\t{#each data.resume as r (r.href)}\n\t\t\t\t\t\t<a href={r.href} data-sveltekit-preload-data=\"off\" class=\"flex items-center gap-3 rounded-[18px] bg-[#141414] p-3.5 no-underline transition-colors hover:bg-[#191919]\">\n\t\t\t\t\t\t\t<span class=\"block h-10 w-10 shrink-0 overflow-hidden rounded-full\">\n\t\t\t\t\t\t\t\t{#if r.imageUrl}<img src={r.imageUrl} alt=\"\" class=\"h-full w-full object-cover\" loading=\"lazy\" />{:else}<RpMonogram name={r.title} seed={r.slug} />{/if}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t<span class=\"truncate text-[15px] font-semibold text-text\">{r.title}</span>\n\t\t\t\t\t\t\t\t<span class=\"text-[13px] text-[#a3a3a3]\">{r.kind === 'group' ? 'group scene' : '1:1'} · {r.count} messages</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"text-[12px] text-[#8a8a8a]\">{ago(r.at)}</span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t{/if}\n\n\t\t<!-- RAT-463: rails above the grid. 283 characters in one wall gives no\n\t\t\t signal about which are worth opening, and 88% of opened threads never\n\t\t\t got a message. These rank on the only evidence there is. -->\n\t\t<div class=\"mt-14 md:mt-20\">\n\t\t\t<!-- Guided sessions: she leads, in her voice. A rail of their own above\n\t\t\t\t the characters, not a fourth button in the hero. -->\n\t\t\t<RpSessionsRail />\n\t\t\t<RpCarousel\n\t\t\t\ttitle=\"trending now\"\n\t\t\t\tblurb=\"who people are actually in scenes with, this week.\"\n\t\t\t\titems={trending}\n\t\t\t\tisLoggedIn={data.isLoggedIn}\n\t\t\t\tviewerId={data.viewerId}\n\t\t\t/>\n\t\t\t<RpCarousel\n\t\t\t\ttitle=\"hottest\"\n\t\t\t\tblurb=\"the ones people actually talk to — and the ones they can't stop talking to.\"\n\t\t\t\titems={hottest}\n\t\t\t\tisLoggedIn={data.isLoggedIn}\n\t\t\t\tviewerId={data.viewerId}\n\t\t\t\tflame\n\t\t\t/>\n\t\t\t<RpCarousel\n\t\t\t\ttitle=\"new\"\n\t\t\t\tblurb=\"published this week, best first.\"\n\t\t\t\titems={newest}\n\t\t\t\tisLoggedIn={data.isLoggedIn}\n\t\t\t\tviewerId={data.viewerId}\n\t\t\t/>\n\t\t</div>\n\n\t\t<!-- BROWSE -->\n\t\t<section id=\"rp-browse\" class=\"scroll-mt-24\">\n\t\t\t<div class=\"mb-5\">\n\t\t\t\t<h2 class=\"font-display text-2xl font-bold tracking-tight\">browse all</h2>\n\t\t\t\t<p class=\"mt-1 text-sm text-muted\">everyone someone was unhinged enough to invent.</p>\n\t\t\t</div>\n\n\t\t\t<!-- compact control bar: search grows; filter + sort are matching pill dropdowns -->\n\t\t\t<div class=\"mb-6 flex flex-wrap items-center gap-2 sm:gap-3\">\n\t\t\t\t<!-- search -->\n\t\t\t\t<div class=\"relative min-w-0 basis-full sm:flex-1 sm:basis-0\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"pointer-events-none absolute top-1/2 left-3.5 h-4 w-4 -translate-y-1/2 text-muted\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"m21 21-4.3-4.3\" />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tbind:value={query}\n\t\t\t\t\t\tplaceholder=\"search characters, tags, creators…\"\n\t\t\t\t\t\tclass=\"w-full rounded-xl border border-border bg-surface py-2.5 pr-4 pl-10 text-sm text-text placeholder:text-muted focus:border-purple focus:outline-none\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- mine — only when they've actually made something -->\n\t\t\t\t{#if myCount > 0}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-pressed={mineOnly}\n\t\t\t\t\t\tonclick={() => (mineOnly = !mineOnly)}\n\t\t\t\t\t\tclass=\"flex items-center gap-1.5 rounded-xl border px-3 py-2.5 text-[13px] font-semibold transition-colors {mineOnly\n\t\t\t\t\t\t\t? 'border-purple bg-purple/10 text-purple'\n\t\t\t\t\t\t\t: 'border-border bg-surface text-text hover:border-white/20'}\"\n\t\t\t\t\t>\n\t\t\t\t\t\tmine\n\t\t\t\t\t\t<span class=\"font-mono text-[11px] opacity-60\">{myCount}</span>\n\t\t\t\t\t</button>\n\t\t\t\t{/if}\n\n\t\t\t\t<!-- sort -->\n\t\t\t\t<div class=\"relative flex-1 sm:flex-none\" bind:this={sortMenuEl}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => (sortMenuOpen = !sortMenuOpen)}\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\taria-expanded={sortMenuOpen}\n\t\t\t\t\t\tclass=\"flex w-full items-center justify-between gap-1.5 rounded-xl border border-border bg-surface px-3 py-2.5 text-[13px] font-semibold text-text transition-colors hover:border-white/20 focus:outline-none sm:w-auto\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\tclass=\"h-3.5 w-3.5 text-muted\"\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=\"M7 16V4M7 4L4 7M7 4l3 3M17 8v12M17 20l3-3M17 20l-3-3\"\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{sortLabel}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"h-3.5 w-3.5 text-muted transition-transform {sortMenuOpen ? 'rotate-180' : ''}\"\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=\"2\"\n\t\t\t\t\t\t\t><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6 9 6 6 6-6\" /></svg\n\t\t\t\t\t\t>\n\t\t\t\t\t</button>\n\t\t\t\t\t{#if sortMenuOpen}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t\t\tclass=\"absolute right-0 z-30 mt-1.5 w-48 max-w-[calc(100vw-2.5rem)] overflow-auto rounded-xl border border-border bg-surface p-1 shadow-[0_18px_50px_-18px_rgba(0,0,0,0.85)]\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#each SORT_OPTIONS as o (o.value)}\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\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected={sort === o.value}\n\t\t\t\t\t\t\t\t\tonclick={() => selectSort(o.value)}\n\t\t\t\t\t\t\t\t\tclass=\"flex w-full items-center justify-between gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors {sort ===\n\t\t\t\t\t\t\t\t\to.value\n\t\t\t\t\t\t\t\t\t\t? 'bg-purple/15 font-semibold text-text'\n\t\t\t\t\t\t\t\t\t\t: 'text-muted hover:bg-surface-2 hover:text-text'}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{o.label}\n\t\t\t\t\t\t\t\t\t{#if sort === o.value}\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\tclass=\"h-3.5 w-3.5 text-purple\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\t><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 13l4 4L19 7\" /></svg\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t</button>\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\n\t\t\t{#if topTags.length}\n\t\t\t\t<div class=\"-mt-2 mb-6 flex gap-1.5 overflow-x-auto pb-1 [scrollbar-width:none]\" role=\"group\" aria-label=\"filter by mood\">\n\t\t\t\t\t<button type=\"button\" onclick={() => (tag = null)} class=\"h-9 shrink-0 rounded-full px-3.5 text-[13px] font-semibold {tag === null ? 'bg-[#f5f5f5] text-[#0c0c0c]' : 'bg-[#1c1c1c] text-[#d4d4d4]'}\">all</button>\n\t\t\t\t\t{#each topTags as t (t)}\n\t\t\t\t\t\t<button type=\"button\" aria-pressed={tag === t} onclick={() => (tag = tag === t ? null : t)} class=\"h-9 shrink-0 rounded-full px-3.5 text-[13px] font-semibold {tag === t ? 'bg-[#f5f5f5] text-[#0c0c0c]' : 'bg-[#1c1c1c] text-[#d4d4d4]'}\">{t}</button>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t<div class=\"grid grid-cols-2 gap-x-3.5 gap-y-6 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5\">\n\t\t\t\t{#each visible as item (item.slug)}\n\t\t\t\t\t<RpMarketCard {item} isLoggedIn={data.isLoggedIn} viewerId={data.viewerId} />\n\t\t\t\t{/each}\n\t\t\t\t<a\n\t\t\t\t\thref=\"/roleplay/new\"\n\t\t\t\t\tclass=\"group flex aspect-[4/5] flex-col items-center justify-center gap-2 rounded-2xl border border-dashed border-border bg-surface/40 p-4 text-center transition-colors hover:border-white/20 hover:bg-surface\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"flex h-10 w-10 items-center justify-center rounded-full bg-purple/15 text-2xl font-light text-purple\">+</span>\n\t\t\t\t\t<span class=\"font-display text-sm font-bold text-text\">build your own</span>\n\t\t\t\t\t<span class=\"text-[11px] leading-snug text-muted\">write someone worth talking to. cash in every time they get unlocked.</span>\n\t\t\t\t</a>\n\t\t\t</div>\n\n\t\t\t{#if visibleCount < filtered.length}\n\t\t\t\t<div bind:this={gridSentinel} class=\"h-px\" aria-hidden=\"true\"></div>\n\t\t\t{/if}\n\n\t\t\t{#if filtered.length === 0}\n\t\t\t\t<p class=\"mt-4 text-center text-[13px] text-muted\">nothing matches that. try less.</p>\n\t\t\t{/if}\n\t\t</section>\n\n\t\t<!-- HOW IT WORKS -->\n\t\t<section class=\"mt-16 md:mt-24\">\n\t\t\t<div class=\"mb-6\">\n\t\t\t\t<h2 class=\"font-display text-2xl font-bold tracking-tight\">anyone can build a character. few should.</h2>\n\t\t\t\t<p class=\"mt-1 text-sm text-muted\">three steps from terrible idea to tokens in your wallet.</p>\n\t\t\t</div>\n\t\t\t<div class=\"grid gap-px overflow-hidden rounded-2xl border border-border bg-border md:grid-cols-3\">\n\t\t\t\t{#each [{ n: '01', t: 'write the character', d: 'who they are, how they talk, how filthy it gets. the AI becomes them.' }, { n: '02', t: 'ship it', d: 'slap on a cover, name your price, publish. or give it away and pretend it was for the art.' }, { n: '03', t: 'get paid', d: 'real money for every unlock, cashed out to your bank. every single time someone unlocks your mess.' }] as step (step.n)}\n\t\t\t\t\t<div class=\"flex flex-col gap-3 bg-surface p-6 md:p-8\">\n\t\t\t\t\t\t<span class=\"flex h-9 w-9 items-center justify-center rounded-lg bg-purple/15 font-mono text-[13px] font-bold text-purple\">{step.n}</span>\n\t\t\t\t\t\t<h3 class=\"font-display text-base font-bold\">{step.t}</h3>\n\t\t\t\t\t\t<p class=\"text-[13px] leading-relaxed text-muted\">{step.d}</p>\n\t\t\t\t\t</div>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t\t<a\n\t\t\t\thref=\"/roleplay/new\"\n\t\t\t\tclass=\"mt-6 inline-flex items-center justify-center rounded-xl bg-purple px-7 py-3.5 font-display text-[15px] font-bold tracking-tight text-white no-underline transition-colors hover:bg-purple-dark\"\n\t\t\t\t>build one →</a\n\t\t\t>\n\t\t</section>\n\t</div>\n</main>\n\n<Footer />\n"],"version":3}