{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4d20-7a01-8aed-a7421ce54f72","file":"94.CJvT5Z4u.mjs","mappings":"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","names":["items","filters","isAuth","$.derived","$$props","votedIds","$.state","$.proxy","voteCounts","onMount","res","d","$.set","toggleVote","id","$.get","goto","wasVoted","newSet","item","body","s","FILTER_DEFAULTS","setFilter","name","value","params","nextPageHref","statusLabel","timeAgo","iso","ms","days","hrs","mins","main","root","div","div_1","$.each","button","root_1","text","$.child","$.reset","$.set_class","$.delegated","$.append","$$anchor","div_2","label","select","$.sibling","option","option_1","option_2","option_3","$.init_select","label_1","select_1","option_4","option_5","option_6","option_7","option_8","option_9","option_10","option_11","option_12","label_2","select_2","option_13","option_14","div_3","root_2","ul","$.first_child","fragment","voted","count","li","root_4","div_4","button_1","span","a","p","div_5","span_1","span_2","span_3","span_4","span_5","root_5","$.template_effect","$.set_text","text_7","$$render","consequent_1","span_6","root_6","text_8","consequent_2","$.set_attribute","text_2","text_4","text_5","div_6","root_7","a_1","$0","consequent_3","consequent","alternate","select_value","select_1_value","select_2_value","e"],"sources":["../../../../../../src/routes/feedback/+page.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { goto } from '$app/navigation';\n\timport { onMount } from 'svelte';\n\timport type { FeedbackListItem } from '$lib/server/feedback-board';\n\n\tlet { data } = $props();\n\n\tconst items = $derived(data.items as FeedbackListItem[]);\n\tconst filters = $derived(data.filters);\n\tconst isAuth = $derived(!!data.session?.user);\n\n\tlet votedIds = $state<Set<string>>(new Set());\n\tlet voteCounts = $state<Record<string, number>>({});\n\n\tonMount(async () => {\n\t\tif (!isAuth) return;\n\t\ttry {\n\t\t\tconst res = await fetch('/api/feedback/my-votes');\n\t\t\tif (res.ok) {\n\t\t\t\tconst d = (await res.json()) as { ids: string[] };\n\t\t\t\tvotedIds = new Set(d.ids);\n\t\t\t}\n\t\t} catch { /* no-op */ }\n\t});\n\n\tasync function toggleVote(id: string) {\n\t\tif (!isAuth) {\n\t\t\tgoto('/auth/sign-in?next=/feedback');\n\t\t\treturn;\n\t\t}\n\t\tconst wasVoted = votedIds.has(id);\n\t\tconst newSet = new Set(votedIds);\n\t\tif (wasVoted) newSet.delete(id); else newSet.add(id);\n\t\tvotedIds = newSet;\n\t\tconst item = items.find((i) => i.id === id);\n\t\tif (item) {\n\t\t\tvoteCounts = { ...voteCounts, [id]: (voteCounts[id] ?? item.voteCount) + (wasVoted ? -1 : 1) };\n\t\t}\n\t\ttry {\n\t\t\tconst res = await fetch(`/api/feedback/${id}/vote`, { method: 'POST' });\n\t\t\tif (!res.ok) throw new Error('vote failed');\n\t\t\tconst body = (await res.json()) as { voted: boolean; voteCount: number };\n\t\t\tvoteCounts = { ...voteCounts, [id]: body.voteCount };\n\t\t\tconst s = new Set(votedIds);\n\t\t\tif (body.voted) s.add(id); else s.delete(id);\n\t\t\tvotedIds = s;\n\t\t} catch {\n\t\t\tconst s = new Set(votedIds);\n\t\t\tif (wasVoted) s.add(id); else s.delete(id);\n\t\t\tvotedIds = s;\n\t\t\tif (item) voteCounts = { ...voteCounts, [id]: item.voteCount };\n\t\t}\n\t}\n\n\t// Per-filter defaults — a value equal to its default is dropped from the URL\n\t// to keep it clean. status defaults to 'open' (the board's live backlog);\n\t// picking 'all' must therefore be written explicitly so it survives a reload.\n\tconst FILTER_DEFAULTS: Record<string, string> = { status: 'open', type: 'all', category: 'all', sort: 'votes' };\n\n\tfunction setFilter(name: string, value: string) {\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tif (value === '' || value === FILTER_DEFAULTS[name]) params.delete(name);\n\t\telse params.set(name, value);\n\t\tparams.delete('cursor');\n\t\tgoto(`/feedback?${params.toString()}`, { keepFocus: true, noScroll: true });\n\t}\n\n\tfunction nextPageHref(): string {\n\t\tconst params = new URLSearchParams();\n\t\tif (filters.status !== FILTER_DEFAULTS.status) params.set('status', filters.status);\n\t\tif (filters.type !== FILTER_DEFAULTS.type) params.set('type', filters.type);\n\t\tif (filters.category !== FILTER_DEFAULTS.category) params.set('category', filters.category);\n\t\tif (filters.sort !== FILTER_DEFAULTS.sort) params.set('sort', filters.sort);\n\t\tif (data.nextCursor) params.set('cursor', data.nextCursor);\n\t\treturn `?${params.toString()}`;\n\t}\n\n\tfunction statusLabel(s: string) {\n\t\treturn s === 'in_progress' ? 'in progress' : s;\n\t}\n\tfunction timeAgo(iso: string) {\n\t\tconst ms = Date.now() - new Date(iso).getTime();\n\t\tconst days = Math.floor(ms / 86400000);\n\t\tif (days >= 1) return `${days}d ago`;\n\t\tconst hrs = Math.floor(ms / 3600000);\n\t\tif (hrs >= 1) return `${hrs}h ago`;\n\t\tconst mins = Math.floor(ms / 60000);\n\t\tif (mins >= 1) return `${mins}m ago`;\n\t\treturn 'just now';\n\t}\n</script>\n\n<main class=\"min-h-screen bg-bg pt-20 pb-32 md:pt-28\">\n\t<div class=\"mx-auto max-w-3xl px-5\">\n\t\t<div class=\"mb-8\">\n\t\t\t<p class=\"text-[11px] font-bold uppercase tracking-[0.2em] text-muted\">roadmap</p>\n\t\t\t<h1 class=\"mt-2 font-display text-[clamp(2.5rem,6vw,4rem)] font-bold leading-[0.95] tracking-tighter\">\n\t\t\t\tshape what gets<br /><span class=\"text-coral\">built next.</span>\n\t\t\t</h1>\n\t\t\t<p class=\"mt-3 text-sm text-muted\">\n\t\t\t\tvote on features · your input decides the roadmap · <span class=\"text-text\">+10 tokens</span> for useful submissions\n\t\t\t</p>\n\t\t</div>\n\n\t\t<a\n\t\t\thref=\"/feedback/new\"\n\t\t\tclass=\"mb-6 flex flex-col items-stretch gap-2 rounded-xl border border-border bg-surface px-4 py-3 transition-colors hover:border-muted no-underline sm:flex-row sm:items-center sm:justify-between sm:gap-3\"\n\t\t>\n\t\t\t<span class=\"text-sm text-muted\">suggest a feature, report a bug, share an idea…</span>\n\t\t\t<span class=\"shrink-0 self-end rounded-lg bg-coral px-5 py-2 text-center font-display text-[12px] font-semibold text-white sm:self-auto\">submit →</span>\n\t\t</a>\n\n\t\t<div class=\"mb-4 flex gap-1 overflow-x-auto rounded-lg border border-border bg-surface p-1\">\n\t\t\t{#each ['all', 'open', 'planned', 'in_progress', 'shipped'] as s (s)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonclick={() => setFilter('status', s)}\n\t\t\t\t\tclass=\"shrink-0 cursor-pointer rounded-md px-3 py-1.5 font-display text-[11px] font-semibold uppercase tracking-wider transition-all\n\t\t\t\t\t\t{filters.status === s ? 'bg-bg text-text border border-border' : 'text-muted/60 hover:text-text'}\"\n\t\t\t\t>\n\t\t\t\t\t{statusLabel(s)}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\n\t\t<div class=\"mb-4 flex flex-wrap items-center gap-3 text-[11px]\">\n\t\t\t<label class=\"flex items-center gap-2 text-muted\">\n\t\t\t\t<span class=\"uppercase tracking-wider\">type</span>\n\t\t\t\t<select\n\t\t\t\t\tvalue={filters.type}\n\t\t\t\t\tonchange={(e) => setFilter('type', (e.currentTarget as HTMLSelectElement).value)}\n\t\t\t\t\tclass=\"rounded border border-border bg-surface px-2 py-1 text-text\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"all\">all</option>\n\t\t\t\t\t<option value=\"feature\">feature</option>\n\t\t\t\t\t<option value=\"bug\">bug</option>\n\t\t\t\t\t<option value=\"idea\">idea</option>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t\t<label class=\"flex items-center gap-2 text-muted\">\n\t\t\t\t<span class=\"uppercase tracking-wider\">about</span>\n\t\t\t\t<select\n\t\t\t\t\tvalue={filters.category}\n\t\t\t\t\tonchange={(e) => setFilter('category', (e.currentTarget as HTMLSelectElement).value)}\n\t\t\t\t\tclass=\"rounded border border-border bg-surface px-2 py-1 text-text\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"all\">all</option>\n\t\t\t\t\t<option value=\"rate\">rate</option>\n\t\t\t\t\t<option value=\"duel\">duel</option>\n\t\t\t\t\t<option value=\"arena\">arena</option>\n\t\t\t\t\t<option value=\"enhance\">enhance</option>\n\t\t\t\t\t<option value=\"profile\">profile</option>\n\t\t\t\t\t<option value=\"pricing\">pricing</option>\n\t\t\t\t\t<option value=\"general\">general</option>\n\t\t\t\t\t<option value=\"other\">other</option>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t\t<label class=\"flex items-center gap-2 text-muted\">\n\t\t\t\t<span class=\"uppercase tracking-wider\">sort</span>\n\t\t\t\t<select\n\t\t\t\t\tvalue={filters.sort}\n\t\t\t\t\tonchange={(e) => setFilter('sort', (e.currentTarget as HTMLSelectElement).value)}\n\t\t\t\t\tclass=\"rounded border border-border bg-surface px-2 py-1 text-text\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"votes\">most voted</option>\n\t\t\t\t\t<option value=\"new\">newest</option>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t</div>\n\n\t\t{#if items.length === 0}\n\t\t\t<div class=\"rounded-xl border border-border bg-surface/50 p-10 text-center text-sm text-muted\">\n\t\t\t\tnothing here yet. be the first to submit.\n\t\t\t</div>\n\t\t{:else}\n\t\t\t<ul class=\"flex flex-col gap-1.5\">\n\t\t\t\t{#each items as item (item.id)}\n\t\t\t\t\t{@const voted = votedIds.has(item.id)}\n\t\t\t\t\t{@const count = voteCounts[item.id] ?? item.voteCount}\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<div class=\"flex items-start gap-3 rounded-xl border border-border bg-surface px-4 py-3.5 transition-colors hover:border-muted/50\">\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={() => toggleVote(item.id)}\n\t\t\t\t\t\t\t\tclass=\"flex shrink-0 flex-col items-center gap-1 rounded-lg border px-3 py-2 transition-all min-w-[44px]\n\t\t\t\t\t\t\t\t\t{voted ? 'border-coral bg-coral/10 text-coral' : 'border-border text-muted hover:border-muted'}\"\n\t\t\t\t\t\t\t\taria-label={voted ? 'remove vote' : 'add vote'}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span class=\"text-[10px] leading-none\">▲</span>\n\t\t\t\t\t\t\t\t<span class=\"font-display text-[13px] font-bold leading-none\">{count}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"/feedback/item/{item.id}\"\n\t\t\t\t\t\t\t\tclass=\"min-w-0 flex-1 no-underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<p class=\"font-display text-[14px] font-medium leading-snug text-text\">{item.title}</p>\n\t\t\t\t\t\t\t\t<div class=\"mt-1.5 flex flex-wrap items-center gap-2 text-[10px]\">\n\t\t\t\t\t\t\t\t\t<span class=\"rounded-full px-2 py-0.5 font-display font-semibold uppercase tracking-wider\n\t\t\t\t\t\t\t\t\t\t{item.status === 'planned' ? 'bg-blue/15 text-blue border border-blue/30'\n\t\t\t\t\t\t\t\t\t\t: item.status === 'in_progress' ? 'bg-yellow/12 text-yellow border border-yellow/30'\n\t\t\t\t\t\t\t\t\t\t: item.status === 'shipped' ? 'bg-green/12 text-green border border-green/30'\n\t\t\t\t\t\t\t\t\t\t: item.status === 'wontfix' ? 'bg-coral/10 text-coral/70 border border-coral/20'\n\t\t\t\t\t\t\t\t\t\t: item.status === 'duplicate' ? 'bg-muted/15 text-muted border border-border'\n\t\t\t\t\t\t\t\t\t\t: 'bg-surface-2 text-muted border border-border'}\">\n\t\t\t\t\t\t\t\t\t\t{statusLabel(item.status)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span class=\"rounded-full border border-border bg-bg px-2 py-0.5 font-display font-semibold uppercase tracking-wider text-muted\">\n\t\t\t\t\t\t\t\t\t\t{item.type}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span class=\"rounded-full border border-border bg-bg px-2 py-0.5 font-display font-semibold uppercase tracking-wider text-muted/70\">\n\t\t\t\t\t\t\t\t\t\t{item.category}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span class=\"text-muted/60\">{timeAgo(item.createdAt)}</span>\n\t\t\t\t\t\t\t\t\t{#if item.authorNickname}\n\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted/60\">· by {item.authorNickname}</span>\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t{#if item.commentCount > 0}\n\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted/60\">· 💬 {item.commentCount}</span>\n\t\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</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ul>\n\n\t\t\t{#if data.nextCursor}\n\t\t\t\t<div class=\"mt-6 text-center\">\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={nextPageHref()}\n\t\t\t\t\t\tclass=\"inline-block rounded-lg border border-border px-5 py-2 font-display text-[12px] font-semibold text-muted no-underline transition-all hover:border-muted hover:text-text\"\n\t\t\t\t\t>\n\t\t\t\t\t\tload more →\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/if}\n\t</div>\n</main>\n"],"version":3}