Skip to content

Commit 58520cb

Browse files
committed
update to next@15
1 parent 7ed38fc commit 58520cb

File tree

6 files changed

+885
-672
lines changed

6 files changed

+885
-672
lines changed

NEXT_STEPS.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@
33
Mantén este archivo actualizado al final de cada sesión. Úsalo como checklist para el siguiente bloque de trabajo.
44

55
## Contenido y data
6+
67
- Completar métricas/impacto reales en `lib/data/case-studies.ts` (impact.es/en, problem/solution finales).
78
- Evaluar si `domain` y `type` en proyectos/casos deben traducirse o quedarse en ES; ajustar a `{ es, en }` si se requieren en inglés.
89
- Añadir selector de idioma en páginas de caso si se desea cambio directo allí.
910

1011
## Tooling y build
11-
- Generar `package-lock.json` con `npm install` y agregarlo al repo para builds reproducibles.
12+
1213
- Configurar ESLint (el comando `npm run lint` pide setup). Decidir si usar preset Next.js (Strict/Base) o una config personalizada.
1314

1415
## UX/UI
16+
1517
- Revisar fondo actual (blobs + grid) y ajustar opacidad/densidad si es necesario.
1618
- Verificar imagen `public/me.png` en About: tamaño, blur y ring en dispositivos móviles.
1719

1820
## Deploy
21+
1922
- Confirmar que `pages.yml` despliega correctamente a `gh-pages` raíz (CNAME `jedabero.me` en `public/`).
2023
- Verificar redirección `/ -> /es`/`/en` en GitHub Pages (static export).

app/[lang]/page.tsx

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,40 @@
1-
import { About } from '@/components/sections/about';
2-
import { Architecture } from '@/components/sections/architecture';
3-
import { Contact } from '@/components/sections/contact';
4-
import { Hero } from '@/components/sections/hero';
5-
import { Projects } from '@/components/sections/projects';
6-
import { Navbar } from '@/components/sections/navbar';
7-
import { getDictionary, type Locale } from '@/lib/i18n';
8-
import { notFound } from 'next/navigation';
9-
import { LangRedirect } from '@/components/lang-redirect';
1+
import { About } from "@/components/sections/about";
2+
import { Architecture } from "@/components/sections/architecture";
3+
import { Contact } from "@/components/sections/contact";
4+
import { Hero } from "@/components/sections/hero";
5+
import { Projects } from "@/components/sections/projects";
6+
import { Navbar } from "@/components/sections/navbar";
7+
import { getDictionary, type Locale } from "@/lib/i18n";
8+
import { notFound } from "next/navigation";
9+
import { LangRedirect } from "@/components/lang-redirect";
1010

1111
type Params = { lang: Locale };
1212

