{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c44-76d1-bb96-8fb235f671af","file":"Hao4rjjS.mjs","mappings":"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","names":["REASONS","msg","reason","$.state","comment","sending","error","done","reset","$.set","submit","$.get","t","res","$$props","j","handleBackdrop","e","handleKey","div","root_1","div_1","$.child","header","h3","button","div_2","root_2","p","$.template_effect","$0","$.set_text","text_1","p_1","$.first_child","fragment_1","fieldset","legend","$.each","node_2","r","label","root_4","input","$.remove_input_defaults","div_3","$.sibling","div_4","div_5","$.set_checked","$.delegated","label_1","span","textarea","$.remove_textarea_child","p_2","root_5","$$render","consequent_1","div_6","node_3","button_1","button_2","$.set_attribute","$3","$$value","$$args","consequent","alternate","$.reset","$1","$.append","$$anchor"],"sources":["../../../../../../src/lib/components/ReportContentModal.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\timport { msg } from '$lib/i18n/mark';\n\t// RAT-236: site-wide content report modal. Replaces the existing inline\n\t// modal on /f (PostCard.svelte) and adds reporting to /a, /b,\n\t// /rate/result, /d/result. One row per (entity, reporter) — the API\n\t// enforces the unique constraint. Optional details textarea, six fixed\n\t// reasons + \"other\".\n\n\timport type { ReportEntityType } from '$lib/report-entity';\n\n\ttype Reason = 'csam' | 'non_consensual_nudity' | 'harassment' | 'spam' | 'fake' | 'other';\n\n\ttype Props = {\n\t\topen: boolean;\n\t\tentityType: ReportEntityType;\n\t\tentityId: string;\n\t\tonclose: () => void;\n\t};\n\n\tlet { open = $bindable(), entityType, entityId, onclose }: Props = $props();\n\n\tconst REASONS: { value: Reason; label: string; sub: string }[] = [\n\t\t{ value: 'csam', label: msg('CSAM or minors'), sub: msg('sexual content involving anyone under 18') },\n\t\t{ value: 'non_consensual_nudity', label: msg('Non-consensual nudity'), sub: msg('shared without the subject\\'s consent') },\n\t\t{ value: 'harassment', label: msg('Harassment or hate'), sub: msg('targeted abuse, slurs, threats') },\n\t\t{ value: 'spam', label: msg('Spam or scam'), sub: msg('unsolicited promo, scam link, fake account') },\n\t\t{ value: 'fake', label: msg('Fake or misleading'), sub: msg('impersonation, deepfake, AI-generated misrepresentation') },\n\t\t{ value: 'other', label: msg('Something else'), sub: msg('tell us in the box below') }\n\t];\n\n\tlet reason = $state<Reason | null>(null);\n\tlet comment = $state('');\n\tlet sending = $state(false);\n\tlet error = $state('');\n\tlet done = $state(false);\n\n\tfunction reset() {\n\t\treason = null;\n\t\tcomment = '';\n\t\tsending = false;\n\t\terror = '';\n\t\tdone = false;\n\t}\n\n\tasync function submit() {\n\t\tif (!reason) {\n\t\t\terror = t('pick a reason first.');\n\t\t\treturn;\n\t\t}\n\t\tsending = true;\n\t\terror = '';\n\t\ttry {\n\t\t\tconst res = await fetch('/api/report', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tentityType,\n\t\t\t\t\tentityId,\n\t\t\t\t\treason,\n\t\t\t\t\tcomment: comment.trim() || null\n\t\t\t\t})\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tdone = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tonclose();\n\t\t\t\t\treset();\n\t\t\t\t}, 1400);\n\t\t\t} else {\n\t\t\t\tconst j = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\t\terror = j.error ?? t('failed to send report');\n\t\t\t}\n\t\t} catch {\n\t\t\terror = t('network error — try again');\n\t\t} finally {\n\t\t\tsending = false;\n\t\t}\n\t}\n\n\tfunction handleBackdrop(e: MouseEvent) {\n\t\tif (e.target === e.currentTarget) onclose();\n\t}\n\tfunction handleKey(e: KeyboardEvent) {\n\t\tif (e.key === 'Escape') onclose();\n\t}\n</script>\n\n{#if open}\n\t<div\n\t\tclass=\"report-backdrop\"\n\t\trole=\"dialog\"\n\t\taria-modal=\"true\"\n\t\taria-labelledby=\"report-title\"\n\t\ttabindex=\"-1\"\n\t\tonclick={handleBackdrop}\n\t\tonkeydown={handleKey}\n\t>\n\t\t<div class=\"report-card\">\n\t\t\t<header class=\"report-header\">\n\t\t\t\t<h3 id=\"report-title\" class=\"report-title\">\n\t\t\t\t\t{entityType === 'profile' ? t('Report user') : t('Report content')}\n\t\t\t\t</h3>\n\t\t\t\t<button type=\"button\" class=\"report-close\" aria-label={t('close')} onclick={onclose}>×</button>\n\t\t\t</header>\n\n\t\t\t{#if done}\n\t\t\t\t<div class=\"report-done\">\n\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" class=\"h-6 w-6\">\n\t\t\t\t\t\t<path d=\"M5 13l4 4L19 7\" />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>{t(\"Reported. We'll review it.\")}</p>\n\t\t\t\t</div>\n\t\t\t{:else}\n\t\t\t\t<p class=\"report-sub\">{t('Reports go straight to our moderation queue. Help us keep the site clean.')}</p>\n\n\t\t\t\t<fieldset class=\"report-reasons\">\n\t\t\t\t\t<legend class=\"sr-only\">{t('Reason')}</legend>\n\t\t\t\t\t{#each REASONS as r (r.value)}\n\t\t\t\t\t\t<label class=\"report-reason {reason === r.value ? 'report-reason--active' : ''}\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t\tname=\"reason\"\n\t\t\t\t\t\t\t\tvalue={r.value}\n\t\t\t\t\t\t\t\tchecked={reason === r.value}\n\t\t\t\t\t\t\t\tonchange={() => (reason = r.value)}\n\t\t\t\t\t\t\t\tdisabled={sending}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div class=\"report-reason__label\">{t(r.label)}</div>\n\t\t\t\t\t\t\t\t<div class=\"report-reason__sub\">{t(r.sub)}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t{/each}\n\t\t\t\t</fieldset>\n\n\t\t\t\t<label class=\"report-comment-wrap\">\n\t\t\t\t\t<span class=\"sr-only\">{t('Additional details')}</span>\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tbind:value={comment}\n\t\t\t\t\t\tmaxlength=\"1000\"\n\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\tplaceholder={t('Anything else we should know? (optional)')}\n\t\t\t\t\t\tdisabled={sending}\n\t\t\t\t\t\tclass=\"report-comment\"\n\t\t\t\t\t></textarea>\n\t\t\t\t</label>\n\n\t\t\t\t{#if error}\n\t\t\t\t\t<p class=\"report-error\">{error}</p>\n\t\t\t\t{/if}\n\n\t\t\t\t<div class=\"report-actions\">\n\t\t\t\t\t<button type=\"button\" class=\"report-cancel\" onclick={onclose} disabled={sending}>\n\t\t\t\t\t\t{t('Cancel')}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button type=\"button\" class=\"report-submit\" onclick={submit} disabled={sending || !reason}>\n\t\t\t\t\t\t{sending ? t('Sending…') : t('Send report')}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t</div>\n\t</div>\n{/if}\n\n<style>\n\t.report-backdrop {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\t/* Above every piece of site chrome — the fixed navbar and sticky profile\n\t\t   tab bars sit in the 90-110 band and were overlapping the modal at 80. */\n\t\tz-index: 999;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 1rem;\n\t\tpadding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px));\n\t\tbackground: rgba(0, 0, 0, 0.6);\n\t\tbackdrop-filter: blur(6px);\n\t\t-webkit-backdrop-filter: blur(6px);\n\t}\n\t.report-card {\n\t\twidth: 100%;\n\t\tmax-width: 26rem;\n\t\tbackground: var(--color-bg);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 1rem;\n\t\tbox-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);\n\t\tpadding: 1.25rem;\n\t\tmax-height: calc(100dvh - 2rem);\n\t\toverflow-y: auto;\n\t}\n\t.report-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t}\n\t.report-title {\n\t\tfont-size: 1.0625rem;\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-text);\n\t\tletter-spacing: -0.01em;\n\t}\n\t.report-close {\n\t\tfont-size: 1.5rem;\n\t\tline-height: 1;\n\t\tcolor: var(--color-muted);\n\t\tpadding: 0 0.375rem;\n\t\tborder-radius: 0.5rem;\n\t\ttransition: background 0.15s, color 0.15s;\n\t}\n\t.report-close:hover {\n\t\tbackground: var(--color-surface);\n\t\tcolor: var(--color-text);\n\t}\n\t.report-sub {\n\t\tmargin-top: 0.5rem;\n\t\tfont-size: 0.8125rem;\n\t\tcolor: var(--color-muted);\n\t\tline-height: 1.45;\n\t}\n\t.report-reasons {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0.375rem;\n\t\tmargin-top: 1rem;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n\t.report-reason {\n\t\tdisplay: flex;\n\t\tgap: 0.625rem;\n\t\tpadding: 0.625rem 0.75rem;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 0.625rem;\n\t\tcursor: pointer;\n\t\ttransition: border-color 0.15s, background 0.15s;\n\t}\n\t.report-reason:hover {\n\t\tborder-color: color-mix(in srgb, var(--color-muted) 40%, var(--color-border));\n\t}\n\t.report-reason--active {\n\t\tborder-color: var(--color-coral);\n\t\tbackground: color-mix(in srgb, var(--color-coral) 6%, transparent);\n\t}\n\t.report-reason input {\n\t\tmargin-top: 4px;\n\t\tflex-shrink: 0;\n\t\taccent-color: var(--color-coral);\n\t}\n\t.report-reason__label {\n\t\tfont-size: 0.8125rem;\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-text);\n\t}\n\t.report-reason__sub {\n\t\tfont-size: 0.6875rem;\n\t\tcolor: var(--color-muted);\n\t\tline-height: 1.4;\n\t\tmargin-top: 1px;\n\t}\n\t.report-comment-wrap {\n\t\tdisplay: block;\n\t\tmargin-top: 0.75rem;\n\t}\n\t.report-comment {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: 0.625rem;\n\t\tbackground: var(--color-surface);\n\t\tpadding: 0.625rem 0.75rem;\n\t\tfont-size: 0.8125rem;\n\t\tcolor: var(--color-text);\n\t\tresize: vertical;\n\t\tmin-height: 60px;\n\t}\n\t.report-comment:focus {\n\t\toutline: none;\n\t\tborder-color: color-mix(in srgb, var(--color-muted) 60%, var(--color-border));\n\t}\n\t.report-comment::placeholder {\n\t\tcolor: color-mix(in srgb, var(--color-muted) 60%, transparent);\n\t}\n\t.report-error {\n\t\tmargin-top: 0.5rem;\n\t\tfont-size: 0.75rem;\n\t\tcolor: var(--color-coral);\n\t}\n\t.report-actions {\n\t\tdisplay: flex;\n\t\tjustify-content: flex-end;\n\t\tgap: 0.5rem;\n\t\tmargin-top: 1rem;\n\t}\n\t.report-cancel,\n\t.report-submit {\n\t\tpadding: 0.5rem 0.875rem;\n\t\tborder-radius: 0.625rem;\n\t\tfont-size: 0.8125rem;\n\t\tfont-weight: 600;\n\t\ttransition: background 0.15s, opacity 0.15s;\n\t}\n\t.report-cancel {\n\t\tbackground: transparent;\n\t\tborder: 1px solid var(--color-border);\n\t\tcolor: var(--color-text);\n\t}\n\t.report-cancel:hover:not(:disabled) {\n\t\tbackground: var(--color-surface);\n\t}\n\t.report-submit {\n\t\tbackground: var(--color-coral);\n\t\tcolor: white;\n\t\tborder: 1px solid var(--color-coral);\n\t}\n\t.report-submit:hover:not(:disabled) {\n\t\tbackground: var(--color-coral-dark);\n\t}\n\t.report-submit:disabled,\n\t.report-cancel:disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n\t.report-done {\n\t\tmargin-top: 1rem;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 0.625rem;\n\t\tpadding: 1.25rem 0;\n\t\tcolor: var(--color-text);\n\t\ttext-align: center;\n\t}\n\t.report-done svg {\n\t\tcolor: var(--color-coral);\n\t}\n\t.sr-only {\n\t\tposition: absolute;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\tpadding: 0;\n\t\tmargin: -1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0, 0, 0, 0);\n\t\twhite-space: nowrap;\n\t\tborder: 0;\n\t}\n</style>\n"],"version":3}