diff --git a/package.json b/package.json index ebdeb9e9..4e6d0622 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homepage", - "version": "1.49.3", + "version": "1.50.0", "private": true, "type": "module", "scripts": { diff --git a/src/lib/data/apologetik.ts b/src/lib/data/apologetik.ts index b97066c4..d9171aab 100644 --- a/src/lib/data/apologetik.ts +++ b/src/lib/data/apologetik.ts @@ -1581,6 +1581,32 @@ export function findArgument(id: string): Argument | undefined { return ARGUMENTS.find((a) => a.id === id); } +// Alex's curated picks per argument (archetype IDs). Same across locales. +export const ALEX_PICKS: Record = { + evil: ["aquinas"], + evidence: ["logician", "pascal"], + science: ["logician", "lewis"], + morality: ["logician"], + "religion-violence": ["logician"], + miracles: ["logician", "pascal"], + hiddenness: ["pascal"], + hell: ["aquinas", "lewis"], + birth: ["lewis", "justin"], + bible: ["augustine", "newman"], + scale: ["chesterton"], + "natural-evil": ["lewis", "catechism"], + "many-gods": ["newman"], + neuroscience: ["mystic"], + prayer: ["lewis", "aquinas"], + pleasure: ["catechism"], + projection: ["lewis", "chesterton"], + "faith-reason": ["aquinas", "lewis"], + mythicism: ["historian"], + corruption: ["pastor", "chesterton"], + intelligence: ["logician"], + submission: ["lewis"], +}; + // Locale-aware accessors. DE comes from auto-generated apologetik.de.ts; // EN is the source of truth. Latin falls back to EN since DeepL doesn't // support it — fill in apologetik.la.ts manually if/when desired. diff --git a/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/+page.svelte b/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/+page.svelte index f714e739..5c3dcc2e 100644 --- a/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/+page.svelte +++ b/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/+page.svelte @@ -201,7 +201,7 @@ {@const a = ARCHETYPES[archId]} { e.preventDefault(); @@ -137,6 +136,20 @@ > {a.name} + {#if isPick} + + + {alexChoiceLabel} + + {/if} {/each} @@ -345,6 +358,59 @@ color: var(--color-text-primary); } + .alex-mark { + position: absolute; + top: -4px; + right: -6px; + z-index: 2; + display: inline-flex; + align-items: center; + border-radius: var(--radius-pill); + background: var(--color-bg-elevated); + border: 1px solid var(--color-border); + padding: 1px; + box-shadow: var(--shadow-sm); + pointer-events: none; + transform: translateY(0); + transition: + padding var(--transition-normal), + transform var(--transition-normal); + } + .alex-pfp { + width: 14px; + height: 14px; + border-radius: 50%; + object-fit: cover; + display: block; + flex: none; + } + .alex-label { + display: inline-block; + white-space: nowrap; + font-size: 0.62rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + max-width: 0; + opacity: 0; + margin-left: 0; + overflow: hidden; + color: var(--color-text-primary); + transition: + max-width var(--transition-normal), + opacity var(--transition-fast), + margin-left var(--transition-normal); + } + .tab.active.has-pick .alex-mark { + padding: 1px 8px 1px 1px; + transform: translateY(-8px); + } + .tab.active.has-pick .alex-label { + max-width: 140px; + opacity: 1; + margin-left: 5px; + } + .glyph { display: inline-flex; align-items: center; diff --git a/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/[argId]/[[archId]]/+page.ts b/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/[argId]/[[archId]]/+page.ts new file mode 100644 index 00000000..c7430dfc --- /dev/null +++ b/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/contra/[argId]/[[archId]]/+page.ts @@ -0,0 +1,27 @@ +import { error } from '@sveltejs/kit'; +import { ALEX_PICKS, findArgumentLang, getArchetypes, getArguments } from '$lib/data/apologetik'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ params, parent }) => { + const { lang } = await parent(); + const [arg, archetypes, args] = await Promise.all([ + findArgumentLang(params.argId, lang), + getArchetypes(lang), + getArguments(lang) + ]); + if (!arg) { + error(404, 'Argument not found'); + } + const archIds = Object.keys(arg.counters); + if (params.archId && !archIds.includes(params.archId)) { + error(404, 'Voice not found'); + } + const initialArchId = params.archId ?? null; + return { + argument: arg, + archetypes, + args, + alexPicks: ALEX_PICKS[params.argId] ?? [], + initialArchId + }; +}; diff --git a/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/pro/+page.svelte b/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/pro/+page.svelte index b9291fbd..1599e4c2 100644 --- a/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/pro/+page.svelte +++ b/src/routes/[faithLang=faithLang]/[apologetikSlug=apologetikSlug]/pro/+page.svelte @@ -286,7 +286,7 @@ {@const v = POS_VOICES[vid]}