diff --git a/apps/web/app/components/ui/Footer/Footer.tsx b/apps/web/app/components/ui/Footer/Footer.tsx index cb576ac..cd72e6f 100644 --- a/apps/web/app/components/ui/Footer/Footer.tsx +++ b/apps/web/app/components/ui/Footer/Footer.tsx @@ -11,13 +11,17 @@ everything that carries meaning (`text-[var(--text-primary)]`). No raw hex, no tier-1 primitive, no component stylesheet. - TWO DELIBERATE DEVIATIONS FROM THE PUBLISHED FRAMES, both noted inline: - 1. the two EN frames disagree on the sitemap (140:7812 carries the real IA - but no column headings, 140:7814 carries headings but stale labels) - - this takes the newer IA and the headings; - 2. `text/tertiary` (#949492) on white is ~2.9:1, so the small labels use - `--text-secondary` instead. Revert the two lines marked (a11y) for - pixel-exact parity. + ONE DELIBERATE DEVIATION FROM THE PUBLISHED FRAMES: + the two EN frames disagree on the sitemap. 140:7812 carries the real IA but + no column headings; 140:7814 carries headings but labels for pages that do + not exist (Partners, Blog, Photo Gallery, SUQs, Pilot Initiatives, + Research). This takes the newer IA - built from ROUTE_SLUGS, the same + source the router is built from - and the headings. Linking the frame's + labels verbatim is what previously shipped five dead links. + + Column headings take `--text-tertiary`, as the frames do: that token is + already re-pointed to a readable step on the light surface (semantic.css), + so it needs no a11y override here. ========================================================================= */ import { Link } from "react-router"; @@ -62,17 +66,22 @@ const FOCUS_RING = cx( const TRANSITION = "transition-[color] duration-[var(--motion-duration-fast)] ease-[var(--motion-ease-standard)]"; -/** Body/Medium Bold links, as in figma 380:12385. */ +/** Body/Large Bold links - 18/28, as the footer frame sets them. */ const LINK_CLASS = cx( FOCUS_RING, TRANSITION, - "body-md-bold inline-block text-[var(--text-primary)]", + "body-lg-bold inline-block text-[var(--text-primary)]", "hover:text-[var(--text-link)] hover:underline underline-offset-4", ); -/** Label/Medium, used for the column headings and the "implemented by" label. */ +/** Label/Medium - the "implemented by" label (figma 228:3035). */ const LABEL_CLASS = "label-md uppercase"; +/** Body/Small Bold - the sitemap column headings (figma 140:7823 / 140:7834). + `--text-tertiary` is already remapped to a readable step on the light + surface, so the same token is correct on both. */ +const GROUP_HEADING_CLASS = "body-sm-bold uppercase text-[var(--text-tertiary)]"; + /** * Internal links go through the router so the footer navigates client-side; * anything flagged `external` stays a plain anchor and opens in a new tab. @@ -117,9 +126,11 @@ export function Footer({ dir={dir} data-surface={surface} className={cx( - // data-surface paints background-color and color itself (app.css), so - // the footer needs no colour utility of its own. - "w-full px-lg pb-2xl pt-[var(--layout-section-gap)] md:px-xl", + // data-surface sets the palette, but the frame puts the footer on its + // own ground (base/black on dark) with a rule separating it from the + // page, so those two are stated here rather than inherited. + "w-full border-t border-[var(--border-default)] bg-[var(--surface-footer)]", + "px-lg pb-2xl pt-[var(--layout-section-gap)] md:px-xl", className, )} > @@ -185,11 +196,8 @@ export function Footer({ index < groups.length - 1 && "sm:pe-xl", )} > - {/* (a11y) figma uses text/tertiary; see the header note. */} -
- {paragraph} -
- ))} -{copy.fundingNote}
+ {copy.launchLead.map((run, index) => + typeof run === "string" ? ( + {run} + ) : ( + + {run.em} + + ), + )} +
+