Give projects and members their own pages
The API has always served a project's and a member's detail, with `path` and `alternates` in three languages, and the site had nowhere to show it. A project now has its page — tagline, status, technologies, description, technical decisions, what was learned, gallery, client, dates, lead, team, repositories and open calls — and so does a member: headline, bio, links, technologies and projects. Cards on the landing link to both. Addresses follow the API's rule read backwards (core/routes.ts): pages at the root, records under a section named in their language, the default language unprefixed. One catch-all route serves them all. Not a route per shape: Analog registers each loader as an internal Nitro route, and Nitro's router cannot hold `/:prefix/:slug` beside `/:prefix/:section/:slug` — the first became unreachable. The frame around a record (header, footer, lights, 404/503, title, description, canonical, hreflang) is one component now, PageShell, and each type only brings its body, all sharing one layout partial. Also fixes chips that stepped down one row after the first, on the landing's cards too: @pi/ui's reset gives every `li + li` a top margin, right for prose and wrong for a row spaced by `gap`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -91,6 +91,29 @@ export interface Copy {
|
||||
};
|
||||
footer: { rights: string; pages: string };
|
||||
page: { skip: string; related: string; ctaTitle: string; ctaLead: string };
|
||||
project: {
|
||||
decisions: string;
|
||||
postmortem: string;
|
||||
gallery: string;
|
||||
details: string;
|
||||
status: string;
|
||||
client: string;
|
||||
period: string;
|
||||
lead: string;
|
||||
team: string;
|
||||
repositories: string;
|
||||
forks: string;
|
||||
dormant: string;
|
||||
archived: string;
|
||||
openCalls: string;
|
||||
technologies: string;
|
||||
};
|
||||
member: {
|
||||
projects: string;
|
||||
technologies: string;
|
||||
links: string;
|
||||
since: string;
|
||||
};
|
||||
maintenance: { title: string; back: string; until: string };
|
||||
}
|
||||
|
||||
@@ -190,6 +213,29 @@ const es: Copy = {
|
||||
ctaTitle: '¿Hablamos?',
|
||||
ctaLead: 'Si algo de esto encaja con lo que buscas, escríbenos y te respondemos.',
|
||||
},
|
||||
project: {
|
||||
decisions: 'Decisiones técnicas',
|
||||
postmortem: 'Qué aprendimos',
|
||||
gallery: 'Galería',
|
||||
details: 'El proyecto',
|
||||
status: 'Estado',
|
||||
client: 'Para',
|
||||
period: 'Fechas',
|
||||
lead: 'Responsable',
|
||||
team: 'Equipo',
|
||||
repositories: 'Código',
|
||||
forks: 'forks',
|
||||
dormant: 'Sin actividad reciente',
|
||||
archived: 'Archivado',
|
||||
openCalls: 'Buscamos ayuda',
|
||||
technologies: 'Tecnologías',
|
||||
},
|
||||
member: {
|
||||
projects: 'Proyectos',
|
||||
technologies: 'Tecnologías',
|
||||
links: 'Enlaces',
|
||||
since: 'En el colectivo desde',
|
||||
},
|
||||
maintenance: {
|
||||
title: 'Estamos de mantenimiento',
|
||||
back: 'Volvemos en un rato.',
|
||||
@@ -293,6 +339,29 @@ const en: Copy = {
|
||||
ctaTitle: 'Shall we talk?',
|
||||
ctaLead: 'If any of this fits what you are looking for, write to us and we will get back to you.',
|
||||
},
|
||||
project: {
|
||||
decisions: 'Technical decisions',
|
||||
postmortem: 'What we learned',
|
||||
gallery: 'Gallery',
|
||||
details: 'The project',
|
||||
status: 'Status',
|
||||
client: 'For',
|
||||
period: 'Dates',
|
||||
lead: 'Lead',
|
||||
team: 'Team',
|
||||
repositories: 'Code',
|
||||
forks: 'forks',
|
||||
dormant: 'No recent activity',
|
||||
archived: 'Archived',
|
||||
openCalls: 'Looking for help',
|
||||
technologies: 'Technologies',
|
||||
},
|
||||
member: {
|
||||
projects: 'Projects',
|
||||
technologies: 'Technologies',
|
||||
links: 'Links',
|
||||
since: 'In the collective since',
|
||||
},
|
||||
maintenance: {
|
||||
title: 'We are under maintenance',
|
||||
back: 'Back in a while.',
|
||||
@@ -396,6 +465,29 @@ const ca: Copy = {
|
||||
ctaTitle: 'En parlem?',
|
||||
ctaLead: "Si alguna cosa d'aquestes encaixa amb el que busques, escriu-nos i et respondrem.",
|
||||
},
|
||||
project: {
|
||||
decisions: 'Decisions tècniques',
|
||||
postmortem: 'Què vam aprendre',
|
||||
gallery: 'Galeria',
|
||||
details: 'El projecte',
|
||||
status: 'Estat',
|
||||
client: 'Per a',
|
||||
period: 'Dates',
|
||||
lead: 'Responsable',
|
||||
team: 'Equip',
|
||||
repositories: 'Codi',
|
||||
forks: 'forks',
|
||||
dormant: 'Sense activitat recent',
|
||||
archived: 'Arxivat',
|
||||
openCalls: 'Busquem ajuda',
|
||||
technologies: 'Tecnologies',
|
||||
},
|
||||
member: {
|
||||
projects: 'Projectes',
|
||||
technologies: 'Tecnologies',
|
||||
links: 'Enllaços',
|
||||
since: 'Al col·lectiu des de',
|
||||
},
|
||||
maintenance: {
|
||||
title: 'Estem de manteniment',
|
||||
back: 'Tornem d’aquí una estona.',
|
||||
|
||||
Reference in New Issue
Block a user