Add full trilingual EN/FR/NB support across all pages and data
- Convert all data files (site, profile, norway, jazz, projects, cv) to Record<LocaleCode, string> fields - Update all page templates to use LocaleCopy component for locale-aware rendering - Fix CSS specificity conflict: .locale-copy .locale-copy__text (spec 20) now beats container span rules (spec 11) - Update LocaleSwitcher, BaseLayout, and SectionCard for locale prop types - Design system overhaul: Special Elite font, burgundy #8f2218, DG seal favicon Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+13
-12
@@ -9,6 +9,7 @@ import {
|
||||
cvTimeline,
|
||||
} from "../data/cv";
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
import LocaleCopy from "../components/LocaleCopy.astro";
|
||||
|
||||
const currentMandates = cvMandates.slice(0, 3);
|
||||
const educationSlice = schoolDossiers.slice(0, 5);
|
||||
@@ -21,9 +22,9 @@ const educationSlice = schoolDossiers.slice(0, 5);
|
||||
<main class="cv-page">
|
||||
<section class="container cv-hero">
|
||||
<div class="cv-hero__copy">
|
||||
<span class="eyebrow">{cvHero.eyebrow}</span>
|
||||
<h1>{cvHero.title}</h1>
|
||||
<p class="cv-hero__lede">{cvHero.lede}</p>
|
||||
<span class="eyebrow"><LocaleCopy copy={cvHero.eyebrow} /></span>
|
||||
<h1><LocaleCopy copy={cvHero.title} /></h1>
|
||||
<p class="cv-hero__lede"><LocaleCopy copy={cvHero.lede} /></p>
|
||||
|
||||
<div class="cv-hero__actions">
|
||||
<a class="button button--dark" href="#career-record">Read the chronology</a>
|
||||
@@ -38,13 +39,13 @@ const educationSlice = schoolDossiers.slice(0, 5);
|
||||
</div>
|
||||
<p class="cv-poster__eyebrow">Bridgework</p>
|
||||
<h2>Finance, systems, language, and advocacy on one line.</h2>
|
||||
<p>{cvHero.note}</p>
|
||||
<p><LocaleCopy copy={cvHero.note} /></p>
|
||||
|
||||
<div class="cv-poster__grid">
|
||||
{cvHighlights.map((item) => (
|
||||
{cvHighlights.en.map((_, i) => (
|
||||
<article>
|
||||
<span>Signal</span>
|
||||
<p>{item}</p>
|
||||
<p><LocaleCopy copy={{ en: cvHighlights.en[i], fr: cvHighlights.fr[i], nb: cvHighlights.nb[i] }} /></p>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
@@ -68,8 +69,8 @@ const educationSlice = schoolDossiers.slice(0, 5);
|
||||
<span>{mandate.location}</span>
|
||||
</div>
|
||||
<h2>{mandate.org}</h2>
|
||||
<p class="cv-mandate__summary">{mandate.summary}</p>
|
||||
<p>{mandate.detail}</p>
|
||||
<p class="cv-mandate__summary"><LocaleCopy copy={mandate.summary} /></p>
|
||||
<p><LocaleCopy copy={mandate.detail} /></p>
|
||||
<a href={mandate.sourceUrl} target="_blank" rel="noreferrer">
|
||||
Source: {mandate.sourceLabel}
|
||||
</a>
|
||||
@@ -100,11 +101,11 @@ const educationSlice = schoolDossiers.slice(0, 5);
|
||||
<strong>{role.role}</strong>
|
||||
</div>
|
||||
|
||||
<p class="cv-role__summary">{role.summary}</p>
|
||||
<p class="cv-role__summary"><LocaleCopy copy={role.summary} /></p>
|
||||
|
||||
<ul>
|
||||
{role.bullets.map((bullet) => (
|
||||
<li>{bullet}</li>
|
||||
{role.bullets.en.map((_, i) => (
|
||||
<li><LocaleCopy copy={{ en: role.bullets.en[i], fr: role.bullets.fr[i], nb: role.bullets.nb[i] }} /></li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
@@ -120,7 +121,7 @@ const educationSlice = schoolDossiers.slice(0, 5);
|
||||
</div>
|
||||
{cvSkillTracks.map((track) => (
|
||||
<section>
|
||||
<h3>{track.label}</h3>
|
||||
<h3><LocaleCopy copy={track.label} /></h3>
|
||||
<ul>
|
||||
{track.items.map((item) => (
|
||||
<li>{item}</li>
|
||||
|
||||
Reference in New Issue
Block a user