{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4bdb-7f03-bdae-af8213a1c5ec","file":"BjXPCnUf.mjs","mappings":"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","names":["allowSkip","num","n","LOCALE_INFO","locale","open","$.state","q","SORT_TABS","msg","sort","results","$.proxy","loading","searchInputEl","debounceTimer","$.user_effect","query","loadResults","sortTab","$.set","url","res","j","openPicker","$.get","closePicker","pick","clearSelection","e","skip","onBackdropClick","onKeydown","portal","node","placeholder","div","root_1","button","$.child","text","$.reset","button_1","$.sibling","$.set_attribute","$0","t","$.delegated","$.append","$$anchor","button_2","root_2","text_1","$.template_effect","$.set_text","$$props","div_1","root_3","div_2","div_3","button_3","text_2","h3","button_4","root_4","text_4","span","root_5","$$render","consequent_1","alternate_1","div_4","div_5","input","$.remove_input_defaults","$$value","node_4","button_5","root_6","consequent_2","div_6","root_7","tab","button_6","root_8","text_5","$.clsx","consequent_3","div_7","node_5","div_8","root_9","text_6","div_9","root_10","div_10","a","text_8","$1","div_11","root_11","button_7","root_12","div_12","DuelAvatar","node_7","div_13","div_14","div_15","span_1","span_2","root_13","text_11","span_3","root_14","text_12","consequent_6","consequent_7","text_9","consequent_4","consequent_5","alternate_2","div_16","a_1","text_13","node_9","button_8","root_15","text_14","consequent_8","$.action","$$node","$2","consequent_9"],"sources":["../../../../../../src/lib/components/post/NichePicker.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { t, locale, LOCALE_INFO } from '$lib/i18n';\n\timport { msg } from '$lib/i18n/mark';\n\t/**\n\t * RAT-270: NichePicker — dropdown autocomplete for picking a niche to\n\t * post to. Used inside PostComposer when no nicheContext is supplied\n\t * (i.e. on /f home, not on /n/[slug]).\n\t *\n\t * Mobile: bottom sheet that slides up.\n\t * Desktop: popover anchored to the trigger.\n\t *\n\t * Selection state lives in the parent (PostComposer) via two-way binding.\n\t */\n\n\timport type { NicheOption } from '$lib/types/niche';\n\timport DuelAvatar from '$lib/components/duel/DuelAvatar.svelte';\n\n\tinterface Props {\n\t\t/** Selected niche (or null = post without niche). */\n\t\tselected: NicheOption | null;\n\t\t/** Called with the new selection (null = clear). */\n\t\tonSelect: (n: NicheOption | null) => void;\n\t\t/** Whether to show the \"skip — post without niche\" affordance. Defaults\n\t\t *  to true (composer on /f home, where a niche is optional). Surfaces\n\t\t *  that genuinely require a niche (e.g. PostToFeedCta cross-content\n\t\t *  reshares) pass false so the picker doesn't offer a dead-end skip. */\n\t\tallowSkip?: boolean;\n\t\t/** Trigger-pill copy when nothing is selected. The composer's extra-tag\n\t\t *  slots override it (\"+ add a niche\") so they don't read as the primary. */\n\t\tplaceholder?: string;\n\t}\n\n\tlet {\n\t\tselected = $bindable(),\n\t\tonSelect,\n\t\tallowSkip = true,\n\t\tplaceholder\n\t}: Props = $props();\n\tconst num = (n: number) => n.toLocaleString(LOCALE_INFO[locale()].hreflang);\n\n\tlet open = $state(false);\n\tlet q = $state('');\n\t// The same four sub-tabs /f's niche explore uses — 'all' is the full\n\t// directory, so every niche is reachable without typing.\n\ttype SortTab = 'top' | 'trending' | 'new' | 'all';\n\tconst SORT_TABS: { key: SortTab; label: string }[] = [\n\t\t{ key: 'top', label: msg('top') },\n\t\t{ key: 'trending', label: msg('trending') },\n\t\t{ key: 'new', label: msg('new') },\n\t\t{ key: 'all', label: msg('all') }\n\t];\n\tlet sort = $state<SortTab>('top');\n\tlet results = $state<NicheOption[]>([]);\n\tlet loading = $state(false);\n\tlet searchInputEl = $state<HTMLInputElement | null>(null);\n\n\t// Debounce-d search: fires after 200ms of no typing.\n\tlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\t$effect(() => {\n\t\tif (!open) return;\n\t\t// re-read q + sort so the effect tracks both\n\t\tconst query = q;\n\t\tconst s = sort;\n\t\tif (debounceTimer) clearTimeout(debounceTimer);\n\t\tdebounceTimer = setTimeout(() => {\n\t\t\tloadResults(query, s);\n\t\t}, query ? 200 : 0);\n\t\treturn () => {\n\t\t\tif (debounceTimer) clearTimeout(debounceTimer);\n\t\t};\n\t});\n\n\tasync function loadResults(query: string, sortTab: SortTab) {\n\t\tloading = true;\n\t\ttry {\n\t\t\t// 'all' is the full directory (server caps at 500) — the other tabs\n\t\t\t// stay a short list, that's their job.\n\t\t\tconst url = query\n\t\t\t\t? `/api/niches/search?q=${encodeURIComponent(query)}&limit=20`\n\t\t\t\t: `/api/niches/search?sort=${sortTab}&limit=${sortTab === 'all' ? 500 : 20}`;\n\t\t\tconst res = await fetch(url);\n\t\t\tif (!res.ok) {\n\t\t\t\tresults = [];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst j = (await res.json()) as { niches: NicheOption[] };\n\t\t\tresults = j.niches;\n\t\t} catch {\n\t\t\tresults = [];\n\t\t} finally {\n\t\t\tloading = false;\n\t\t}\n\t}\n\n\tfunction openPicker() {\n\t\topen = true;\n\t\tq = '';\n\t\t// Initial top-niches load happens via the $effect above.\n\t\t// Focus the search input after the sheet renders.\n\t\tsetTimeout(() => searchInputEl?.focus(), 50);\n\t}\n\n\tfunction closePicker() {\n\t\topen = false;\n\t\tq = '';\n\t}\n\n\tfunction pick(n: NicheOption) {\n\t\tonSelect(n);\n\t\tclosePicker();\n\t}\n\n\tfunction clearSelection(e: MouseEvent) {\n\t\te.stopPropagation();\n\t\tonSelect(null);\n\t}\n\n\tfunction skip() {\n\t\tonSelect(null);\n\t\tclosePicker();\n\t}\n\n\t// Esc closes\n\tfunction onBackdropClick(e: MouseEvent) {\n\t\tif (e.target === e.currentTarget) closePicker();\n\t}\n\tfunction onKeydown(e: KeyboardEvent) {\n\t\tif (e.key === 'Escape') closePicker();\n\t}\n\n\t// Portal the overlay to <body> so it escapes any transformed/overflow-clipped\n\t// ancestor (duel/feed/result page wrappers) that would otherwise trap this\n\t// fixed overlay in a stacking context BELOW the app nav (z-50) — which hid\n\t// the cancel/skip header and made the picker impossible to close. Mirrors the\n\t// chat MentionAutocomplete pattern: a comment placeholder stays in the\n\t// original slot so Svelte's {#if} teardown removes a node that still lives there.\n\tfunction portal(node: HTMLElement) {\n\t\tconst placeholder = document.createComment('niche-picker-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</script>\n\n<svelte:window onkeydown={onKeydown} />\n\n<!-- TRIGGER PILL -->\n{#if selected}\n\t<div\n\t\tclass=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-accent/10 border border-accent/40 text-accent text-xs font-medium\"\n\t>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={openPicker}\n\t\t\tclass=\"font-semibold no-underline hover:underline\"\n\t\t>/n/{selected.slug}</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonclick={clearSelection}\n\t\t\taria-label={t('clear niche selection')}\n\t\t\tclass=\"hover:text-text transition-colors\"\n\t\t>\n\t\t\t<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n\t\t\t\t<path d=\"M2 2l6 6M8 2l-6 6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n\t\t\t</svg>\n\t\t</button>\n\t</div>\n{:else}\n\t<button\n\t\ttype=\"button\"\n\t\tonclick={openPicker}\n\t\tclass=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-surface-2 border border-border text-muted text-xs hover:text-text hover:border-border-strong transition-colors\"\n\t>\n\t\t<svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\">\n\t\t\t<circle cx=\"5.5\" cy=\"5.5\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.3\" />\n\t\t\t<circle cx=\"5.5\" cy=\"5.5\" r=\"1.2\" fill=\"currentColor\" />\n\t\t</svg>\n\t\t{placeholder ?? t('choose a niche')}\n\t</button>\n{/if}\n\n<!-- CENTERED MODAL -->\n{#if open}\n\t<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_static_element_interactions -->\n\t<!-- z-[220] stacks above PostToFeedCta (z-[210]) which often contains\n\t     this picker, plus all in-page chat/sticky inputs. -->\n\t<div\n\t\tuse:portal\n\t\tclass=\"fixed inset-0 z-[220] flex items-center justify-center bg-bg/80 backdrop-blur-sm p-4\"\n\t\tonclick={onBackdropClick}\n\t>\n\t\t<div\n\t\t\tclass=\"w-full max-w-md bg-surface border border-border rounded-2xl shadow-soft max-h-[85dvh] flex flex-col\"\n\t\t>\n\t\t\t<!-- header -->\n\t\t\t<div class=\"px-4 py-3 border-b border-border flex items-center justify-between\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonclick={closePicker}\n\t\t\t\t\tclass=\"text-sm text-muted hover:text-text\"\n\t\t\t\t>{t('cancel')}</button>\n\t\t\t\t<h3 class=\"font-display font-semibold text-base\">{t('pick a niche')}</h3>\n\t\t\t\t{#if allowSkip}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={skip}\n\t\t\t\t\t\tclass=\"text-sm text-muted hover:text-text\"\n\t\t\t\t\t>{t('skip')}</button>\n\t\t\t\t{:else}\n\t\t\t\t\t<!-- keep the header title centered when skip is hidden -->\n\t\t\t\t\t<span class=\"w-[2.5rem]\" aria-hidden=\"true\"></span>\n\t\t\t\t{/if}\n\t\t\t</div>\n\n\t\t\t<!-- search input -->\n\t\t\t<div class=\"px-4 py-3 border-b border-border\">\n\t\t\t\t<div class=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-bg border border-border focus-within:border-accent\">\n\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"text-muted\">\n\t\t\t\t\t\t<circle cx=\"6\" cy=\"6\" r=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n\t\t\t\t\t\t<path d=\"M9 9l3 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<input\n\t\t\t\t\t\tbind:this={searchInputEl}\n\t\t\t\t\t\tbind:value={q}\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tinputmode=\"search\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tclass=\"flex-1 appearance-none border-0 bg-transparent p-0 text-sm outline-none placeholder:text-muted focus:ring-0\"\n\t\t\t\t\t\tplaceholder={t('search or pick…')}\n\t\t\t\t\t/>\n\t\t\t\t\t{#if q}\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={() => (q = '')}\n\t\t\t\t\t\t\taria-label={t('clear search')}\n\t\t\t\t\t\t\tclass=\"text-muted hover:text-text\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path d=\"M3 3l6 6M9 3l-6 6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- sort tabs — hidden while searching (search = relevance, like /f) -->\n\t\t\t{#if !q}\n\t\t\t\t<div class=\"px-4 pt-2 pb-1 flex items-center gap-1.5\">\n\t\t\t\t\t{#each SORT_TABS as tab (tab.key)}\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={() => (sort = tab.key)}\n\t\t\t\t\t\t\tclass={sort === tab.key\n\t\t\t\t\t\t\t\t? 'px-2.5 py-1 rounded-md bg-accent text-bg text-[11px] font-semibold'\n\t\t\t\t\t\t\t\t: 'px-2.5 py-1 rounded-md bg-surface-2 border border-border text-muted text-[11px] hover:text-text transition-colors'}\n\t\t\t\t\t\t>{t(tab.label)}</button>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t<!-- results -->\n\t\t\t<div class=\"flex-1 overflow-y-auto\">\n\t\t\t\t{#if loading && results.length === 0}\n\t\t\t\t\t<div class=\"px-4 py-8 text-center text-xs text-muted\">{t('loading…')}</div>\n\t\t\t\t{:else if results.length === 0}\n\t\t\t\t\t<div class=\"px-4 py-8 text-center\">\n\t\t\t\t\t\t<div class=\"text-sm font-medium\">{t('no niches match \"{q}\"', { q })}</div>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={`/n/new?slug=${encodeURIComponent(q.toLowerCase().replace(/[^a-z0-9-]/g, '-'))}`}\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=\"mt-3 inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-accent text-bg text-xs font-semibold no-underline hover:bg-accent/90 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M6 2v8M2 6h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" /></svg>\n\t\t\t\t\t\t\t{t('create /n/{slug}', { slug: q.toLowerCase().replace(/[^a-z0-9-]/g, '-') })}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<div class=\"py-1\">\n\t\t\t\t\t\t{#each results as n (n.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={() => pick(n)}\n\t\t\t\t\t\t\t\tclass=\"w-full px-4 py-2.5 flex items-center justify-between gap-3 hover:bg-surface-2 text-left transition-colors\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-3 min-w-0\">\n\t\t\t\t\t\t\t\t\t<DuelAvatar nickname={n.slug} link={false} size={36} />\n\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<div class=\"text-sm font-semibold text-text truncate\"><span class=\"text-[11px] font-normal text-muted\">/n/</span>{n.slug}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"text-[10px] text-muted\">{t('{n} members', { n: num(n.memberCount) })} · {t('{n} posts', { n: n.postCount })}</div>\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\t<span class=\"flex items-center gap-1.5 shrink-0\">\n\t\t\t\t\t\t\t\t\t{#if n.isLastPosted}\n\t\t\t\t\t\t\t\t\t\t<span class=\"text-[9px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-accent text-bg font-bold\">{t('last post')}</span>\n\t\t\t\t\t\t\t\t\t{:else if n.isSubscribed}\n\t\t\t\t\t\t\t\t\t\t<span class=\"text-[9px] uppercase tracking-wider text-accent font-semibold\">{t('subscribed')}</span>\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t</span>\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</div>\n\n\t\t\t<!-- footer: create new + skip-link -->\n\t\t\t<div class=\"px-4 py-3 border-t border-border space-y-2\">\n\t\t\t\t<a\n\t\t\t\t\thref=\"/n/new\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclass=\"w-full inline-flex items-center justify-center gap-2 px-3 py-2 rounded-md border border-accent/50 text-accent text-sm font-semibold no-underline hover:bg-accent/10 transition-colors\"\n\t\t\t\t>\n\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n\t\t\t\t\t\t<path d=\"M7 3v8M3 7h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n\t\t\t\t\t</svg>\n\t\t\t\t\t{t('create new niche')}\n\t\t\t\t</a>\n\t\t\t\t{#if allowSkip}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={skip}\n\t\t\t\t\t\tclass=\"w-full py-1 text-[11px] text-muted hover:text-text underline\"\n\t\t\t\t\t>{t('skip — post without niche')}</button>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n{/if}\n"],"version":3}