feat: add SEO metadata, llms.txt, and markdown page mirrors

Centralize site metadata and social URLs for JSON-LD, expose llmstxt.org
content and per-page .md routes for LLM crawlers, and refactor blog/FAQ/events
pages with shared components.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
bbe
2026-06-29 00:59:41 +02:00
co-authored by Cursor
parent 99380ef6aa
commit 6023991f5c
27 changed files with 1082 additions and 401 deletions
+21
View File
@@ -52,6 +52,27 @@ export function getMeetupStartUtc(dateStr: string, timeStr: string): Date {
return new Date(Date.UTC(year, month - 1, day, utcStartH, startM, 0));
}
/**
* Returns the event end instant in UTC when the time string carries a range
* (e.g. "18:00 - 21:00"), otherwise null. Used for schema.org Event.endDate.
*/
export function getMeetupEndUtc(dateStr: string, timeStr: string): Date | null {
const key = normalizeMeetupDateKey(dateStr);
if (!key) return null;
const parts = key.split("-").map(Number);
const year = parts[0];
const month = parts[1];
const day = parts[2];
if (!year || !month || !day) return null;
const timeParts = (timeStr?.trim() || "").split(/\s*[-]\s*/);
if (timeParts.length < 2 || !timeParts[1]?.trim()) return null;
const { h: endH, m: endM } = parseLocalTime(timeParts[1]);
const utcEndH = endH - BRUSSELS_OFFSET_HOURS;
return new Date(Date.UTC(year, month - 1, day, utcEndH, endM, 0));
}
const UTC_CAL_OPTS = { timeZone: "UTC" } as const;
/**