--- import { renderBrand } from '../lib/brand.mjs'; import { legal } from '../data/legal.mjs'; import { footerColumns } from '../data/footer.mjs'; import platform from '../data/platform.json'; /** * The footer is on every page, so it is the one place that must never quote a fact from * memory. The version chip reads `platform.json` (§12); the contact address and the links * read `brand.json` (§7, D13). * * `/privacy` and `/terms` are linked from every page (§9). Phase 6 built them and put them * in the legal bar at the foot rather than in the columns: a legal link is not a thing a * reader browses to alongside Features, it is a thing they go looking for, and the line * that already carries the licence and the copyright is where people look. */ // `/beta` renders per request, so the footer it gets must read the mount rather than the // value baked at build time. See `renderBrand` in src/lib/brand.mjs (phase 11). const brand = renderBrand(Astro); const year = new Date().getFullYear(); // The columns live in src/data/footer.mjs so a test can read them — see the note there, // and test/footer.test.mjs. The two Project links come from the mounted brand (§7). const columns = footerColumns(brand); const isExternal = (href: string) => href.startsWith('http'); ---