feat(faith/apologetik): voice routing + Alex's choice chip

- contra/pro detail pages move from #voice-X hash to /[argId]/[archId]
  (and /[posArgId]/[voiceId]) optional path segments. SSR renders the
  selected voice directly — no hydration flash on deep links.
- Tab onclick uses replaceState to update path without a load roundtrip.
- Add Alex's choice chip on contra detail tabs: small circular pfp on
  picks, expanded label on the active tab. ALEX_PICKS map per argument.
- Answer-rail pills on contra index extend past 760px column into the
  right viewport gutter when space allows; wrap otherwise.
This commit is contained in:
2026-04-29 21:32:02 +02:00
parent 538b70d139
commit 70506e169a
9 changed files with 165 additions and 55 deletions
+26
View File
@@ -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<string, string[]> = {
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.