13-
export function generateStaticParams() {
14-
return [{ lang: 'es' }, { lang: 'en' }];
13+
export async function generateStaticParams() {
14+
// Declaramos async para alinear con la firma nueva de Next 15 (params puede ser Promise).
15+
return [{ lang: "es" }, { lang: "en" }];
1516
}
1617

17-
export default function LangPage({ params }: { params: Params }) {
18-
if (params.lang !== 'es' && params.lang !== 'en') {
18+
export default async function LangPage({
19+
params,
20+
}: {
21+
params: Promise<Params>;
22+
}) {
23+
// En Next 15 los params llegan como Promise; los esperamos para mantener tipado estricto.
24+
const { lang } = await params;
25+
26+
if (lang !== "es" && lang !== "en") {
1927
return notFound();
2028
}
21-
const dict = getDictionary(params.lang);
29+
const dict = getDictionary(lang);
2230
return (
2331
<main className="min-h-screen">
24-
<LangRedirect currentLocale={params.lang} />
25-
<Navbar content={dict.nav} currentLocale={params.lang} />
32+
<LangRedirect currentLocale={lang} />
33+
<Navbar content={dict.nav} currentLocale={lang} />
2634
<div className="bg-page-gradient bg-grid">
2735
<Hero content={dict.hero} />
2836
<About content={dict.about} />
29-
<Projects content={dict.projects} locale={params.lang} />
37+
<Projects content={dict.projects} locale={lang} />
3038
<Architecture content={dict.architecture} />
3139
<Contact content={dict.contact} />
3240
</div>

app/[lang]/projects/[slug]/page.tsx

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,56 @@
1-
import { CompanyLogo } from '@/components/company-logo';
2-
import { Badge } from '@/components/ui/badge';
3-
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
4-
import { Tabs } from '@/components/ui/tabs';
5-
import { caseStudies } from '@/lib/data/case-studies';
6-
import type { Locale } from '@/lib/i18n';
7-
import { notFound } from 'next/navigation';
1+
import { CompanyLogo } from "@/components/company-logo";
2+
import { Badge } from "@/components/ui/badge";
3+
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
4+
import { Tabs } from "@/components/ui/tabs";
5+
import { caseStudies } from "@/lib/data/case-studies";
6+
import type { Locale } from "@/lib/i18n";
7+
import { notFound } from "next/navigation";
88

99
type Params = { lang: Locale; slug: string };
1010

11-
export function generateStaticParams() {
12-
const locales: Locale[] = ['es', 'en'];
13-
return caseStudies.flatMap((item) => locales.map((lang) => ({ lang, slug: item.slug })));
11+
export async function generateStaticParams() {
12+
const locales: Locale[] = ["es", "en"];
13+
return caseStudies.flatMap((item) =>
14+
locales.map((lang) => ({ lang, slug: item.slug }))
15+
);
1416
}
1517

16-
export default function CaseStudyLangPage({ params }: { params: Params }) {
17-
if (params.lang !== 'es' && params.lang !== 'en') return notFound();
18+
export default async function CaseStudyLangPage({
19+
params,
20+
}: {
21+
params: Promise<Params>;
22+
}) {
23+
const { lang, slug } = await params;
24+
25+
if (lang !== "es" && lang !== "en") return notFound();
1826

19-
const study = caseStudies.find((item) => item.slug === params.slug);
27+
const study = caseStudies.find((item) => item.slug === slug);
2028
if (!study) return notFound();
2129

22-
const isEn = params.lang === 'en';
30+
const isEn = lang === "en";
2331
const title = isEn ? study.title.en : study.title.es;
2432
const problem = isEn ? study.problem.en : study.problem.es;
2533
const solution = isEn ? study.solution.en : study.solution.es;
2634
const impact = isEn ? study.impact.en : study.impact.es;
2735

2836
const tabs = [
29-
{ id: 'context', label: isEn ? 'Context' : 'Contexto', content: problem },
30-
{ id: 'solution', label: isEn ? 'Solution' : 'Solución', content: solution },
37+
{ id: "context", label: isEn ? "Context" : "Contexto", content: problem },
38+
{
39+
id: "solution",
40+
label: isEn ? "Solution" : "Solución",
41+
content: solution,
42+
},
3143
{
32-
id: 'impact',
33-
label: isEn ? 'Impact' : 'Impacto',
44+
id: "impact",
45+
label: isEn ? "Impact" : "Impacto",
3446
content: (
3547
<ul className="list-disc pl-4 space-y-1">
3648
{impact.map((item) => (
3749
<li key={item}>{item}</li>
3850
))}
3951
</ul>
40-
)
41-
}
52+
),
53+
},
4254
];
4355

4456
return (
@@ -47,8 +59,12 @@ export default function CaseStudyLangPage({ params }: { params: Params }) {
4759
<div className="flex items-center gap-3">
4860
<CompanyLogo companyId={study.companyId} size={40} />
4961
<div>
50-
<p className="text-sm text-base-muted uppercase tracking-[0.2em]">{study.company}</p>
51-
<h1 className="text-3xl font-semibold font-display text-base-text">{title}</h1>
62+
<p className="text-sm text-base-muted uppercase tracking-[0.2em]">
63+
{study.company}
64+
</p>
65+
<h1 className="text-3xl font-semibold font-display text-base-text">
66+
{title}
67+
</h1>
5268
</div>
5369
</div>
5470
<div className="flex flex-wrap gap-2">
@@ -71,7 +87,7 @@ export default function CaseStudyLangPage({ params }: { params: Params }) {
7187
</div>
7288
<Card>
7389
<CardHeader>
74-
<CardTitle>{isEn ? 'Details' : 'Detalles'}</CardTitle>
90+
<CardTitle>{isEn ? "Details" : "Detalles"}</CardTitle>
7591
</CardHeader>
7692
<CardContent>
7793
<Tabs tabs={tabs} />

next-env.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
3+
/// <reference path="./.next/types/routes.d.ts" />
34

45
// NOTE: This file should not be edited
5-
// see https://nextjs.org/docs/basic-features/typescript for more information.
6+
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

0 commit comments

Comments
 (0)