{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c38-7593-87e7-524ce59e2ecc","file":"DUvjOoi9.mjs","mappings":"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","names":["ARENA_CATEGORIES","ARENA_CATEGORY_LABELS","PRIMARY_AXES","SECONDARY_AXES","ROLES","ORIENTATIONS","GENDERS","POSITIONS","BODY_TYPES","AGE_BRACKETS","ETHNICITIES","KINKS","AXIS_MAX","PHOTO_MAX","AXIS_VALUES","k","AXIS_LABELS","valueLabel","axis","value","ALLOWED","a","cleanValue","v","t","cleanList","input","max","seen","raw","c","emptySeek","seekToParam","seek","parts","seekFromParam","param","out","chunk","vals","chip","$$anchor","$.noop","active","$.derived","$$props","locked","$.get","maxFor","button","root_1","text","$.child","$.reset","$.set_attribute","$.delegated","toggle","$.append","section","$$arg1","small","n","capped","div","$.first_child","fragment","span","span_1","div_1","$.set_class","$.set_text","text_1","isSingle","hint","photo","$.prop","showPhoto","showMore","$.state","photoMax","cur","nextAxis","x","togglePhoto","clearAll","cleared","tokens","div_2","root","div_3","root_4","span_2","span_3","root_5","$.template_effect","$0","text_4","$.each","node_2","$$index_1","$$array","span_4","root_7","button_1","$.sibling","text_6","$$render","consequent","alternate","text_3","consequent_1","node_3","div_4","root_8","button_2","span_5","span_6","span_7","svg","node_5","div_5","root_9","node_6","div_6","root_10","node_7","div_7","root_11","div_8","span_8","span_9","div_9","button_3","root_12","text_11","$1","consequent_2","consequent_3","p","consequent_4","alternate_1","$.set"],"sources":["../../../../../../src/lib/types/arena.ts","../../../../../../src/lib/types/arena-identity.ts","../../../../../../src/lib/components/arena/ArenaIdentityPicker.svelte"],"sourcesContent":["export type ArenaVisibility = 'everyone' | 'registered';\nexport type ArenaSubmissionStatus = 'active' | 'removed' | 'moderated';\nexport type ArenaVoteType = 'up' | 'down';\nexport type ArenaEmoteType = 'fire' | 'water' | 'crown' | 'skull';\nexport type ArenaMediaType = 'image' | 'video';\n\nexport type ArenaCategory =\n\t| 'balls'\n\t| 'girth'\n\t| 'length'\n\t| 'load'\n\t| 'erect'\n\t| 'flaccid'\n\t| 'angle'\n\t| 'shaved'\n\t| 'hairy'\n\t| 'funny';\n\nexport const ARENA_CATEGORIES: ArenaCategory[] = [\n\t'balls',\n\t'girth',\n\t'length',\n\t'load',\n\t'erect',\n\t'flaccid',\n\t'angle',\n\t'shaved',\n\t'hairy',\n\t'funny'\n];\n\nexport const MAX_CATEGORIES_PER_SUBMISSION = 3;\n\nexport const ARENA_CATEGORY_LABELS: Record<ArenaCategory, string> = {\n\tballs: 'balls',\n\tgirth: 'girth',\n\tlength: 'length',\n\tload: 'load',\n\terect: 'erect',\n\tflaccid: 'flaccid',\n\tangle: 'angle',\n\tshaved: 'shaved',\n\thairy: 'hairy',\n\tfunny: 'funny'\n};\n\n// RAT-426: `max` caps the count — the SUBMIT flow passes MAX_CATEGORIES_PER_SUBMISSION\n// (anti-spam, so a card can't tag every photo attribute); the \"show me\" FILTER passes\n// nothing (uncapped — a viewer narrowing their own deck harms no one).\nexport function sanitizeArenaCategories(input: unknown, max = Infinity): ArenaCategory[] {\n\tif (!Array.isArray(input)) return [];\n\tconst allowed = new Set<string>(ARENA_CATEGORIES);\n\tconst seen = new Set<ArenaCategory>();\n\tfor (const raw of input) {\n\t\tif (typeof raw !== 'string') continue;\n\t\tconst v = raw.trim().toLowerCase();\n\t\tif (!allowed.has(v)) continue;\n\t\tseen.add(v as ArenaCategory);\n\t\tif (seen.size >= max) break;\n\t}\n\treturn Array.from(seen);\n}\n\nexport interface ArenaFeedItem {\n\tid: string;\n\timageUrl: string;\n\tmediaType: ArenaMediaType;\n\tnickname: string | null;\n\tisRater?: boolean;\n\tisSubscriber?: boolean;\n\tisVerified?: boolean;\n\tisAnonymous: boolean;\n\taiScore: number | null;\n\ttotalUpvotes: number;\n\ttotalDownvotes: number;\n\ttotalViews: number;\n\temotes: { fire: number; water: number; crown: number; skull: number };\n\tisBoosted: boolean;\n\t// Set when this arena card is a cross-posted contest entry → drives the\n\t// \"contest entry\" badge that links back to the contest to vote.\n\tcontestEntryId?: string | null;\n\tcategories: ArenaCategory[];\n\tcreatedAt: string;\n\t// RAT-412: set (to the emote flavor) when this card's owner super-emoted the\n\t// viewer — the card is surfaced first with a \"super-emoted you\" badge.\n\tsuperEmotedYou?: ArenaEmoteType;\n}\n\nexport interface ArenaSubmissionDashboard extends ArenaFeedItem {\n\t// Ordered client-side fallback chain for `imageUrl`, cheapest first: the same\n\t// CDN object with no Optimizer transform, then the raw Supabase origin. Walked\n\t// on `onerror` so a failed Optimizer transform never shows a broken image.\n\timageFallbackUrls?: string[];\n\t// null → this submission has no votes yet (\"no votes yet\"), distinct from a\n\t// genuine 0% approval. A fresh submission must not read as universally hated.\n\tapprovalRate: number | null;\n\treactionsRevealed: boolean;\n\tbreakdownRevealed: boolean;\n\tarenaRating: number | null;\n\tboostExpiresAt: string | null;\n}\n\nexport interface ArenaSubmissionDetail extends ArenaSubmissionDashboard {\n\treactionSenders?: { nickname: string | null; vote: string; emotes: string[] }[];\n\tscoreBreakdown?: ArenaScoreBreakdown;\n}\n\nexport interface ArenaScoreBreakdown {\n\ttotalVotes: number;\n\tupvotePct: number;\n\tdownvotePct: number;\n\tvoteTimeline: { date: string; up: number; down: number }[];\n}\n\nexport interface ArenaWeeklyRank {\n\trank: number;\n\tsubmissionId: string;\n\tnickname: string | null;\n\tapprovalRate: number;\n\ttotalVotes: number;\n\ttotalEmotes: number;\n\tbadge: string | null;\n\tavatarPath: string | null;\n\tisSubscriber: boolean;\n\tisRater: boolean;\n\tisVerified: boolean;\n}\n","// RAT-426 (Epic C / C1): arena identity + \"who i am / show me\" matching axes.\n// Two mirror surfaces share this taxonomy: the submit flow tags the submission\n// (\"who i am\", supply) and the feed filter picks preferences (\"show me\", demand).\n// Matching is SOFT — picks float matching cards to the front by match-count; nothing\n// is hidden, empty selection = everyone. See C1 for the full spec.\n\nexport type ArenaAxis =\n\t| 'role'\n\t| 'orientation'\n\t| 'gender'\n\t| 'position'\n\t| 'body'\n\t| 'kinks'\n\t| 'age'\n\t| 'ethnicity';\n\n// Single-select on the \"who i am\" side (one value per card); multi (\"any\") on the\n// filter side. The rest are multi on both.\nexport const SINGLE_AXES: ArenaAxis[] = ['role', 'orientation', 'gender', 'position'];\nexport const MULTI_AXES: ArenaAxis[] = ['body', 'kinks', 'age', 'ethnicity'];\n\n// Primary = always visible; secondary = behind a \"more · optional\" disclosure.\n// IDENTICAL on both surfaces so every declared axis is also filterable (matches close).\nexport const PRIMARY_AXES: ArenaAxis[] = ['role', 'orientation', 'gender', 'body', 'kinks'];\nexport const SECONDARY_AXES: ArenaAxis[] = ['position', 'age', 'ethnicity'];\n\nexport const ROLES = ['dominant', 'submissive', 'switch'] as const;\nexport const ORIENTATIONS = ['gay', 'bi', 'curious', 'straight'] as const;\nexport const GENDERS = ['guy', 'woman', 'trans', 'femboy', 'femme'] as const; // NO default\nexport const POSITIONS = ['top', 'bottom', 'vers'] as const;\nexport const BODY_TYPES = ['twink', 'bear', 'otter', 'muscle', 'hung', 'slim', 'thick', 'daddy'] as const;\nexport const AGE_BRACKETS = ['18-24', '25-34', '35-44', '45+'] as const; // adult only\nexport const ETHNICITIES = ['white', 'black', 'latino', 'asian', 'mena', 'south-asian', 'mixed'] as const;\n\n// Kink (\"into\") match-type drives the deck weighting later:\n//  symmetric  = mutual act, full match weight\n//  directional = role/position resolves who gives/receives\n//  solo       = interest signal only, low weight (not a real pairing signal)\nexport type KinkMatchType = 'symmetric' | 'directional' | 'solo';\n\nexport const KINKS: { key: string; label: string; type: KinkMatchType }[] = [\n\t{ key: 'cum', label: 'cum/loads', type: 'symmetric' },\n\t{ key: 'feet', label: 'feet', type: 'symmetric' },\n\t{ key: 'breed', label: 'breed/raw', type: 'symmetric' },\n\t{ key: 'watersports', label: 'watersports', type: 'symmetric' },\n\t{ key: 'pup', label: 'pup', type: 'symmetric' },\n\t{ key: 'spanking', label: 'spanking', type: 'symmetric' },\n\t{ key: 'bondage', label: 'bondage', type: 'symmetric' },\n\t{ key: 'gear', label: 'leather/gear', type: 'symmetric' },\n\t{ key: 'rimming', label: 'rimming', type: 'symmetric' },\n\t{ key: 'fisting', label: 'fisting', type: 'symmetric' },\n\t{ key: 'sph', label: 'SPH', type: 'directional' },\n\t{ key: 'daddyboy', label: 'daddy/boy', type: 'directional' },\n\t{ key: 'humiliation', label: 'humiliation', type: 'directional' },\n\t{ key: 'chastity', label: 'chastity', type: 'directional' },\n\t{ key: 'worship', label: 'worship', type: 'directional' },\n\t{ key: 'exhibitionist', label: 'exhibitionist', type: 'directional' },\n\t{ key: 'ms', label: 'M/s', type: 'directional' },\n\t{ key: 'cuck', label: 'cuck', type: 'directional' },\n\t{ key: 'sissy', label: 'sissy', type: 'directional' },\n\t{ key: 'findom', label: 'findom', type: 'directional' },\n\t{ key: 'voyeur', label: 'voyeur', type: 'directional' },\n\t{ key: 'edging', label: 'edging/denial', type: 'solo' },\n\t{ key: 'goon', label: 'gooning', type: 'solo' }\n];\n\n// RAT-426: per-axis selection caps on the SUBMIT side (\"who i am\") so a card can't\n// tag everything and match every filter (spam visibility). Single axes are 1 by\n// nature. The \"show me\" filter side is NOT capped — a viewer narrowing their own\n// deck harms no one. Photo tags cap = PHOTO_MAX (matches the old category limit).\nexport const AXIS_MAX: Record<'body' | 'kinks' | 'ethnicity', number> = {\n\tbody: 3,\n\tkinks: 3,\n\tethnicity: 2\n};\nexport const PHOTO_MAX = 3;\n\nexport const AXIS_VALUES: Record<ArenaAxis, readonly string[]> = {\n\trole: ROLES,\n\torientation: ORIENTATIONS,\n\tgender: GENDERS,\n\tposition: POSITIONS,\n\tbody: BODY_TYPES,\n\tkinks: KINKS.map((k) => k.key),\n\tage: AGE_BRACKETS,\n\tethnicity: ETHNICITIES\n};\n\nexport const AXIS_LABELS: Record<ArenaAxis, string> = {\n\trole: 'role',\n\torientation: 'orientation',\n\tgender: 'gender',\n\tposition: 'position',\n\tbody: 'body',\n\tkinks: 'into',\n\tage: 'age',\n\tethnicity: 'ethnicity'\n};\n\nexport function valueLabel(axis: ArenaAxis, value: string): string {\n\tif (axis === 'kinks') return KINKS.find((k) => k.key === value)?.label ?? value;\n\tif (axis === 'ethnicity' && value === 'mena') return 'MENA';\n\treturn value;\n}\n\nconst ALLOWED = new Map<ArenaAxis, Set<string>>(\n\t(Object.keys(AXIS_VALUES) as ArenaAxis[]).map((a) => [a, new Set(AXIS_VALUES[a])])\n);\n\n// \"who i am\" — single axes keep one value, multi axes keep a de-duped list.\nexport interface ArenaIdentity {\n\trole: string | null;\n\torientation: string | null;\n\tgender: string | null;\n\tposition: string | null;\n\tbody: string[];\n\tkinks: string[];\n\tage: string | null; // your own bracket = single\n\tethnicity: string[];\n}\n\nexport function emptyIdentity(): ArenaIdentity {\n\treturn { role: null, orientation: null, gender: null, position: null, body: [], kinks: [], age: null, ethnicity: [] };\n}\n\nfunction cleanValue(axis: ArenaAxis, v: unknown): string | null {\n\tif (typeof v !== 'string') return null;\n\tconst t = v.trim().toLowerCase();\n\treturn ALLOWED.get(axis)?.has(t) ? t : null;\n}\n\nfunction cleanList(axis: ArenaAxis, input: unknown, max = Infinity): string[] {\n\tif (!Array.isArray(input)) return [];\n\tconst seen = new Set<string>();\n\tfor (const raw of input) {\n\t\tconst c = cleanValue(axis, raw);\n\t\tif (c) seen.add(c);\n\t\tif (seen.size >= max) break;\n\t}\n\treturn Array.from(seen);\n}\n\n// Sanitize the \"who i am\" payload from the submit form — tamper-safe.\nexport function sanitizeIdentity(input: unknown): ArenaIdentity {\n\tconst o = (input && typeof input === 'object' ? input : {}) as Record<string, unknown>;\n\treturn {\n\t\trole: cleanValue('role', o.role),\n\t\torientation: cleanValue('orientation', o.orientation),\n\t\tgender: cleanValue('gender', o.gender),\n\t\tposition: cleanValue('position', o.position),\n\t\tbody: cleanList('body', o.body, AXIS_MAX.body),\n\t\tkinks: cleanList('kinks', o.kinks, AXIS_MAX.kinks),\n\t\tage: cleanValue('age', o.age),\n\t\tethnicity: cleanList('ethnicity', o.ethnicity, AXIS_MAX.ethnicity)\n\t};\n}\n\n// \"show me\" — every axis is a multi-select preference (\"any of these\").\nexport type ArenaSeek = Record<ArenaAxis, string[]>;\n\nexport function emptySeek(): ArenaSeek {\n\treturn { role: [], orientation: [], gender: [], position: [], body: [], kinks: [], age: [], ethnicity: [] };\n}\n\nexport function sanitizeSeek(input: unknown): ArenaSeek {\n\tconst o = (input && typeof input === 'object' ? input : {}) as Record<string, unknown>;\n\tconst out = emptySeek();\n\tfor (const axis of Object.keys(out) as ArenaAxis[]) out[axis] = cleanList(axis, o[axis]);\n\treturn out;\n}\n\nexport function seekIsEmpty(seek: ArenaSeek): boolean {\n\treturn (Object.keys(seek) as ArenaAxis[]).every((a) => seek[a].length === 0);\n}\n\n// URL round-trip for the deck query (?seek=role:submissive;body:twink,hung).\nexport function seekToParam(seek: ArenaSeek): string {\n\tconst parts: string[] = [];\n\tfor (const axis of Object.keys(seek) as ArenaAxis[]) {\n\t\tif (seek[axis].length) parts.push(`${axis}:${seek[axis].join(',')}`);\n\t}\n\treturn parts.join(';');\n}\n\nexport function seekFromParam(param: string | null): ArenaSeek {\n\tconst out = emptySeek();\n\tif (!param) return out;\n\tfor (const chunk of param.split(';')) {\n\t\tconst [axis, vals] = chunk.split(':');\n\t\tif (!axis || !vals) continue;\n\t\tif ((AXIS_VALUES as Record<string, unknown>)[axis]) {\n\t\t\tout[axis as ArenaAxis] = cleanList(axis as ArenaAxis, vals.split(','));\n\t\t}\n\t}\n\treturn out;\n}\n\n// The card's declared identity, as stored on arena_submission.\nexport interface CardIdentity {\n\trole?: string | null;\n\torientation?: string | null;\n\tgender?: string | null;\n\tposition?: string | null;\n\tbody?: string[] | null;\n\tkinks?: string[] | null;\n\tage?: string | null;\n\tethnicity?: string[] | null;\n}\n\n// SOFT match: count how many of the viewer's picks the card satisfies. Unset axes\n// on either side are neutral (never penalized). Empty seek → score 0 everywhere.\n// Solo kinks count at reduced weight — an interest signal, not a pairing signal.\nexport function matchScore(seek: ArenaSeek, card: CardIdentity): number {\n\tlet score = 0;\n\tfor (const axis of Object.keys(seek) as ArenaAxis[]) {\n\t\tconst picks = seek[axis];\n\t\tif (!picks.length) continue;\n\t\tconst cardVal = (card as Record<string, unknown>)[axis];\n\t\tfor (const pick of picks) {\n\t\t\tlet hit = false;\n\t\t\tif (Array.isArray(cardVal)) hit = cardVal.includes(pick);\n\t\t\telse if (typeof cardVal === 'string') hit = cardVal === pick;\n\t\t\tif (!hit) continue;\n\t\t\tif (axis === 'kinks' && KINKS.find((k) => k.key === pick)?.type === 'solo') score += 0.25;\n\t\t\telse score += 1;\n\t\t}\n\t}\n\treturn score;\n}\n","<script lang=\"ts\">\n\timport { t } from '$lib/i18n';\n\t// RAT-426 (C1): the shared \"who i am\" / \"show me\" picker. One component, two\n\t// mirror surfaces — the submit flow tags a submission (variant=\"whoami\", single\n\t// select on role/orientation/gender/position/age) and the feed filter picks\n\t// preferences (variant=\"seek\", every axis multi = \"any\"). Primary axes are\n\t// always visible; the rest sit behind a \"more · optional\" disclosure. Filled\n\t// chips (not glow) per the design rules. Fully controlled — the parent owns\n\t// `value`/`photo`; every tap emits the next selection through `onchange`.\n\timport {\n\t\tPRIMARY_AXES,\n\t\tSECONDARY_AXES,\n\t\tAXIS_VALUES,\n\t\tAXIS_LABELS,\n\t\tAXIS_MAX,\n\t\tPHOTO_MAX,\n\t\tvalueLabel,\n\t\ttype ArenaAxis\n\t} from '$lib/types/arena-identity';\n\timport { ARENA_CATEGORIES, ARENA_CATEGORY_LABELS, type ArenaCategory } from '$lib/types/arena';\n\n\tinterface Props {\n\t\tvariant: 'whoami' | 'seek';\n\t\t/** Per-axis selections. Single-select axes hold a length-≤1 array. */\n\t\tvalue: Record<string, string[]>;\n\t\t/** Photo tags (existing arena categories) — kept separate, demoted. */\n\t\tphoto?: string[];\n\t\t/** Hide the photo-tags section — the submit flow handles categories in its\n\t\t *  own picker, so it embeds this identity-only. */\n\t\tshowPhoto?: boolean;\n\t\tonchange: (next: Record<string, string[]>, photo: string[]) => void;\n\t}\n\n\tlet { variant, value, onchange, photo = [], showPhoto = true }: Props = $props();\n\n\tlet showMore = $state(false);\n\n\t// On \"who i am\" these are pick-one; on \"show me\" every axis is \"any\" (multi).\n\tfunction isSingle(axis: ArenaAxis): boolean {\n\t\treturn variant === 'whoami' && ['role', 'orientation', 'gender', 'position', 'age'].includes(axis);\n\t}\n\n\t// RAT-426: multi axes are capped on submit (\"who i am\") to keep tags meaningful\n\t// — a card can't tag everything and match every filter. The filter is uncapped.\n\tfunction maxFor(axis: ArenaAxis): number {\n\t\tif (variant !== 'whoami' || isSingle(axis)) return Infinity;\n\t\treturn (AXIS_MAX as Record<string, number>)[axis] ?? Infinity;\n\t}\n\tconst photoMax = $derived(variant === 'whoami' ? PHOTO_MAX : Infinity);\n\n\tfunction toggle(axis: ArenaAxis, v: string) {\n\t\tconst cur = value[axis] ?? [];\n\t\tlet nextAxis: string[];\n\t\tif (isSingle(axis)) {\n\t\t\tnextAxis = cur[0] === v ? [] : [v];\n\t\t} else if (cur.includes(v)) {\n\t\t\tnextAxis = cur.filter((x) => x !== v);\n\t\t} else {\n\t\t\tif (cur.length >= maxFor(axis)) return; // at cap — ignore the tap\n\t\t\tnextAxis = [...cur, v];\n\t\t}\n\t\tonchange({ ...value, [axis]: nextAxis }, photo);\n\t}\n\tfunction togglePhoto(c: string) {\n\t\tif (photo.includes(c)) {\n\t\t\tonchange(value, photo.filter((x) => x !== c));\n\t\t} else if (photo.length < photoMax) {\n\t\t\tonchange(value, [...photo, c]);\n\t\t}\n\t}\n\tfunction clearAll() {\n\t\tconst cleared = Object.fromEntries(Object.keys(AXIS_VALUES).map((a) => [a, []]));\n\t\tonchange(cleared, []);\n\t}\n\n\t// Flat token list for the filter's live summary.\n\tconst tokens = $derived(\n\t\t(Object.keys(AXIS_VALUES) as ArenaAxis[])\n\t\t\t.flatMap((a) => (value[a] ?? []).map((v) => valueLabel(a, v)))\n\t\t\t.concat(photo)\n\t);\n\tconst hint = $derived(variant === 'whoami' ? t('multi') : t('any'));\n</script>\n\n{#snippet chip(axis: ArenaAxis, v: string)}\n\t{@const active = (value[axis] ?? []).includes(v)}\n\t{@const locked = !active && (value[axis] ?? []).length >= maxFor(axis)}\n\t<button\n\t\ttype=\"button\"\n\t\tdisabled={locked}\n\t\tclass=\"min-h-[40px] rounded-xl border px-3 py-2 text-[13px] transition-colors {active\n\t\t\t? 'border-orange bg-orange font-medium text-white'\n\t\t\t: locked\n\t\t\t\t? 'cursor-not-allowed border-border text-muted/25'\n\t\t\t\t: 'cursor-pointer border-border text-muted hover:border-border-strong hover:text-text'}\"\n\t\tonclick={() => toggle(axis, v)}\n\t\taria-pressed={active}\n\t>\n\t\t{valueLabel(axis, v)}\n\t</button>\n{/snippet}\n\n{#snippet section(axis: ArenaAxis, small = false)}\n\t{@const max = maxFor(axis)}\n\t{@const n = (value[axis] ?? []).length}\n\t{@const capped = Number.isFinite(max)}\n\t<div class=\"mb-1 flex items-baseline justify-between\">\n\t\t<span class=\"text-[12px] {small ? 'text-muted/60' : 'text-muted'}\">{AXIS_LABELS[axis]}</span>\n\t\t<span class=\"text-[11px] {capped && n >= max ? 'text-orange' : 'text-muted/40'}\">\n\t\t\t{isSingle(axis) ? t('one') : capped ? `${n}/${max}` : hint}\n\t\t</span>\n\t</div>\n\t<div class=\"flex flex-wrap gap-2\">\n\t\t{#each AXIS_VALUES[axis] as v (v)}\n\t\t\t{@render chip(axis, v)}\n\t\t{/each}\n\t</div>\n{/snippet}\n\n<div class=\"flex flex-col gap-4\">\n\t{#if variant === 'seek'}\n\t\t<div\n\t\t\tclass=\"flex flex-wrap items-center gap-2 rounded-xl border border-border bg-surface px-3 py-2.5\"\n\t\t>\n\t\t\t<span class=\"text-[11px] text-muted/60\">{t('showing')}</span>\n\t\t\t{#if tokens.length === 0}\n\t\t\t\t<span class=\"rounded-full border border-border px-2.5 py-1 text-[12px] text-muted\">{t('everyone')}</span>\n\t\t\t{:else}\n\t\t\t\t{#each tokens as t (t)}\n\t\t\t\t\t<span class=\"rounded-full bg-orange/15 px-2.5 py-1 text-[12px] text-orange\">{t}</span>\n\t\t\t\t{/each}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"ml-auto flex cursor-pointer items-center gap-1 text-[12px] text-muted hover:text-text\"\n\t\t\t\t\tonclick={clearAll}\n\t\t\t\t>\n\t\t\t\t\t{t('✕ everyone')}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t</div>\n\t{/if}\n\n\t{#each PRIMARY_AXES as axis (axis)}\n\t\t<div>{@render section(axis)}</div>\n\t{/each}\n\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"flex w-full cursor-pointer items-center justify-between rounded-xl border border-border bg-surface px-4 py-3 text-left transition-colors hover:border-muted\"\n\t\tonclick={() => (showMore = !showMore)}\n\t\taria-expanded={showMore}\n\t>\n\t\t<span class=\"min-w-0\">\n\t\t\t<span class=\"font-display text-[13px] font-bold text-text\">\n\t\t\t\t{showMore ? t('fewer filters') : t('more filters')}\n\t\t\t</span>\n\t\t\t<span class=\"ml-1.5 text-[11px] text-muted/60\">\n\t\t\t\t{showPhoto ? t('position · age · ethnicity · photo tags') : t('position · age · ethnicity')}\n\t\t\t</span>\n\t\t</span>\n\t\t<svg\n\t\t\tclass=\"ml-2 h-4 w-4 shrink-0 text-muted/50 transition-transform {showMore ? 'rotate-180' : ''}\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstroke-width=\"1.5\"\n\t\t\tstroke-linecap=\"round\"\n\t\t\tstroke-linejoin=\"round\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<path d=\"M4 6l4 4 4-4\" />\n\t\t</svg>\n\t</button>\n\n\t{#if showMore}\n\t\t<div class=\"flex flex-col gap-4\">\n\t\t\t{#each SECONDARY_AXES as axis (axis)}\n\t\t\t\t<div>{@render section(axis, true)}</div>\n\t\t\t{/each}\n\t\t\t{#if showPhoto}\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"mb-1 flex items-baseline justify-between\">\n\t\t\t\t\t\t<span class=\"text-[12px] text-muted/60\">{t('photo tags')}</span>\n\t\t\t\t\t\t<span class=\"text-[11px] {Number.isFinite(photoMax) && photo.length >= photoMax ? 'text-orange' : 'text-muted/40'}\">\n\t\t\t\t\t\t\t{Number.isFinite(photoMax) ? `${photo.length}/${photoMax}` : t('any')}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t{#each ARENA_CATEGORIES as c (c)}\n\t\t\t\t\t\t\t{@const active = photo.includes(c)}\n\t\t\t\t\t\t\t{@const locked = !active && photo.length >= photoMax}\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\tdisabled={locked}\n\t\t\t\t\t\t\t\tclass=\"min-h-[36px] rounded-xl border px-2.5 py-1.5 text-[12px] transition-colors {active\n\t\t\t\t\t\t\t\t\t? 'border-orange bg-orange font-medium text-white'\n\t\t\t\t\t\t\t\t\t: locked\n\t\t\t\t\t\t\t\t\t\t? 'cursor-not-allowed border-border text-muted/25'\n\t\t\t\t\t\t\t\t\t\t: 'cursor-pointer border-border text-muted/70 hover:text-text'}\"\n\t\t\t\t\t\t\t\tonclick={() => togglePhoto(c)}\n\t\t\t\t\t\t\t\taria-pressed={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ARENA_CATEGORY_LABELS[c as ArenaCategory]}\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</div>\n\t\t\t{/if}\n\t\t</div>\n\t{/if}\n\n\t<p class=\"text-[11px] leading-relaxed text-muted/60\">\n\t\t{#if variant === 'whoami'}\n\t\t\t{t('skip anything — you still show to everyone. gender is not defaulted.')}\n\t\t{:else}\n\t\t\t{t('picks float matching cards to the front — nobody is hidden. empty = everyone, like now.')}\n\t\t{/if}\n\t</p>\n</div>\n"],"version":3}