// One arc (EVENTS.md §I, Phase 14a). // // **The arc is the thing the tooling this replaces could not express at all.** // A WordPress calendar plugin has no series field, so "Royal Spy Mission → Risky // Partner → Message From the Void" existed only in a GM's head and in whatever // the forum post said. This page is that continuity, in the order an editor // arranged it — which is why the events are numbered rather than dated: an arc // has an order, and its parts may be months apart or run out of sequence. import { useParams, Link } from 'react-router-dom' import PublicLayout from '../../components/PublicLayout.jsx' import PageHeader from '../../components/PageHeader.jsx' import { Loading, ErrorState } from '../../components/PageState.jsx' import { useAsync } from '../../lib/useAsync.js' import { api } from '../../api/client.js' export default function EventSeries() { const { slug } = useParams() const { loading, error, data } = useAsync(() => api.publicEventSeries(slug), [slug]) // Error first, then loading — the order Phase 13 had to fix on the admin // editor, where a failed load sat behind a spinner that never stopped. if (error) { return (

Back to the calendar

) } if (loading || !data) { return (
) } const series = data.series return (
    {series.events.map((e, i) => (
  1. {i + 1} {e.title} {e.summary &&

    {e.summary}

    }
  2. ))}

Back to the calendar

) }