{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4bd1-7b13-9f15-3f8b5edf41d1","file":"BLJsJtPK.mjs","mappings":"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","names":["deleted","previewText","t","$$props","div","root_1","div_1","div_2","div_3","button","classes","$.set_class","$2","$$args","button_1","root_2","div_4","div_5","div_6","classes_1","$$render","consequent","alternate","anchor","popLeft","$.state","popWidth","popBottom","recalc","r","$.user_effect","onScrollOrResize","portal","node","placeholder","filtered","$.derived","c","activeIdx","$.set","handleKeydown","e","$.get","pick","node_2","$.child","$.each","node_3","i","av","getAvatarUrl","root_3","node_4","img","root_4","$.template_effect","$.set_attribute","span","root_5","$0","$.set_text","text","span_1","$.sibling","$.reset","text_1","$.delegated","$.append","$$anchor","root_6","consequent_1","alternate_1","$.action","$$node","styles","$.set_style","consequent_2"],"sources":["../../../../../../src/lib/components/chat/ReplyQuote.svelte","../../../../../../src/lib/components/chat/MentionAutocomplete.svelte"],"sourcesContent":["<script lang=\"ts\">\n\t/** RAT-350: quote block that appears\n\t *    (a) above a message bubble when that message has a replyTo,\n\t *    (b) above the composer textarea when the viewer is replying.\n\t *\n\t *  Same component for both — variant 'bubble' renders a thin left-rule\n\t *  preview (tap → scroll to parent); variant 'composer' adds a close\n\t *  button to clear the reply intent.\n\t *\n\t *  The body is truncated to one line; media-only parents show a label\n\t *  (\"image\", \"video\", \"voice note\") instead.\n\t */\n\timport { t } from '$lib/i18n';\n\n\ttype Props = {\n\t\tvariant: 'bubble' | 'composer';\n\t\tsenderLabel: string;\n\t\tkind: string;\n\t\tbody: string | null;\n\t\tmediaMime: string | null;\n\t\t// RAT-395: the quoted parent was deleted → show \"message deleted\" instead\n\t\t// of the (now blanked) body/kind.\n\t\tdeleted?: boolean;\n\t\tonTap?: () => void;\n\t\tonClear?: () => void;\n\t};\n\n\tlet { variant, senderLabel, kind, body, mediaMime, deleted = false, onTap, onClear }: Props =\n\t\t$props();\n\n\tfunction previewText(): string {\n\t\tif (deleted) return t('message deleted');\n\t\tif (kind === 'text' || kind === 'gif') return body?.replace(/\\s+/g, ' ').slice(0, 140) ?? '';\n\t\tif (kind === 'image') return `📷 ${t('photo')}`;\n\t\tif (kind === 'video') return `🎬 ${t('video')}`;\n\t\tif (kind === 'voice') return `🎙 ${t('voice note')}`;\n\t\tif (kind === 'locked_media') return `🔒 ${t('locked photo')}`;\n\t\tif (kind === 'rate_request' || kind === 'rate_card') return `⭐ ${t('rate card')}`;\n\t\tif (kind === 'system') return `— ${t('system')} —`;\n\t\t// fallback to body or the mime so the chip never goes blank.\n\t\treturn body?.slice(0, 100) ?? mediaMime ?? '';\n\t}\n</script>\n\n{#if variant === 'composer'}\n\t<div class=\"quote composer\">\n\t\t<div class=\"bar\" aria-hidden=\"true\"></div>\n\t\t<div class=\"text\">\n\t\t\t<div class=\"who\">{t('replying to {name}', { name: senderLabel })}</div>\n\t\t\t<div class=\"snippet\" class:is-deleted={deleted}>{previewText()}</div>\n\t\t</div>\n\t\t<button type=\"button\" class=\"close\" aria-label={t('cancel reply')} onclick={onClear}>\n\t\t\t<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n\t\t\t\t<path d=\"M5 5 L15 15 M15 5 L5 15\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n\t\t\t</svg>\n\t\t</button>\n\t</div>\n{:else}\n\t<button type=\"button\" class=\"quote bubble\" onclick={onTap}>\n\t\t<div class=\"bar\" aria-hidden=\"true\"></div>\n\t\t<div class=\"text\">\n\t\t\t<div class=\"who\">{senderLabel}</div>\n\t\t\t<div class=\"snippet\" class:is-deleted={deleted}>{previewText()}</div>\n\t\t</div>\n\t</button>\n{/if}\n\n<style>\n\t.quote {\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tgap: 8px;\n\t\tbackground: var(--color-surface);\n\t\tborder-radius: 10px;\n\t\tpadding: 6px 10px 6px 4px;\n\t\tmax-width: 100%;\n\t\ttext-align: left;\n\t}\n\t.quote.bubble {\n\t\t/* Inline above the bubble. Slightly transparent against the bubble\n\t\t   bg so it feels nested, not a sibling card. */\n\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\tborder: 0;\n\t\tcursor: pointer;\n\t\tmargin-bottom: 4px;\n\t\twidth: 100%;\n\t}\n\t.quote.bubble:hover { background: rgba(255, 255, 255, 0.1); }\n\t.quote.composer {\n\t\tmargin: 0 12px 6px;\n\t\tborder: 1px solid var(--color-border);\n\t}\n\t.bar {\n\t\twidth: 3px;\n\t\tflex-shrink: 0;\n\t\tbackground: var(--color-accent);\n\t\tborder-radius: 2px;\n\t}\n\t.text {\n\t\tmin-width: 0;\n\t\tflex: 1;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\tfont-family: var(--font-body);\n\t\tfont-size: 12px;\n\t\tline-height: 1.25;\n\t\tpadding: 2px 0;\n\t}\n\t.who {\n\t\tfont-weight: 700;\n\t\tcolor: var(--color-accent);\n\t\tfont-size: 11px;\n\t\tletter-spacing: 0.01em;\n\t}\n\t.snippet {\n\t\tcolor: var(--color-text-muted);\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.snippet.is-deleted {\n\t\tfont-style: italic;\n\t\topacity: 0.85;\n\t}\n\t.close {\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tcolor: var(--color-text-muted);\n\t\tcursor: pointer;\n\t\tpadding: 4px 6px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\t.close svg { width: 16px; height: 16px; }\n\t.close:hover { color: var(--color-text); }\n</style>\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t/** RAT-350: lightweight @-mention popover.\n\t *\n\t *  The parent passes:\n\t *    - the candidates (DM = the other user; group = `listRoomMembers`)\n\t *    - the in-progress query (chars typed after `@`)\n\t *    - a callback `onPick(nickname)` to splice the choice into the\n\t *      composer\n\t *\n\t *  We filter / sort here so the parent stays simple; we don't own the\n\t *  textarea or caret — the parent does the splice using `selectionStart`.\n\t */\n\n\ttype Candidate = {\n\t\tuserId: string;\n\t\tnickname: string | null;\n\t\tavatarPath: string | null;\n\t};\n\n\ttype Props = {\n\t\topen: boolean;\n\t\tquery: string;\n\t\tcandidates: Candidate[];\n\t\t// RAT-350 follow-up: the anchor element (textarea / input). We\n\t\t// position the popover with `position: fixed` against this\n\t\t// element's bounding rect so it escapes the chat layout's\n\t\t// `.detail { overflow: hidden }` clipping.\n\t\tanchor?: HTMLElement | null;\n\t\tonPick: (nickname: string) => void;\n\t\tonClose?: () => void;\n\t};\n\n\tlet { open, query, candidates, anchor = null, onPick, onClose }: Props = $props();\n\n\timport { getAvatarUrl } from '$lib/avatar';\n\n\t// Position state — recomputed every time `open` flips on, the anchor\n\t// changes, or the window scrolls/resizes. `left`/`bottom` are CSS px\n\t// for `position: fixed`. We mirror the anchor's horizontal extents\n\t// so the popover stretches over the textarea, then sits just above\n\t// the anchor's top edge.\n\tlet popLeft = $state(0);\n\tlet popWidth = $state(0);\n\tlet popBottom = $state(0);\n\n\tfunction recalc() {\n\t\tif (!open || !anchor) return;\n\t\tconst r = anchor.getBoundingClientRect();\n\t\tpopLeft = r.left;\n\t\tpopWidth = r.width;\n\t\tpopBottom = window.innerHeight - r.top + 8; // 8px gap above the input\n\t}\n\n\t$effect(() => {\n\t\t// Track `open` + the anchor identity. Sync recalc — bind:this is\n\t\t// resolved before $effect runs, so the anchor's rect is laid out\n\t\t// and we don't need an extra tick/rAF round-trip.\n\t\tif (!open) return;\n\t\tvoid anchor;\n\t\trecalc();\n\t});\n\n\tfunction onScrollOrResize() {\n\t\tif (open) recalc();\n\t}\n\n\t/** Portal action — moves the popover to <body> so that no ancestor\n\t *  `overflow: hidden` or `transform` (which would re-anchor\n\t *  position:fixed) can clip it. The chat layout's `.detail` has\n\t *  `overflow: hidden`, and the iOS Safari composer sometimes ends\n\t *  up inside a stacking context that breaks fixed positioning;\n\t *  portaling to body sidesteps both. */\n\tfunction portal(node: HTMLElement) {\n\t\t// RAT-372: portaling to <body> escapes the chat layout's overflow /\n\t\t// transform clipping — but moving the node out of its Svelte-managed slot\n\t\t// made Svelte's teardown of the enclosing {#if} choke (it tried to remove\n\t\t// the node from a parent it no longer lived in). That error aborted the\n\t\t// unmount of the WHOLE chat surface, leaving the inbox overlaying other\n\t\t// routes and swallowing their scroll. Leaving a comment placeholder in the\n\t\t// original slot keeps Svelte's removal pointed at a node that's actually\n\t\t// there; we remove the real (moved) node + the placeholder ourselves.\n\t\tconst placeholder = document.createComment('mention-portal');\n\t\tnode.parentNode?.replaceChild(placeholder, node);\n\t\tdocument.body.appendChild(node);\n\t\treturn {\n\t\t\tdestroy() {\n\t\t\t\tnode.remove();\n\t\t\t\tplaceholder.remove();\n\t\t\t}\n\t\t};\n\t}\n\n\t// Filter by case-insensitive prefix on nickname. Surface up to 6.\n\tlet filtered = $derived(\n\t\tcandidates\n\t\t\t.filter((c) => !!c.nickname && c.nickname.toLowerCase().startsWith(query.toLowerCase()))\n\t\t\t.slice(0, 6)\n\t);\n\n\t// Keyboard nav — Up/Down rotates, Enter/Tab picks the focused row.\n\tlet activeIdx = $state(0);\n\t$effect(() => {\n\t\t// reset when the query changes — the list shifts under us\n\t\tvoid query;\n\t\tactiveIdx = 0;\n\t});\n\n\tfunction handleKeydown(e: KeyboardEvent) {\n\t\tif (!open || filtered.length === 0) return;\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tactiveIdx = (activeIdx + 1) % filtered.length;\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tactiveIdx = (activeIdx - 1 + filtered.length) % filtered.length;\n\t\t} else if (e.key === 'Enter' || e.key === 'Tab') {\n\t\t\tconst pick = filtered[activeIdx];\n\t\t\tif (pick?.nickname) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonPick(pick.nickname);\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tonClose?.();\n\t\t}\n\t}\n</script>\n\n<svelte:window onkeydown={handleKeydown} onresize={onScrollOrResize} onscroll={onScrollOrResize} />\n\n{#if open && popWidth > 0}\n\t<div\n\t\tclass=\"popover\"\n\t\trole=\"listbox\"\n\t\taria-label={t('mention suggestions')}\n\t\tuse:portal\n\t\tstyle:left=\"{popLeft}px\"\n\t\tstyle:width=\"{popWidth}px\"\n\t\tstyle:bottom=\"{popBottom}px\"\n\t>\n\t\t{#if filtered.length > 0}\n\t\t\t{#each filtered as c, i (c.userId)}\n\t\t\t\t{@const av = getAvatarUrl(c.avatarPath)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"row\"\n\t\t\t\t\tclass:active={i === activeIdx}\n\t\t\t\t\tonmousedown={(e) => {\n\t\t\t\t\t\t// mousedown not click — click fires after the textarea has\n\t\t\t\t\t\t// already lost focus, which we want to keep.\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (c.nickname) onPick(c.nickname);\n\t\t\t\t\t}}\n\t\t\t\t\tonmouseenter={() => (activeIdx = i)}\n\t\t\t\t>\n\t\t\t\t\t{#if av}\n\t\t\t\t\t\t<img class=\"avatar\" src={av} alt=\"\" />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<span class=\"avatar avatar-fallback\" aria-hidden=\"true\">{(c.nickname?.[0] ?? '?').toUpperCase()}</span>\n\t\t\t\t\t{/if}\n\t\t\t\t\t<span class=\"nick\">@{c.nickname}</span>\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t{:else}\n\t\t\t<!-- RAT-350 follow-up: empty state so the user knows the @ is\n\t\t\t\t active but their query doesn't match anyone in this chat. -->\n\t\t\t<div class=\"empty\">{t('no match for \"@{query}\"', { query })}</div>\n\t\t{/if}\n\t</div>\n{/if}\n\n<style>\n\t.popover {\n\t\t/* RAT-350 follow-up: position: fixed so the chat layout's\n\t\t   `.detail { overflow: hidden }` can't clip us. Anchor is\n\t\t   computed from the textarea/input's bounding rect by the\n\t\t   script. */\n\t\tposition: fixed;\n\t\tbackground: var(--color-bg);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 12px;\n\t\tpadding: 4px;\n\t\tbox-shadow: 0 12px 28px -10px rgba(0, 0, 0, 0.6);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmax-height: 240px;\n\t\toverflow-y: auto;\n\t\tz-index: 250;\n\t}\n\t.empty {\n\t\tpadding: 10px 12px;\n\t\tfont-family: var(--font-body);\n\t\tfont-size: 12px;\n\t\tcolor: var(--color-text-muted);\n\t\ttext-align: center;\n\t}\n\t.row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tpadding: 8px 10px;\n\t\tfont-family: var(--font-display);\n\t\tfont-size: 14px;\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-text);\n\t\tcursor: pointer;\n\t\ttext-align: left;\n\t}\n\t.row:hover, .row.active { background: var(--color-surface); }\n\t.avatar {\n\t\twidth: 26px;\n\t\theight: 26px;\n\t\tborder-radius: 50%;\n\t\tobject-fit: cover;\n\t\tflex-shrink: 0;\n\t}\n\t.avatar-fallback {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: var(--color-surface);\n\t\tcolor: var(--color-text-muted);\n\t\tfont-size: 12px;\n\t\tfont-weight: 700;\n\t}\n\t.nick { color: var(--color-accent); }\n</style>\n"],"version":3}