{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c9b-7a60-aae1-6a8db6c0f4f5","file":"136.DoA-Aey9.mjs","mappings":"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","names":["initialClipId","initialConsumed","loading","$.state","clips","$.proxy","isOwner","selected","errorMsg","generateOpen","prompt","DEFAULT_ANIMATION_PROMPT","submitting","submitted","unlocking","posting","comments","commentsLoading","commentDraft","commentSending","loadClips","$.set","body","$$props","target","$.get","c","openClip","t","$.user_effect","clip","submitAnimate","res","ANIMATE_COST","submitUnlock","updated","ANIMATION_UNLOCK_COST","submitComment","deleting","submitDelete","submitPostToFeed","goto","div","root","div_1","$.child","div_2","div_3","button","root_1","$.append","$$anchor","$$render","consequent","h3","$.sibling","node","div_4","a","root_2","$.template_effect","$0","$.set_text","text_1","consequent_1","button_1","node_1","div_5","video","root_4","div_6","root_5","button_2","text_2","span","root_6","TokenCoin","consequent_3","$.reset","p","$.delegated","div_7","root_7","p_1","text_5","consequent_2","consequent_4","alternate","div_8","node_3","p_2","div_9","root_8","img","root_9","$.set_attribute","getAvatarUrl","consequent_5","span_1","node_7","consequent_6","button_3","root_10","text_8","consequent_7","a_1","root_12","text_9","button_4","root_13","text_10","consequent_8","alternate_1","consequent_9","div_10","root_14","div_11","p_3","root_15","text_12","p_4","root_16","text_13","ul","root_17","$.each","li","root_18","img_1","root_19","span_2","root_20","consequent_12","alternate_2","div_12","node_13","span_3","img_2","root_21","p_5","root_22","text_15","consequent_13","alternate_3","text_14","consequent_10","consequent_11","alternate_4","form","root_23","input","$.remove_input_defaults","button_5","text_16","$1","$.event","e","$$value","consequent_14","text_11","consequent_15","text_6","div_13","root_25","p_6","root_26","div_14","root_27","button_6","root_28","node_17","video_1","root_29","div_15","root_30","span_4","div_16","root_31","span_5","text_19","consequent_19","consequent_20","alternate_5","div_17","p_7","div_18","span_6","img_3","root_32","d","$.derived","span_7","node_19","span_8","root_33","text_22","consequent_22","text_20","consequent_18","alternate_6","p_8","root_34","consequent_23","consequent_16","alternate_7","p_9","root_35","consequent_24","div_19","root_36","textarea","$.first_child","fragment_3","$.remove_textarea_child","button_7","text_25","span_9","root_38","consequent_25","ANIMATION_PROMPT_MAX_LENGTH","button_8","root_39","text_27","span_10","consequent_26","alternate_8","consequent_27","$2","$$args","liked","count","pending","toggle","wantLiked","svg","deepLinkAnimOpen","shareCopied","shareTimer","sharePost","url","u","title","shareOrCopy","result","trackShare","replyTarget","appendCommentFromInput","fmtDate","date","ms","m","h","days","profileHref","crossSourceUrl","crossLabel","crossCta","crossIcon","crossImageFailed","slideIndex","carouselEl","crossImageFailedB","h1","text","text_3","postedIn","node_2","n","i","text_4","PostCard","node_4","node_5","article","slides","fragment_4","text_7","$.index","_","$.set_class","root_11","el","a_2","node_11","node_12","a_3","img_4","video_2","img_5","a_4","root_24","video_3","img_6","a_5","styles","$.set_style","a_6","consequent_17","header","DuelAvatar","div_20","a_7","UserBadge","node_18","div_21","div_22","div_23","node_20","div_24","a_8","node_21","LinkifiedText","node_22","a_9","div_25","div_26","div_27","div_28","CommentSection","node_24","div_29","LikeButton","node_25","node_26","fragment_5","text_24","fragment_6","consequent_21","CommentInput","node_27","text_23","AnimateModal"],"sources":["../../../../../../src/lib/components/post/AnimateModal.svelte","../../../../../../src/lib/components/post/LikeButton.svelte","../../../../../../src/routes/post/[id]/+page.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport {\n\t\tANIMATE_COST,\n\t\tANIMATION_UNLOCK_COST,\n\t\tANIMATION_PROMPT_MAX_LENGTH,\n\t\tDEFAULT_ANIMATION_PROMPT,\n\t\ttype AnimationClipView,\n\t\ttype AnimationCommentView\n\t} from '$lib/animation';\n\timport { getAvatarUrl } from '$lib/avatar';\n\timport TokenCoin from '$lib/components/TokenCoin.svelte';\n\timport { goto } from '$app/navigation';\n\timport type { PostView } from '$lib/types/post';\n\n\tinterface Props {\n\t\tpost: PostView;\n\t\tviewerLoggedIn: boolean;\n\t\tonclose: () => void;\n\t\t/** Deep link (/post/[id]?animation=<id>): auto-open this clip's detail\n\t\t *  view once the list loads. */\n\t\tinitialClipId?: string | null;\n\t}\n\n\tlet { post, viewerLoggedIn, onclose, initialClipId = null }: Props = $props();\n\tlet initialConsumed = false;\n\n\t// Modal owns its data: clips are fetched on open (the feed only carries a\n\t// summary), and every mutation (generate / unlock / comment / publish)\n\t// refreshes locally — no feed reload required.\n\tlet loading = $state(true);\n\tlet clips = $state<AnimationClipView[]>([]);\n\tlet isOwner = $state(false);\n\tlet selected = $state<AnimationClipView | null>(null);\n\tlet errorMsg = $state('');\n\n\t// generate form\n\tlet generateOpen = $state(false);\n\tlet prompt = $state(DEFAULT_ANIMATION_PROMPT);\n\tlet submitting = $state(false);\n\tlet submitted = $state(false);\n\n\t// detail view state\n\tlet unlocking = $state(false);\n\tlet posting = $state(false);\n\tlet comments = $state<AnimationCommentView[]>([]);\n\tlet commentsLoading = $state(false);\n\tlet commentDraft = $state('');\n\tlet commentSending = $state(false);\n\n\tasync function loadClips() {\n\t\tloading = true;\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/post/${post.id}/animations`);\n\t\t\tconst body = await res.json();\n\t\t\tclips = body.clips ?? [];\n\t\t\tisOwner = !!body.isOwner;\n\t\t\tif (initialClipId && !initialConsumed) {\n\t\t\t\tinitialConsumed = true;\n\t\t\t\tconst target = clips.find((c) => c.id === initialClipId);\n\t\t\t\tif (target) void openClip(target);\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = t('could not load the clips — try again.');\n\t\t} finally {\n\t\t\tloading = false;\n\t\t}\n\t}\n\t$effect(() => {\n\t\tvoid loadClips();\n\t});\n\n\tasync function openClip(clip: AnimationClipView) {\n\t\tselected = clip;\n\t\tcomments = [];\n\t\tcommentDraft = '';\n\t\tif (clip.status !== 'ready') return;\n\t\tcommentsLoading = true;\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/animation/${clip.id}/comments`);\n\t\t\tconst body = await res.json();\n\t\t\tcomments = body.comments ?? [];\n\t\t} catch {\n\t\t\t/* comments are decorative — the clip still plays */\n\t\t} finally {\n\t\t\tcommentsLoading = false;\n\t\t}\n\t}\n\n\tasync function submitAnimate() {\n\t\tif (submitting) return;\n\t\tsubmitting = true;\n\t\terrorMsg = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/post/${post.id}/animate`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ prompt })\n\t\t\t});\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (res.ok) {\n\t\t\t\tsubmitted = true;\n\t\t\t\tgenerateOpen = false;\n\t\t\t\tawait loadClips();\n\t\t\t} else if (body.error === 'insufficient_tokens') {\n\t\t\t\terrorMsg = t('you need {n} tokens for this. top up and come back.', { n: ANIMATE_COST });\n\t\t\t} else if (body.error === 'bad_prompt') {\n\t\t\t\terrorMsg = t('that prompt is not going to fly. rephrase it.');\n\t\t\t} else {\n\t\t\t\terrorMsg = t('could not start the animation. try again in a minute.');\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = t('network hiccup — try again.');\n\t\t} finally {\n\t\t\tsubmitting = false;\n\t\t}\n\t}\n\n\tasync function submitUnlock(clip: AnimationClipView) {\n\t\tif (unlocking) return;\n\t\tunlocking = true;\n\t\terrorMsg = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/animation/${clip.id}/unlock`, { method: 'POST' });\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (res.ok) {\n\t\t\t\tconst updated = { ...clip, canWatch: true, videoUrl: body.videoUrl ?? null };\n\t\t\t\tclips = clips.map((c) => (c.id === clip.id ? updated : c));\n\t\t\t\tawait openClip(updated);\n\t\t\t} else if (body.error === 'insufficient_tokens') {\n\t\t\t\terrorMsg = t('you need {n} tokens to unlock this.', { n: ANIMATION_UNLOCK_COST });\n\t\t\t} else {\n\t\t\t\terrorMsg = t('unlock failed. try again in a minute.');\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = t('network hiccup — try again.');\n\t\t} finally {\n\t\t\tunlocking = false;\n\t\t}\n\t}\n\n\tasync function submitComment() {\n\t\tif (commentSending || !selected || !commentDraft.trim()) return;\n\t\tcommentSending = true;\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/animation/${selected.id}/comments`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ body: commentDraft })\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tcommentDraft = '';\n\t\t\t\tawait openClip(selected);\n\t\t\t} else {\n\t\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\t\terrorMsg =\n\t\t\t\t\tbody.error === 'forbidden' ? t('unlock the clip to join the thread.') : t('comment failed.');\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = t('network hiccup — try again.');\n\t\t} finally {\n\t\t\tcommentSending = false;\n\t\t}\n\t}\n\n\tlet deleting = $state(false);\n\tasync function submitDelete(clip: AnimationClipView) {\n\t\tif (deleting) return;\n\t\tif (!confirm(t('delete this clip permanently? unlocks are not refunded.'))) return;\n\t\tdeleting = true;\n\t\terrorMsg = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/animation/${clip.id}`, { method: 'DELETE' });\n\t\t\tif (res.ok) {\n\t\t\t\tselected = null;\n\t\t\t\tawait loadClips();\n\t\t\t} else {\n\t\t\t\terrorMsg = t('delete failed. try again.');\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = t('network hiccup — try again.');\n\t\t} finally {\n\t\t\tdeleting = false;\n\t\t}\n\t}\n\n\tasync function submitPostToFeed(clip: AnimationClipView) {\n\t\tif (posting) return;\n\t\tposting = true;\n\t\terrorMsg = '';\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/animation/${clip.id}/post-to-feed`, { method: 'POST' });\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tif (res.ok && body.postId) {\n\t\t\t\tonclose();\n\t\t\t\tawait goto(`/post/${body.postId}`);\n\t\t\t} else {\n\t\t\t\terrorMsg =\n\t\t\t\t\tbody.error === 'already_posted'\n\t\t\t\t\t\t? t('this clip is already on the feed.')\n\t\t\t\t\t\t: t('posting failed. try again.');\n\t\t\t}\n\t\t} catch {\n\t\t\terrorMsg = t('network hiccup — try again.');\n\t\t} finally {\n\t\t\tposting = false;\n\t\t}\n\t}\n</script>\n\n<div\n\tclass=\"fixed inset-0 z-[220] flex items-end justify-center bg-black/70 backdrop-blur-sm md:items-center\"\n\tonclick={(e) => {\n\t\tif (e.target === e.currentTarget) onclose();\n\t}}\n\tonkeydown={(e) => {\n\t\tif (e.key === 'Escape') {\n\t\t\tif (selected) selected = null;\n\t\t\telse onclose();\n\t\t}\n\t}}\n\trole=\"dialog\"\n\taria-modal=\"true\"\n\taria-label={t('photo animations')}\n\ttabindex=\"-1\"\n>\n\t<div\n\t\tclass=\"flex max-h-[85dvh] w-full max-w-lg flex-col rounded-t-2xl border border-border bg-surface md:rounded-2xl\"\n\t>\n\t\t<!-- header -->\n\t\t<div class=\"flex items-center justify-between border-b border-border px-5 py-4\">\n\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t{#if selected}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => (selected = null)}\n\t\t\t\t\t\tclass=\"text-sm text-muted hover:text-white\"\n\t\t\t\t\t>\n\t\t\t\t\t\t←\n\t\t\t\t\t</button>\n\t\t\t\t{/if}\n\t\t\t\t<h3 class=\"font-display text-lg font-bold tracking-tight\">\n\t\t\t\t\t{selected ? t('clip') : t('animations · {n}', { n: clips.length })}\n\t\t\t\t</h3>\n\t\t\t</div>\n\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t{#if viewerLoggedIn && !selected}\n\t\t\t\t\t<a href=\"/animations\" class=\"text-[11px] text-muted underline hover:text-white\"\n\t\t\t\t\t\t>{t('my animations')}</a\n\t\t\t\t\t>\n\t\t\t\t{/if}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonclick={onclose}\n\t\t\t\t\tclass=\"flex h-8 w-8 items-center justify-center rounded-full text-muted transition-colors hover:bg-bg hover:text-white\"\n\t\t\t\t\taria-label={t('close')}\n\t\t\t\t>\n\t\t\t\t\t✕\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"flex-1 overflow-y-auto px-5 py-4\">\n\t\t\t{#if selected}\n\t\t\t\t<!-- ─── clip detail ─── -->\n\t\t\t\t{#if selected.canWatch && selected.videoUrl}\n\t\t\t\t\t<video\n\t\t\t\t\t\tsrc={selected.videoUrl}\n\t\t\t\t\t\tautoplay\n\t\t\t\t\t\tloop\n\t\t\t\t\t\tmuted\n\t\t\t\t\t\tplaysinline\n\t\t\t\t\t\tcontrols\n\t\t\t\t\t\tclass=\"aspect-[480/832] max-h-[45dvh] w-full rounded-xl bg-black object-contain\"\n\t\t\t\t\t></video>\n\t\t\t\t{:else if selected.status === 'ready'}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex aspect-[480/832] max-h-[45dvh] w-full flex-col items-center justify-center gap-3 rounded-xl border border-border bg-bg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-8 w-8 text-muted\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\">\n\t\t\t\t\t\t\t<rect x=\"4.5\" y=\"10.5\" width=\"15\" height=\"9\" rx=\"2.2\" />\n\t\t\t\t\t\t\t<path d=\"M8 10.5V7.5a4 4 0 0 1 8 0v3\" />\n\t\t\t\t\t\t</svg>\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={() => selected && submitUnlock(selected)}\n\t\t\t\t\t\t\tdisabled={unlocking || !viewerLoggedIn}\n\t\t\t\t\t\t\tclass=\"flex items-center gap-1.5 rounded-xl bg-pink px-5 py-2.5 font-display text-sm font-bold text-white transition-opacity hover:opacity-90 disabled:opacity-50\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{unlocking ? t('unlocking…') : t('unlock')}\n\t\t\t\t\t\t\t{#if !unlocking}\n\t\t\t\t\t\t\t\t<span class=\"flex items-center gap-1\"><TokenCoin size={14} /> {ANIMATION_UNLOCK_COST}</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<p class=\"px-6 text-center text-[11px] text-muted\">{t('the photo owner gets a cut')}</p>\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex aspect-[480/832] max-h-[45dvh] w-full flex-col items-center justify-center gap-3 rounded-xl border border-border bg-bg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-white\"></span>\n\t\t\t\t\t\t<p class=\"text-xs text-muted\">{t('rendering — usually 1-3 minutes')}</p>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\n\t\t\t\t<!-- prompt + requester -->\n\t\t\t\t<div class=\"mt-3 rounded-xl border border-border bg-bg px-3 py-2.5\">\n\t\t\t\t\t<p class=\"text-xs leading-relaxed text-text\">\"{selected.prompt}\"</p>\n\t\t\t\t\t{#if selected.requester}\n\t\t\t\t\t\t<div class=\"mt-1.5 flex items-center gap-1.5\">\n\t\t\t\t\t\t\t{#if selected.requester.avatarPath}\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={getAvatarUrl(selected.requester.avatarPath)}\n\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\tclass=\"h-4 w-4 rounded-full object-cover\"\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<span class=\"text-[11px] text-muted\"\n\t\t\t\t\t\t\t\t>{t('by {name}', { name: selected.requester.nickname ?? t('anonymous') })}</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\n\t\t\t\t{#if selected.canDelete}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => selected && submitDelete(selected)}\n\t\t\t\t\t\tdisabled={deleting}\n\t\t\t\t\t\tclass=\"mt-3 w-full rounded-xl border border-border bg-bg px-5 py-2 font-display text-xs font-bold text-red-400 transition-colors hover:bg-surface disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{deleting ? t('deleting…') : t('delete clip')}\n\t\t\t\t\t</button>\n\t\t\t\t{/if}\n\n\t\t\t\t{#if isOwner && selected.status === 'ready' && selected.canWatch}\n\t\t\t\t\t{#if selected.postedPostId}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={`/post/${selected.postedPostId}`}\n\t\t\t\t\t\t\tclass=\"mt-3 block w-full rounded-xl border border-border bg-bg px-5 py-2.5 text-center font-display text-sm font-bold text-muted\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t('on the feed → view post')}\n\t\t\t\t\t\t</a>\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\tonclick={() => selected && submitPostToFeed(selected)}\n\t\t\t\t\t\t\tdisabled={posting}\n\t\t\t\t\t\t\tclass=\"mt-3 w-full rounded-xl bg-pink px-5 py-2.5 font-display text-sm font-bold text-white transition-opacity hover:opacity-90 disabled:opacity-50\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{posting ? t('posting…') : t('post to feed')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\n\t\t\t\t<!-- comments -->\n\t\t\t\t{#if selected.status === 'ready'}\n\t\t\t\t\t<div class=\"mt-4\">\n\t\t\t\t\t\t<div class=\"text-xs font-semibold tracking-wider text-muted uppercase\">\n\t\t\t\t\t\t\t{t('comments')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if commentsLoading}\n\t\t\t\t\t\t\t<p class=\"mt-2 text-xs text-muted\">{t('loading…')}</p>\n\t\t\t\t\t\t{:else if comments.length === 0}\n\t\t\t\t\t\t\t<p class=\"mt-2 text-xs text-muted\">{t('nothing yet — say something.')}</p>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<ul class=\"mt-2 space-y-2.5\">\n\t\t\t\t\t\t\t\t{#each comments.slice(-5) as c (c.id)}\n\t\t\t\t\t\t\t\t\t<li class=\"flex items-start gap-2\">\n\t\t\t\t\t\t\t\t\t\t{#if c.author.avatarPath}\n\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc={getAvatarUrl(c.author.avatarPath)}\n\t\t\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"mt-0.5 h-5 w-5 rounded-full object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"mt-0.5 h-5 w-5 rounded-full bg-bg\"></span>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t<div class=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-[11px] font-semibold text-muted\"\n\t\t\t\t\t\t\t\t\t\t\t\t>{c.author.nickname ?? t('anonymous')}</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{#if c.kind === 'gif' && c.mediaUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={c.mediaUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt={c.body}\n\t\t\t\t\t\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"mt-0.5 max-w-[180px] rounded-lg\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\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<p class=\"text-xs break-words text-text\">{c.body}</p>\n\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{#if viewerLoggedIn && (selected.canWatch || isOwner)}\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tclass=\"mt-3 flex items-center gap-2\"\n\t\t\t\t\t\t\t\tonsubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tvoid submitComment();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tbind:value={commentDraft}\n\t\t\t\t\t\t\t\t\tmaxlength=\"500\"\n\t\t\t\t\t\t\t\t\tplaceholder={t('add a comment…')}\n\t\t\t\t\t\t\t\t\tclass=\"min-w-0 flex-1 rounded-xl border border-border bg-bg px-3 py-2 text-xs text-white focus:border-muted focus:outline-none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\t\tdisabled={commentSending || !commentDraft.trim()}\n\t\t\t\t\t\t\t\t\tclass=\"rounded-xl bg-bg px-3 py-2 font-display text-xs font-bold text-white disabled:opacity-40\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('send')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</form>\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{:else}\n\t\t\t\t<!-- ─── grid ─── -->\n\t\t\t\t{#if loading}\n\t\t\t\t\t<div class=\"grid grid-cols-2 gap-3\">\n\t\t\t\t\t\t<div class=\"aspect-[480/832] animate-pulse rounded-xl bg-bg\"></div>\n\t\t\t\t\t\t<div class=\"aspect-[480/832] animate-pulse rounded-xl bg-bg\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t{:else if clips.length === 0 && !submitted}\n\t\t\t\t\t<p class=\"py-4 text-center text-sm text-muted\">\n\t\t\t\t\t\t{t('no clips yet — be the first to animate this photo.')}\n\t\t\t\t\t</p>\n\t\t\t\t{:else}\n\t\t\t\t\t<div class=\"grid grid-cols-2 gap-3\">\n\t\t\t\t\t\t{#each clips as clip (clip.id)}\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={() => openClip(clip)}\n\t\t\t\t\t\t\t\tclass=\"group relative aspect-[480/832] overflow-hidden rounded-xl border border-border bg-bg text-left\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#if clip.canWatch && clip.videoUrl}\n\t\t\t\t\t\t\t\t\t<video\n\t\t\t\t\t\t\t\t\t\tsrc={clip.videoUrl}\n\t\t\t\t\t\t\t\t\t\tmuted\n\t\t\t\t\t\t\t\t\t\tloop\n\t\t\t\t\t\t\t\t\t\tautoplay\n\t\t\t\t\t\t\t\t\t\tplaysinline\n\t\t\t\t\t\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\t\t\t\t\t\tclass=\"h-full w-full object-cover\"\n\t\t\t\t\t\t\t\t\t></video>\n\t\t\t\t\t\t\t\t{:else if clip.status === 'ready'}\n\t\t\t\t\t\t\t\t\t<div class=\"flex h-full w-full flex-col items-center justify-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-6 w-6 text-muted\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\">\n\t\t\t\t\t\t\t\t\t\t\t<rect x=\"4.5\" y=\"10.5\" width=\"15\" height=\"9\" rx=\"2.2\" />\n\t\t\t\t\t\t\t\t\t\t\t<path d=\"M8 10.5V7.5a4 4 0 0 1 8 0v3\" />\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t<span class=\"flex items-center gap-1 font-display text-[11px] font-bold text-muted\">\n\t\t\t\t\t\t\t\t\t\t\t<TokenCoin size={13} />\n\t\t\t\t\t\t\t\t\t\t\t{ANIMATION_UNLOCK_COST}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<div class=\"flex h-full w-full flex-col items-center justify-center gap-2.5\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"h-5 w-5 animate-spin rounded-full border-2 border-border border-t-white\"></span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"text-[11px] text-muted\">{t('rendering…')}</span>\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\t<div\n\t\t\t\t\t\t\t\t\tclass=\"pointer-events-none absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent px-2.5 pt-6 pb-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p class=\"line-clamp-2 text-[10px] leading-tight text-white/90\">\n\t\t\t\t\t\t\t\t\t\t{clip.prompt}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<div class=\"mt-1 flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"flex min-w-0 items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t{#if getAvatarUrl(clip.requester?.avatarPath)}\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={getAvatarUrl(clip.requester?.avatarPath)}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"h-4 w-4 shrink-0 rounded-full border border-black/40 object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\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=\"truncate text-[10px] text-white/60\"\n\t\t\t\t\t\t\t\t\t\t\t\t>{clip.requester?.nickname ?? t('anon')}</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{#if clip.commentCount > 0}\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"flex shrink-0 items-center gap-0.5 text-[10px] text-white/60\">\n\t\t\t\t\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-2.5 w-2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t\t{clip.commentCount}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t\t{#if submitted}\n\t\t\t\t\t<p class=\"mt-3 rounded-xl border border-border bg-bg px-3 py-2.5 text-center text-xs text-muted\">\n\t\t\t\t\t\t{t(\"rendering started — you'll get a notification when your clip is ready.\")}\n\t\t\t\t\t</p>\n\t\t\t\t{/if}\n\t\t\t{/if}\n\n\t\t\t{#if errorMsg}\n\t\t\t\t<p class=\"mt-3 text-center text-xs text-red\">{errorMsg}</p>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t<!-- generate footer (grid view only) -->\n\t\t{#if !selected && (post.animationAllowed ?? false) && viewerLoggedIn}\n\t\t\t<div class=\"border-t border-border px-5 py-4\">\n\t\t\t\t{#if generateOpen}\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tbind:value={prompt}\n\t\t\t\t\t\tmaxlength={ANIMATION_PROMPT_MAX_LENGTH}\n\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\tclass=\"w-full resize-none rounded-xl border border-border bg-bg px-3 py-2.5 text-sm text-white focus:border-muted focus:outline-none\"\n\t\t\t\t\t></textarea>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={submitAnimate}\n\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\tclass=\"mt-2 flex w-full items-center justify-center gap-1.5 rounded-xl bg-pink px-5 py-3 font-display text-sm font-bold text-white transition-opacity hover:opacity-90 disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{submitting ? t('starting…') : t('animate')}\n\t\t\t\t\t\t{#if !submitting}\n\t\t\t\t\t\t\t<span class=\"flex items-center gap-1\"><TokenCoin size={14} /> {ANIMATE_COST}</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</button>\n\t\t\t\t{:else}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => (generateOpen = true)}\n\t\t\t\t\t\tclass=\"flex w-full items-center justify-center gap-1.5 rounded-xl bg-pink px-5 py-3 font-display text-sm font-bold text-white transition-opacity hover:opacity-90\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('generate your own')}\n\t\t\t\t\t\t<span class=\"flex items-center gap-1\"><TokenCoin size={14} /> {ANIMATE_COST}</span>\n\t\t\t\t\t</button>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t{/if}\n\t</div>\n</div>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport { goto } from '$app/navigation';\n\n\tinterface Props {\n\t\tpostId: string;\n\t\tinitialLiked: boolean;\n\t\tinitialCount: number;\n\t\tviewerLoggedIn: boolean;\n\t}\n\n\tlet { postId, initialLiked, initialCount, viewerLoggedIn }: Props = $props();\n\n\tlet liked = $state(initialLiked);\n\tlet count = $state(initialCount);\n\tlet pending = $state(false);\n\n\tasync function toggle() {\n\t\tif (!viewerLoggedIn) {\n\t\t\tgoto(`/auth/sign-in?next=/post/${postId}`);\n\t\t\treturn;\n\t\t}\n\t\tif (pending) return;\n\t\tpending = true;\n\t\tconst wantLiked = !liked;\n\t\t// Optimistic — flip first, snap back on error.\n\t\tliked = wantLiked;\n\t\tcount = Math.max(0, count + (wantLiked ? 1 : -1));\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/post/${postId}/like`, {\n\t\t\t\tmethod: wantLiked ? 'POST' : 'DELETE'\n\t\t\t});\n\t\t\tif (!res.ok) {\n\t\t\t\tliked = !wantLiked;\n\t\t\t\tcount = Math.max(0, count + (wantLiked ? -1 : 1));\n\t\t\t}\n\t\t} catch {\n\t\t\tliked = !wantLiked;\n\t\t\tcount = Math.max(0, count + (wantLiked ? -1 : 1));\n\t\t} finally {\n\t\t\tpending = false;\n\t\t}\n\t}\n</script>\n\n<button\n\ttype=\"button\"\n\tonclick={toggle}\n\tclass=\"inline-flex items-center gap-1.5 text-sm text-muted transition-colors hover:text-accent disabled:opacity-50 {liked\n\t\t? 'text-accent'\n\t\t: ''}\"\n\taria-pressed={liked}\n\taria-label={liked ? t('unlike') : t('like')}\n\tdisabled={pending}\n>\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\tclass=\"h-5 w-5\"\n\t\tfill={liked ? 'currentColor' : 'none'}\n\t\tstroke=\"currentColor\"\n\t\tstroke-width=\"2\"\n\t\tstroke-linecap=\"round\"\n\t\tstroke-linejoin=\"round\"\n\t>\n\t\t<path\n\t\t\td=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"\n\t\t/>\n\t</svg>\n\t<span class=\"tabular-nums\">{count}</span>\n</button>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport PostCard from '$lib/components/post/PostCard.svelte';\n\timport AnimateModal from '$lib/components/post/AnimateModal.svelte';\n\timport UserBadge from '$lib/components/UserBadge.svelte';\n\timport LikeButton from '$lib/components/post/LikeButton.svelte';\n\timport CommentInput from '$lib/components/post/CommentInput.svelte';\n\timport CommentSection from '$lib/components/post/CommentSection.svelte';\n\timport LinkifiedText from '$lib/components/post/LinkifiedText.svelte';\n\timport DuelAvatar from '$lib/components/duel/DuelAvatar.svelte';\n\timport { getAvatarUrl } from '$lib/avatar';\n\timport { shareOrCopy } from '$lib/share';\n\timport { trackShare } from '$lib/analytics';\n\timport type { CommentView } from '$lib/types/post';\n\n\tlet { data } = $props();\n\t// RAT-176 follow-up: the post may be gone (removed / creator banned). `p` is\n\t// null in that case and the template renders a graceful pane instead.\n\tconst p = $derived(data.notFound ? null : data.post);\n\n\t// Gallery deep link (?animation=<id>): open the animation modal on load,\n\t// straight on the linked clip — works on both the mobile and desktop layout\n\t// because the modal renders at page level, independent of PostCard. Seeded\n\t// via $effect (not the initializer) so client-side navs resync (RAT-117).\n\tlet deepLinkAnimOpen = $state(false);\n\t$effect(() => {\n\t\tdeepLinkAnimOpen = !data.notFound && !!data.openAnimationId;\n\t});\n\n\t// RAT-312: native share on the desktop two-column layout (the mobile path\n\t// uses PostCard's own footer button). shareOrCopy must run synchronously in\n\t// the click handler so iOS keeps the user-activation token.\n\tlet shareCopied = $state(false);\n\tlet shareTimer: ReturnType<typeof setTimeout> | null = null;\n\n\tfunction sharePost() {\n\t\tif (!p) return;\n\t\tconst url =\n\t\t\ttypeof window === 'undefined'\n\t\t\t\t? `/post/${p.id}`\n\t\t\t\t: (() => {\n\t\t\t\t\t\tconst u = new URL(`/post/${p.id}`, window.location.origin);\n\t\t\t\t\t\tu.searchParams.set('utm_source', 'post_share');\n\t\t\t\t\t\treturn u.toString();\n\t\t\t\t\t})();\n\t\tconst title = p.creator.nickname ? t('@{name} on ratemyd', { name: p.creator.nickname }) : 'ratemyd';\n\t\tshareOrCopy({ url, title, text: p.caption ?? undefined }).then((result) => {\n\t\t\tif (result === 'shared') trackShare('native', 'post');\n\t\t\tif (result === 'copied') {\n\t\t\t\ttrackShare('clipboard', 'post');\n\t\t\t\tshareCopied = true;\n\t\t\t\tif (shareTimer) clearTimeout(shareTimer);\n\t\t\t\tshareTimer = setTimeout(() => (shareCopied = false), 2000);\n\t\t\t}\n\t\t});\n\t}\n\n\t// RAT-117 pattern: writable $derived keeps the local list synced with\n\t// the server snapshot (invalidateAll() updates data.comments → derived\n\t// snaps back to the fresh server list), while in-page mutations\n\t// (appendComment, deleteComment) temporarily override the derived value\n\t// until the next data refresh. Plain `$state(data.comments)` would\n\t// capture the initial value once and freeze on reload.\n\tlet comments: CommentView[] = $derived(data.notFound ? [] : data.comments);\n\n\t// RAT-315: no auto-scroll on open. The old RAT-294 behavior jumped the\n\t// page to the bottom (comment input) on every load — fine for a feed tap,\n\t// but wrong for a shared link: the viewer landed on a black gap below the\n\t// post and had to scroll up. The post itself must be the first view; the\n\t// comment input is a scroll away, as expected.\n\n\t// Delete/report/reactions live inside CommentSection now. Appending to the\n\t// page-level array is enough to reach it: the section's writable-$derived\n\t// list resnaps when this (new) array flows down as its initialComments.\n\tlet replyTarget = $state<CommentView | null>(null);\n\n\tfunction appendCommentFromInput(c: CommentView) {\n\t\tcomments = [...comments, c];\n\t}\n\n\tfunction fmtDate(d: string) {\n\t\tconst date = new Date(d);\n\t\tconst ms = Date.now() - date.getTime();\n\t\tconst m = Math.floor(ms / 60000);\n\t\tif (m < 1) return t('just now');\n\t\tif (m < 60) return t('{n}m ago', { n: m });\n\t\tconst h = Math.floor(m / 60);\n\t\tif (h < 24) return t('{n}h ago', { n: h });\n\t\tconst days = Math.floor(h / 24);\n\t\tif (days < 7) return t('{n}d ago', { n: days });\n\t\treturn date.toLocaleDateString();\n\t}\n\n\tconst profileHref = $derived(p?.creator.nickname ? `/u/${p.creator.nickname}` : '#');\n\n\t// Cross-content (activity) post → the LEFT column previews the source\n\t// surface (duel share / arena photo / foil / beat 1v1) and links into it.\n\t// Mirrors the inline card PostCard renders for the feed.\n\tconst crossSourceUrl = $derived.by(() => {\n\t\tif (!p) return null;\n\t\tswitch (p.sourceContentType) {\n\t\t\tcase 'duel': return `/d/${p.sourceContentId}`;\n\t\t\tcase 'generation': return `/rate/result/${p.sourceContentId}`;\n\t\t\tcase 'arena_submission': return `/a/dashboard/${p.sourceContentId}`;\n\t\t\tcase 'beat': return `/b/${p.sourceContentId}`;\n\t\t\tdefault: return null;\n\t\t}\n\t});\n\tconst crossLabel = $derived.by(() => {\n\t\tswitch (p?.kind) {\n\t\t\tcase 'duel_result': return t('duel result');\n\t\t\tcase 'rate_result': return t('rate result');\n\t\t\tcase 'arena_submission': return t('arena submission');\n\t\t\tcase 'beat_me': return t('beat me');\n\t\t\tcase 'partnership': return t('officially a thing');\n\t\t\tdefault: return t('post');\n\t\t}\n\t});\n\tconst crossCta = $derived.by(() => {\n\t\tswitch (p?.kind) {\n\t\t\tcase 'duel_result': return t('see the duel result →');\n\t\t\tcase 'rate_result': return t('see the rate result →');\n\t\t\tcase 'arena_submission': return t('see the arena submission →');\n\t\t\tcase 'beat_me': return t('see the beat me →');\n\t\t\tcase 'partnership': return t('see the officially a thing →');\n\t\t\tdefault: return t('see the post →');\n\t\t}\n\t});\n\tconst crossIcon = $derived.by(() => {\n\t\tswitch (p?.kind) {\n\t\t\tcase 'duel_result': return '⚔️';\n\t\t\tcase 'rate_result': return '⭐';\n\t\t\tcase 'arena_submission': return '🎯';\n\t\t\tcase 'beat_me': return '🥊';\n\t\t\tdefault: return '·';\n\t\t}\n\t});\n\tlet crossImageFailed = $state(false);\n\t// Multi-pic carousel: index of the snapped slide (dots + counter) and the\n\t// container the desktop arrows scroll.\n\tlet slideIndex = $state(0);\n\tlet carouselEl = $state<HTMLDivElement | null>(null);\n\tlet crossImageFailedB = $state(false);\n</script>\n\n<!-- RAT-314: no local <svelte:head>. The root +layout.svelte is the single\n\tsource of OG/twitter/title meta — it reads page.data.seo and absolutizes\n\tthe og:image. A duplicate set here emitted a SECOND, relative og:image\n\t(`/api/duel/…`) alongside the layout's absolute one, which made WhatsApp/\n\tTelegram drop the preview image entirely. -->\n\n{#if data.notFound || !p}\n\t<!-- RAT-176 follow-up: post removed or creator banned/hidden. A graceful\n\t\t \"gone\" pane beats a hard 404 on the notification re-engagement path. -->\n\t<div class=\"mx-auto flex min-h-[70vh] max-w-md flex-col items-center justify-center px-5 text-center\">\n\t\t<h1 class=\"font-display text-[clamp(2rem,7vw,3.5rem)] font-bold tracking-tighter\">\n\t\t\t{t('this post')}<br /><span class=\"text-muted/40\">{t('is gone.')}</span>\n\t\t</h1>\n\t\t<p class=\"mt-4 text-sm text-muted\">\n\t\t\t{t('it was taken down or is no longer available. it happens.')}\n\t\t</p>\n\t\t<a\n\t\t\thref=\"/\"\n\t\t\tclass=\"mt-8 inline-flex rounded-xl bg-blue px-7 py-3.5 font-display text-sm font-semibold text-white no-underline hover:bg-blue/80\"\n\t\t\t>{t('back to ratemyd')}</a\n\t\t>\n\t</div>\n{:else}\n<!-- MOBILE: stacked card, edge-to-edge (PostCard already responsive).\n\t RAT-318: no pb here — `main` already adds calc(68px + safe-area) bottom\n\t padding on mobile to clear the fixed BottomNav (see layout.css). The old\n\t pb-10 doubled that clearance, leaving ~40px of dead scrollable black below\n\t the comment input. Desktop keeps its pb-10 (no bottom nav there). -->\n{#snippet postedIn()}\n\t{#if !data.notFound && data.niches.length > 0}\n\t\t<p class=\"mb-3 text-xs text-muted\">\n\t\t\t{t('in')} {#each data.niches as n, i (n.slug)}{i > 0 ? ', ' : ''}<a\n\t\t\t\t\thref={`/n/${n.slug}`}\n\t\t\t\t\tclass=\"font-semibold text-text no-underline hover:text-accent\">{n.name}</a\n\t\t\t\t>{/each}\n\t\t</p>\n\t{/if}\n{/snippet}\n<div class=\"mx-auto max-w-2xl px-5 pt-16 lg:pt-28 lg:hidden\">\n\t{@render postedIn()}\n\t<div class=\"-mx-5 sm:mx-0\">\n\t\t<PostCard\n\t\t\tpost={p}\n\t\t\tviewerLoggedIn={!!data.user}\n\t\t\tviewerId={data.user?.id ?? null}\n\t\t\texpanded\n\t\t\tinitialComments={data.comments}\n\t\t/>\n\t</div>\n</div>\n\n<!-- DESKTOP: 2-column detail view, media left + comments right.\n\t Falls back to PostCard for text-only posts (no media to fill the left col).\n\t Cross-content (activity) posts keep the 2-col layout — their preview goes\n\t into the left media column via crossImageUrl below. -->\n<div class=\"hidden lg:block\">\n\t<div class=\"mx-auto max-w-6xl px-5 pt-16 pb-10 lg:pt-28\">\n\t\t{@render postedIn()}\n\t\t{#if p.kind === 'text' || p.kind === 'tierlist' || p.kind === 'partnership'}\n\t\t\t<!-- tierlist + partnership join text here: no media for the left\n\t\t\t\t column, the card renders the whole block itself. -->\n\t\t\t<div class=\"mx-auto max-w-2xl\">\n\t\t\t\t<PostCard\n\t\t\t\t\tpost={p}\n\t\t\t\t\tviewerLoggedIn={!!data.user}\n\t\t\t\t\tviewerId={data.user?.id ?? null}\n\t\t\t\t\texpanded\n\t\t\t\t\tinitialComments={data.comments}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t{:else}\n\t\t\t<article class=\"grid grid-cols-[minmax(0,1.4fr)_minmax(360px,1fr)] overflow-hidden rounded-2xl border border-border bg-surface\">\n\t\t\t\t<!-- LEFT: media on a solid dark surface. RAT-212: blurred fill\n\t\t\t\t\t backdrop dropped (double-load flash on mobile, marginal value\n\t\t\t\t\t on desktop). Foreground image renders centered. -->\n\t\t\t\t<div class=\"relative aspect-square overflow-hidden bg-[#0a0a0a]\">\n\t\t\t\t\t{#if p.kind === 'image' && p.mediaUrl && (p.extraMedia?.length ?? 0) > 0}\n\t\t\t\t\t\t{@const slides = [\n\t\t\t\t\t\t\t{ url: p.mediaUrl, width: p.mediaWidth, height: p.mediaHeight },\n\t\t\t\t\t\t\t...(p.extraMedia ?? [])\n\t\t\t\t\t\t]}\n\t\t\t\t\t\t<!-- Multi-pic: same scroll-snap carousel as the feed card. -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tbind:this={carouselEl}\n\t\t\t\t\t\t\tclass=\"flex h-full w-full snap-x snap-mandatory overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n\t\t\t\t\t\t\tonscroll={(e) => {\n\t\t\t\t\t\t\t\tconst el = e.currentTarget;\n\t\t\t\t\t\t\t\tslideIndex = Math.min(\n\t\t\t\t\t\t\t\t\tslides.length - 1,\n\t\t\t\t\t\t\t\t\tMath.max(0, Math.round(el.scrollLeft / el.clientWidth))\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#each slides as img, i (i)}\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={img.url}\n\t\t\t\t\t\t\t\t\talt={p.caption ?? t('post')}\n\t\t\t\t\t\t\t\t\tclass=\"relative h-full w-full flex-none snap-center object-contain\"\n\t\t\t\t\t\t\t\t\twidth={img.width ?? undefined}\n\t\t\t\t\t\t\t\t\theight={img.height ?? undefined}\n\t\t\t\t\t\t\t\t\tloading={i > 0 ? 'lazy' : undefined}\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<span\n\t\t\t\t\t\t\tclass=\"pointer-events-none absolute top-3 left-3 rounded-full bg-bg/60 px-2 py-0.5 font-display text-[11px] font-bold text-white backdrop-blur\"\n\t\t\t\t\t\t\t>{slideIndex + 1}/{slides.length}</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"pointer-events-none absolute bottom-2 left-1/2 flex -translate-x-1/2 gap-1.5\">\n\t\t\t\t\t\t\t{#each slides as _, i (i)}\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"h-1.5 w-1.5 rounded-full {i === slideIndex ? 'bg-white' : 'bg-white/35'}\"\n\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- This split view is desktop-only, so the paging arrows always show. -->\n\t\t\t\t\t\t{#if slideIndex > 0}\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=\"absolute top-1/2 left-2 flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full bg-black/35 text-white backdrop-blur transition-colors hover:bg-black/60\"\n\t\t\t\t\t\t\t\taria-label={t('previous image')}\n\t\t\t\t\t\t\t\tonclick={() => carouselEl?.scrollBy({ left: -carouselEl.clientWidth, behavior: 'smooth' })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\" /></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{#if slideIndex < slides.length - 1}\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=\"absolute top-1/2 right-2 flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full bg-black/35 text-white backdrop-blur transition-colors hover:bg-black/60\"\n\t\t\t\t\t\t\t\taria-label={t('next image')}\n\t\t\t\t\t\t\t\tonclick={() => carouselEl?.scrollBy({ left: carouselEl.clientWidth, behavior: 'smooth' })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\" /></svg>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{:else if p.kind === 'image' && p.mediaUrl}\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={p.mediaUrl}\n\t\t\t\t\t\t\talt={p.caption ?? t('post')}\n\t\t\t\t\t\t\tclass=\"relative h-full w-full object-contain\"\n\t\t\t\t\t\t\twidth={p.mediaWidth ?? undefined}\n\t\t\t\t\t\t\theight={p.mediaHeight ?? undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t{:else if p.kind === 'video' && p.mediaUrl}\n\t\t\t\t\t\t<!-- svelte-ignore a11y_media_has_caption -->\n\t\t\t\t\t\t<video\n\t\t\t\t\t\t\tsrc={p.mediaUrl}\n\t\t\t\t\t\t\tposter={p.mediaPosterUrl ?? undefined}\n\t\t\t\t\t\t\tcontrols\n\t\t\t\t\t\t\tplaysinline\n\t\t\t\t\t\t\tclass=\"relative h-full w-full object-contain\"\n\t\t\t\t\t\t\twidth={p.mediaWidth ?? undefined}\n\t\t\t\t\t\t\theight={p.mediaHeight ?? undefined}\n\t\t\t\t\t\t></video>\n\t\t\t\t\t{:else if p.kind === 'link' && p.linkUrl}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={p.linkUrl}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclass=\"relative flex h-full w-full flex-col justify-center gap-3 p-8\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#if p.linkOgImageUrl}\n\t\t\t\t\t\t\t\t<img src={p.linkOgImageUrl} alt=\"\" class=\"max-h-72 w-full rounded-xl object-cover\" />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t{#if p.linkOgSiteName}\n\t\t\t\t\t\t\t\t\t<div class=\"text-[11px] uppercase tracking-wider text-muted/60\">{p.linkOgSiteName}</div>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t<div class=\"mt-0.5 text-base font-semibold text-text\">{p.linkOgTitle ?? p.linkUrl}</div>\n\t\t\t\t\t\t\t\t{#if p.linkOgDesc}\n\t\t\t\t\t\t\t\t\t<p class=\"mt-1 line-clamp-3 text-sm text-muted\">{p.linkOgDesc}</p>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t<div class=\"mt-2 truncate text-[11px] text-muted/60\">{p.linkUrl}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t{:else if p.kind === 'beat_me' && p.crossImageUrl && !crossImageFailed && p.crossImageUrlB && !crossImageFailedB}\n\t\t\t\t\t\t<!-- beat 1v1 split: A | B. Either side may be a video — swap to\n\t\t\t\t\t\t\t <video> when the resolver flagged it. `#t=0.1` forces the\n\t\t\t\t\t\t\t browser to decode + display the first frame so the tile\n\t\t\t\t\t\t\t isn't a black square (preload=metadata alone fetches\n\t\t\t\t\t\t\t duration/dims but no frames). -->\n\t\t\t\t\t\t<a href={crossSourceUrl ?? '#'} class=\"absolute inset-0 grid grid-cols-2 gap-px bg-[#0a0a0a]\">\n\t\t\t\t\t\t\t<div class=\"relative bg-[#0a0a0a]\">\n\t\t\t\t\t\t\t\t{#if p.crossMediaType === 'video'}\n\t\t\t\t\t\t\t\t\t<!-- svelte-ignore a11y_media_has_caption -->\n\t\t\t\t\t\t\t\t\t<video src=\"{p.crossImageUrl}#t=0.1\" preload=\"metadata\" muted playsinline onerror={() => (crossImageFailed = true)} class=\"absolute inset-0 h-full w-full object-contain\"></video>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<img src={p.crossImageUrl} alt={t('{label} side A', { label: crossLabel })} onerror={() => (crossImageFailed = true)} class=\"absolute inset-0 h-full w-full object-contain\" />\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\t<div class=\"relative bg-[#0a0a0a]\">\n\t\t\t\t\t\t\t\t{#if p.crossMediaTypeB === 'video'}\n\t\t\t\t\t\t\t\t\t<!-- svelte-ignore a11y_media_has_caption -->\n\t\t\t\t\t\t\t\t\t<video src=\"{p.crossImageUrlB}#t=0.1\" preload=\"metadata\" muted playsinline onerror={() => (crossImageFailedB = true)} class=\"absolute inset-0 h-full w-full object-contain\"></video>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<img src={p.crossImageUrlB} alt={t('{label} side B', { label: crossLabel })} onerror={() => (crossImageFailedB = true)} class=\"absolute inset-0 h-full w-full object-contain\" />\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</a>\n\t\t\t\t\t{:else if p.crossImageUrl && !crossImageFailed}\n\t\t\t\t\t\t<!-- Activity preview: duel share card / arena photo / foil PNG /\n\t\t\t\t\t\t\t single beat side (image or video). -->\n\t\t\t\t\t\t<a href={crossSourceUrl ?? '#'} class=\"absolute inset-0 block\">\n\t\t\t\t\t\t\t{#if p.crossMediaType === 'video'}\n\t\t\t\t\t\t\t\t<!-- svelte-ignore a11y_media_has_caption -->\n\t\t\t\t\t\t\t\t<video src=\"{p.crossImageUrl}#t=0.1\" preload=\"metadata\" muted playsinline onerror={() => (crossImageFailed = true)} class=\"absolute inset-0 h-full w-full object-contain\"></video>\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<img src={p.crossImageUrl} alt={t('{label} preview', { label: crossLabel })} onerror={() => (crossImageFailed = true)} class=\"absolute inset-0 h-full w-full object-contain\" />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t{:else if p.crossFallback?.kind === 'generation_score'}\n\t\t\t\t\t\t<!-- Orphan rate result: foil PNG never rendered + no saved photo.\n\t\t\t\t\t\t\t Render a synthetic score card so the preview is never blank. -->\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={crossSourceUrl ?? '#'}\n\t\t\t\t\t\t\tclass=\"absolute inset-0 flex flex-col items-center justify-center gap-2\"\n\t\t\t\t\t\t\tstyle:background={p.crossFallback.mode === 'hype'\n\t\t\t\t\t\t\t\t? 'radial-gradient(60% 50% at 50% 35%, var(--color-accent-light), transparent 70%), linear-gradient(160deg, #0c1f12 0%, #0a0a0a 100%)'\n\t\t\t\t\t\t\t\t: 'radial-gradient(60% 50% at 50% 35%, rgba(59,130,246,.22), transparent 70%), linear-gradient(160deg, #0c1322 0%, #0a0a0a 100%)'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"font-mono text-[10px] uppercase tracking-[0.25em] text-muted\">{p.crossFallback.mode}</span>\n\t\t\t\t\t\t\t<div class=\"flex items-baseline gap-1\">\n\t\t\t\t\t\t\t\t<span class=\"font-display text-7xl font-extrabold leading-none tracking-tighter text-text tabular-nums\">{p.crossFallback.score.toFixed(1)}</span>\n\t\t\t\t\t\t\t\t<span class=\"text-lg text-muted\">/10</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span class=\"mt-2 font-display text-xs font-semibold text-text\">{t('see the rate result →')}</span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t{:else if p.sourceContentType}\n\t\t\t\t\t\t<!-- Source exists but no preview yet (e.g. foil PNG pending render\n\t\t\t\t\t\t\t + no saved photo). Show an icon-only card pointing to the\n\t\t\t\t\t\t\t source — matches the PostCard fallback. -->\n\t\t\t\t\t\t<a href={crossSourceUrl ?? '#'} class=\"absolute inset-0 flex flex-col items-center justify-center gap-3 text-muted\">\n\t\t\t\t\t\t\t<div class=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-surface-2 text-3xl\">{crossIcon}</div>\n\t\t\t\t\t\t\t<div class=\"font-display text-sm font-semibold text-text\">{crossCta}</div>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\n\t\t\t\t<!-- RIGHT: header / caption + comments / actions / input -->\n\t\t\t\t<div class=\"flex max-h-[80vh] flex-col border-l border-border\">\n\t\t\t\t\t<header class=\"flex shrink-0 items-center gap-2.5 border-b border-border px-4 py-3\">\n\t\t\t\t\t\t<DuelAvatar\n\t\t\t\t\t\t\tnickname={p.creator.nickname}\n\t\t\t\t\t\t\tavatarUrl={getAvatarUrl(p.creator.avatarPath)}\n\t\t\t\t\t\t\tsize={40}\n\t\t\t\t\t\t\thref={profileHref}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<div class=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t<a href={profileHref} class=\"truncate text-sm font-semibold text-text hover:text-accent\">\n\t\t\t\t\t\t\t\t\t@{p.creator.nickname ?? t('[deleted]')}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t<UserBadge rater={p.creator.isRater} verified={p.creator.isVerified} subscriber={p.creator.isSubscriber} size={13} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"text-[11px] text-muted\">{fmtDate(p.createdAt)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</header>\n\n\t\t\t\t\t<div class=\"comments-scroll flex-1 space-y-3 overflow-y-auto px-4 py-3\">\n\t\t\t\t\t\t{#if p.caption}\n\t\t\t\t\t\t\t<div class=\"flex items-start gap-2.5\">\n\t\t\t\t\t\t\t\t<DuelAvatar\n\t\t\t\t\t\t\t\t\tnickname={p.creator.nickname}\n\t\t\t\t\t\t\t\t\tavatarUrl={getAvatarUrl(p.creator.avatarPath)}\n\t\t\t\t\t\t\t\t\tsize={28}\n\t\t\t\t\t\t\t\t\thref={profileHref}\n\t\t\t\t\t\t\t\t\tlink={false}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<div class=\"min-w-0 flex-1 text-[13px] leading-snug\">\n\t\t\t\t\t\t\t\t\t<a href={profileHref} class=\"font-semibold text-text hover:text-accent\">\n\t\t\t\t\t\t\t\t\t\t@{p.creator.nickname ?? t('[deleted]')}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t<UserBadge rater={p.creator.isRater} verified={p.creator.isVerified} subscriber={p.creator.isSubscriber} size={12} />\n\t\t\t\t\t\t\t\t\t<p class=\"mt-0.5 break-words whitespace-pre-wrap text-text\">\n\t\t\t\t\t\t\t\t\t\t<LinkifiedText text={p.caption} />\n\t\t\t\t\t\t\t\t\t</p>\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\n\t\t\t\t\t\t{#if p.sourceContentType && crossSourceUrl}\n\t\t\t\t\t\t\t<!-- Cross-content CTA — pointer into the source surface (duel/arena/\n\t\t\t\t\t\t\t\t rate/beat result page). Same affordance the mobile PostCard\n\t\t\t\t\t\t\t\t renders under the preview image. -->\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={crossSourceUrl}\n\t\t\t\t\t\t\t\tclass=\"flex items-center gap-3 rounded-xl border border-border bg-surface-2/40 p-3 no-underline transition-colors hover:border-muted/60\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-surface-2 text-xl\">{crossIcon}</div>\n\t\t\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t<div class=\"font-mono text-[10px] uppercase tracking-widest text-muted\">{crossLabel}</div>\n\t\t\t\t\t\t\t\t\t<div class=\"font-display text-sm font-semibold text-text\">{crossCta}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<CommentSection\n\t\t\t\t\t\t\tbind:replyTarget\n\t\t\t\t\t\t\tpostId={p.id}\n\t\t\t\t\t\t\tviewerLoggedIn={!!data.user}\n\t\t\t\t\t\t\tviewerId={data.user?.id ?? null}\n\t\t\t\t\t\t\tpostCreatorId={p.creator.id}\n\t\t\t\t\t\t\tinitialComments={comments}\n\t\t\t\t\t\t\twithInput={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"flex shrink-0 items-center gap-5 border-t border-border px-4 py-3\">\n\t\t\t\t\t\t<LikeButton\n\t\t\t\t\t\t\tpostId={p.id}\n\t\t\t\t\t\t\tinitialLiked={p.viewerLiked}\n\t\t\t\t\t\t\tinitialCount={p.likeCount}\n\t\t\t\t\t\t\tviewerLoggedIn={!!data.user}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span class=\"inline-flex items-center gap-1.5 text-sm text-muted\">\n\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t<path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span class=\"tabular-nums\">{p.commentCount}</span>\n\t\t\t\t\t\t</span>\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={sharePost}\n\t\t\t\t\t\t\tclass=\"ml-auto inline-flex items-center gap-1.5 text-sm text-muted hover:text-text\"\n\t\t\t\t\t\t\taria-label={t('share post')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#if shareCopied}\n\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-5 w-5 text-accent\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<path d=\"M20 6L9 17l-5-5\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t<span class=\"text-accent\">{t('link copied')}</span>\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t\t\t\t\t<circle cx=\"18\" cy=\"5\" r=\"3\" /><circle cx=\"6\" cy=\"12\" r=\"3\" /><circle cx=\"18\" cy=\"19\" r=\"3\" />\n\t\t\t\t\t\t\t\t\t<line x1=\"8.6\" y1=\"13.5\" x2=\"15.4\" y2=\"17.5\" /><line x1=\"15.4\" y1=\"6.5\" x2=\"8.6\" y2=\"10.5\" />\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t<span>{t('share')}</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<CommentInput\n\t\t\t\t\t\tpostId={p.id}\n\t\t\t\t\t\tviewerLoggedIn={!!data.user}\n\t\t\t\t\t\tonposted={appendCommentFromInput}\n\t\t\t\t\t\treplyTo={replyTarget}\n\t\t\t\t\t\tonclearreply={() => (replyTarget = null)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</article>\n\t\t{/if}\n\t</div>\n</div>\n{/if}\n\n{#if deepLinkAnimOpen && p}\n\t<AnimateModal\n\t\tpost={p}\n\t\tviewerLoggedIn={!!data.user}\n\t\tinitialClipId={data.openAnimationId}\n\t\tonclose={() => (deepLinkAnimOpen = false)}\n\t/>\n{/if}\n\n<style>\n\t/* Thin, muted scrollbar on the desktop comment column — the default bar\n\t   rendered as a fat white slab down the middle of the split view. */\n\t.comments-scroll {\n\t\tscrollbar-width: thin;\n\t\tscrollbar-color: var(--color-border) transparent;\n\t}\n\t.comments-scroll::-webkit-scrollbar {\n\t\twidth: 5px;\n\t}\n\t.comments-scroll::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\t.comments-scroll::-webkit-scrollbar-thumb {\n\t\tbackground: var(--color-border);\n\t\tborder-radius: 3px;\n\t}\n</style>\n"],"version":3}