-
Notifications
You must be signed in to change notification settings - Fork 0
content: descripciones full-stack de Fast Byte y GMN (web + detalle) #75
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f359ea1
f05fd7e
3364fcc
a5c492a
05b7f4b
6cb3004
e47bf5c
2dd4801
bddfdfe
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -3,6 +3,10 @@ import { notFound } from 'next/navigation'; | |||||||||||||||
| import { getTranslations } from 'next-intl/server'; | ||||||||||||||||
|
|
||||||||||||||||
| import { Project, type ProjectData } from '@/core/entities/Project'; | ||||||||||||||||
| import { | ||||||||||||||||
| getProjectDetail, | ||||||||||||||||
| type ProjectDetailContent, | ||||||||||||||||
| } from '@/features/projects/utils/projectDetail'; | ||||||||||||||||
| import { routing } from '@/i18n/routing'; | ||||||||||||||||
| import { PROJECT_SLUGS } from '@/shared/constants/project-slugs'; | ||||||||||||||||
|
|
||||||||||||||||
|
|
@@ -36,6 +40,8 @@ export default async function ProjectDetailPage({ params }: ProjectDetailPagePro | |||||||||||||||
| } | ||||||||||||||||
|
|
||||||||||||||||
| const project = new Project(projectData); | ||||||||||||||||
| const details = t.raw('details') as Record<string, ProjectDetailContent> | undefined; | ||||||||||||||||
| const detail = getProjectDetail(details, slug); | ||||||||||||||||
|
|
||||||||||||||||
| return ( | ||||||||||||||||
| <section className="min-h-screen bg-background py-20 px-6"> | ||||||||||||||||
|
|
@@ -49,32 +55,72 @@ export default async function ProjectDetailPage({ params }: ProjectDetailPagePro | |||||||||||||||
|
|
||||||||||||||||
| <header className="space-y-4"> | ||||||||||||||||
| <p className="text-sm uppercase tracking-[0.3em] text-accent/80"> | ||||||||||||||||
| Detalle en preparación | ||||||||||||||||
| {detail ? project.categoryId.replace(/-/g, ' ') : 'Detalle en preparación'} | ||||||||||||||||
| </p> | ||||||||||||||||
|
Comment on lines
57
to
59
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Se está utilizando una cadena de texto en español directamente en el código (
Suggested change
|
||||||||||||||||
| <h1 className="text-4xl font-bold text-foreground">{project.title}</h1> | ||||||||||||||||
| <p className="text-lg text-foreground-secondary">{project.description}</p> | ||||||||||||||||
| </header> | ||||||||||||||||
|
|
||||||||||||||||
| <article className="space-y-6 rounded-xl border border-border bg-background-secondary/40 p-6 shadow-sm"> | ||||||||||||||||
| <p className="text-sm text-foreground-secondary"> | ||||||||||||||||
| Estamos preparando una ficha completa con arquitectura, capturas y métricas clave de | ||||||||||||||||
| este proyecto. Mientras tanto, puedes solicitar una demo privada o más información | ||||||||||||||||
| directa. | ||||||||||||||||
| </p> | ||||||||||||||||
| <div className="flex flex-wrap gap-3 text-sm text-foreground-secondary/90"> | ||||||||||||||||
| <span className="rounded-full border border-border bg-background px-3 py-1 font-mono text-xs uppercase tracking-wide"> | ||||||||||||||||
| {project.categoryId.replace(/-/g, ' ')} | ||||||||||||||||
| </span> | ||||||||||||||||
| {project.tech.map((tech) => ( | ||||||||||||||||
| <span | ||||||||||||||||
| key={tech} | ||||||||||||||||
| className="rounded-full border border-border px-3 py-1 text-xs font-mono text-foreground-secondary" | ||||||||||||||||
| > | ||||||||||||||||
| {tech} | ||||||||||||||||
| {detail ? ( | ||||||||||||||||
| <> | ||||||||||||||||
| {detail.metrics && detail.metrics.length > 0 && ( | ||||||||||||||||
| <div className="grid grid-cols-2 gap-4 sm:grid-cols-4"> | ||||||||||||||||
| {detail.metrics.map((metric) => ( | ||||||||||||||||
| <div | ||||||||||||||||
| key={metric.label} | ||||||||||||||||
| className="rounded-xl border border-border bg-background-secondary/40 p-4 text-center" | ||||||||||||||||
| > | ||||||||||||||||
| <p className="text-2xl font-bold text-foreground">{metric.value}</p> | ||||||||||||||||
| <p className="text-xs uppercase tracking-wide text-foreground-secondary"> | ||||||||||||||||
| {metric.label} | ||||||||||||||||
| </p> | ||||||||||||||||
| </div> | ||||||||||||||||
| ))} | ||||||||||||||||
| </div> | ||||||||||||||||
| )} | ||||||||||||||||
|
|
||||||||||||||||
| <article className="space-y-8"> | ||||||||||||||||
| {detail.sections.map((item) => ( | ||||||||||||||||
| <div key={item.heading} className="space-y-2"> | ||||||||||||||||
| <h2 className="text-2xl font-semibold text-foreground">{item.heading}</h2> | ||||||||||||||||
| <p className="leading-relaxed text-foreground-secondary">{item.body}</p> | ||||||||||||||||
| </div> | ||||||||||||||||
| ))} | ||||||||||||||||
| </article> | ||||||||||||||||
|
|
||||||||||||||||
| <div className="flex flex-wrap gap-3 text-sm text-foreground-secondary/90"> | ||||||||||||||||
| {project.tech.map((tech) => ( | ||||||||||||||||
| <span | ||||||||||||||||
| key={tech} | ||||||||||||||||
| className="rounded-full border border-border px-3 py-1 text-xs font-mono text-foreground-secondary" | ||||||||||||||||
| > | ||||||||||||||||
| {tech} | ||||||||||||||||
| </span> | ||||||||||||||||
| ))} | ||||||||||||||||
| </div> | ||||||||||||||||
| </> | ||||||||||||||||
| ) : ( | ||||||||||||||||
| <article className="space-y-6 rounded-xl border border-border bg-background-secondary/40 p-6 shadow-sm"> | ||||||||||||||||
| <p className="text-sm text-foreground-secondary"> | ||||||||||||||||
| Estamos preparando una ficha completa con arquitectura, capturas y métricas clave de | ||||||||||||||||
| este proyecto. Mientras tanto, puedes solicitar una demo privada o más información | ||||||||||||||||
| directa. | ||||||||||||||||
| </p> | ||||||||||||||||
| <div className="flex flex-wrap gap-3 text-sm text-foreground-secondary/90"> | ||||||||||||||||
| <span className="rounded-full border border-border bg-background px-3 py-1 font-mono text-xs uppercase tracking-wide"> | ||||||||||||||||
| {project.categoryId.replace(/-/g, ' ')} | ||||||||||||||||
| </span> | ||||||||||||||||
| ))} | ||||||||||||||||
| </div> | ||||||||||||||||
| </article> | ||||||||||||||||
| {project.tech.map((tech) => ( | ||||||||||||||||
| <span | ||||||||||||||||
| key={tech} | ||||||||||||||||
| className="rounded-full border border-border px-3 py-1 text-xs font-mono text-foreground-secondary" | ||||||||||||||||
| > | ||||||||||||||||
| {tech} | ||||||||||||||||
| </span> | ||||||||||||||||
| ))} | ||||||||||||||||
| </div> | ||||||||||||||||
| </article> | ||||||||||||||||
| )} | ||||||||||||||||
|
Comment on lines
+102
to
+123
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Al igual que en el encabezado, el texto descriptivo del estado de preparación está en español de forma estática, y la categoría se muestra sin traducir. Se recomienda extraer este texto a una clave de traducción (por ejemplo, |
||||||||||||||||
|
|
||||||||||||||||
| <div className="space-y-3 rounded-xl border border-accent/40 bg-accent/5 p-6 text-sm text-foreground-secondary"> | ||||||||||||||||
| <p className="flex items-center gap-2 font-medium text-accent"> | ||||||||||||||||
|
|
||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Para mejorar la internacionalización (i18n) y evitar mostrar identificadores técnicos o no traducidos (como
gestion-serviciosofacturacion-complianceformateados con espacios), es mejor recuperar el nombre traducido de la categoría desde el archivo de traducciones (categories).