Docs

    Events & News pattern

    Use one module for event and news content, with latest + archive behavior.

    Standard

    - Use `EventsNewsSection` with a unified `event | news` entry contract.

    - Always keep full history in data; render latest entries + archive.

    - Keep entries in calendar order (newest first for combined feed).

    - Show event-only links (`Open in Maps`, `Add to Google Calendar`, `Share event`) only for events.

    - Do not duplicate event actions for news-only items.

    - Event-action parity rule: every migrated site news/events implementation must expose these three event actions.

    - News entries may link to external URLs or local article routes (for in-site articles).

    - For event detail pages, use index + detail routing (for example `/events` plus `/events/my-event-slug`).

    - Use lightweight metadata labels for status/type context on cards.

    - Optional future-events banner is available for home/main page announcements.

    - Use `eventDetailsBasePath` when events should auto-link to local event detail routes.

    - Recurring event banner cards should resolve to local detail links when `eventDetailsBasePath` is configured.

    - For index pages, use `cardMode="index"` so cards stay summary-only (no body/highlights/images).

    - Recurring events are supported via `event.recurrence` (weekly, biweekly, monthly by day, monthly nth-week weekday).

    - Keep `EnvironmentBanner` and event banner separated (never merged into one banner).

    - If both render on a page, order must be `EnvironmentBanner` first, then event banner.

    - Render event banner only when there are active future events; if none exist, do not render event banner row.

    - Banner placement standard: render both in page flow directly under the header; do not mount globally in shared layout.

    - Content seeding standard: do not add fake/sample events in migrated production-like sites; start with empty entries until real events exist.

    - Optional featured card and archive controls are built in (`showFeatured`, archive props).

    Reference

    - Live example: Events & News example page

    - Local article route example: News Article Example

    - Component: `template/src/components/patterns/EventsNewsSection.tsx`

    Local article workflow

    - Create a local page route (for example `/news/my-article-slug`) and add it to `AppRoutes.tsx`.

    - Point the news entry `href` to that local route.

    - Build-time route discovery (`tools/app-routes.mjs`) picks up the route for prerender + sitemap.

    - If using dynamic routes, enumerate concrete article URLs via `PRERENDER_EXTRA_ROUTES`.

    - Apply the same rule for event detail routes so each event URL is present in sitemap output.

    - Validate with `npm run build` and `npm run qa:smoke:nojs`.

    - Prefer rendering event banner as a separate page-level block under header for deterministic ordering with `EnvironmentBanner`.

    - For archived history controls, use `archiveOpenByDefault` and `archiveMaxItems`.