Give the tech radar its own page

/radar (/en/radar, /ca/radar) shows every technology the collective has
placed, by ring: logo, category, what it is, why it sits there, its
website and how many projects use it. The landing's radar summary links
to it.

It is the first listing — a page this site composes rather than one
record's — so resolveRoute learns about those (LISTINGS), and builds
their addresses and hreflang alternates from the same table.

Logos sit on a light tile in both themes. A brand's mark is not ours to
recolour, and Rust's, which is black, would vanish in dark mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
pigui
2026-09-29 15:07:19 +02:00
parent b5681a12ac
commit 06eeefc144
11 changed files with 558 additions and 13 deletions

View File

@@ -114,6 +114,19 @@ export interface Copy {
links: string;
since: string;
};
radar: {
eyebrow: string;
lead: string;
ringLead: Record<'adopt' | 'trial' | 'assess' | 'hold', string>;
categories: Record<
'language' | 'framework' | 'datastore' | 'infrastructure' | 'tool' | 'practice',
string
>;
website: string;
projects: string;
empty: string;
seeAll: string;
};
call: {
eyebrow: string;
seniority: Record<'any' | 'junior' | 'mid' | 'senior', string>;
@@ -248,6 +261,28 @@ const es: Copy = {
links: 'Enlaces',
since: 'En el colectivo desde',
},
radar: {
eyebrow: 'Radar tecnológico',
lead: 'Las herramientas con las que trabajamos y lo que opinamos de cada una: qué usamos sin dudar, qué estamos probando y qué preferimos evitar.',
ringLead: {
adopt: 'Lo usamos en proyectos reales y lo recomendamos sin reservas.',
trial: 'Lo estamos probando en proyectos donde el riesgo es asumible.',
assess: 'Nos interesa y lo estamos estudiando, sin usarlo aún en serio.',
hold: 'Por ahora preferimos no empezar nada nuevo con esto.',
},
categories: {
language: 'Lenguaje',
framework: 'Framework',
datastore: 'Datos',
infrastructure: 'Infraestructura',
tool: 'Herramienta',
practice: 'Práctica',
},
website: 'Web oficial',
projects: 'proyectos',
empty: 'Todavía no hemos colocado ninguna tecnología en el radar.',
seeAll: 'Ver el radar completo',
},
call: {
eyebrow: 'Convocatoria',
seniority: { any: 'Cualquier nivel', junior: 'Junior', mid: 'Intermedio', senior: 'Senior' },
@@ -386,6 +421,28 @@ const en: Copy = {
links: 'Links',
since: 'In the collective since',
},
radar: {
eyebrow: 'Tech radar',
lead: 'The tools we work with and what we think of each: what we use without a second thought, what we are trying out and what we would rather avoid.',
ringLead: {
adopt: 'We use it on real projects and recommend it without reservation.',
trial: 'We are trying it out on projects where the risk is acceptable.',
assess: 'It interests us and we are looking into it, without using it seriously yet.',
hold: 'For now we would rather not start anything new with it.',
},
categories: {
language: 'Language',
framework: 'Framework',
datastore: 'Data',
infrastructure: 'Infrastructure',
tool: 'Tool',
practice: 'Practice',
},
website: 'Official website',
projects: 'projects',
empty: 'We have not placed any technology on the radar yet.',
seeAll: 'See the full radar',
},
call: {
eyebrow: 'Open call',
seniority: { any: 'Any level', junior: 'Junior', mid: 'Mid-level', senior: 'Senior' },
@@ -524,6 +581,28 @@ const ca: Copy = {
links: 'Enllaços',
since: 'Al col·lectiu des de',
},
radar: {
eyebrow: 'Radar tecnològic',
lead: "Les eines amb què treballem i què en pensem de cadascuna: què fem servir sense dubtar, què estem provant i què preferim evitar.",
ringLead: {
adopt: 'El fem servir en projectes reals i el recomanem sense reserves.',
trial: "L'estem provant en projectes on el risc és assumible.",
assess: "Ens interessa i l'estem estudiant, sense fer-lo servir encara seriosament.",
hold: 'Ara per ara preferim no començar res de nou amb això.',
},
categories: {
language: 'Llenguatge',
framework: 'Framework',
datastore: 'Dades',
infrastructure: 'Infraestructura',
tool: 'Eina',
practice: 'Pràctica',
},
website: 'Web oficial',
projects: 'projectes',
empty: 'Encara no hem col·locat cap tecnologia al radar.',
seeAll: 'Veure el radar sencer',
},
call: {
eyebrow: 'Convocatòria',
seniority: { any: 'Qualsevol nivell', junior: 'Júnior', mid: 'Intermedi', senior: 'Sènior' },