diff --git a/public/img/campings-concept-cover.jpg b/public/img/campings-concept-cover.jpg new file mode 100644 index 0000000..186b938 Binary files /dev/null and b/public/img/campings-concept-cover.jpg differ diff --git a/src/Components/portfolio/PortfolioCard.tsx b/src/Components/portfolio/PortfolioCard.tsx index 7dab8ae..841ef68 100644 --- a/src/Components/portfolio/PortfolioCard.tsx +++ b/src/Components/portfolio/PortfolioCard.tsx @@ -10,6 +10,8 @@ interface PortfolioCardProps { desc: string; tags: string; expanded: boolean; + status?: string; + disclaimer?: string; children?: ReactNode; } @@ -19,11 +21,13 @@ export default function PortfolioCard({ desc, tags, expanded, + status, + disclaimer, children, }: PortfolioCardProps) { return (
+ {status && ( +

+ {status} +

+ )}

{title}

{desc}

+ {disclaimer && ( +

+ {disclaimer} +

+ )}

• {tags}

{Children.toArray(children).filter((child) => { diff --git a/src/data/portfolioCases.ts b/src/data/portfolioCases.ts index 24fcb87..0640269 100644 --- a/src/data/portfolioCases.ts +++ b/src/data/portfolioCases.ts @@ -9,7 +9,6 @@ export type ProjectKey = "lem_web" | "lem_portal" | "esteban" | "mutter" | "fede export type Project = { key: ProjectKey; href?: string; cover: string }; export const projects: Project[] = [ - { key: "campings_demo", href: "https://reservas-campings-nacionales.vercel.app", cover: "/img/parques-nacionales-logo.png" }, { key: "magenta", href: "https://magenta-paysandu-m5in.vercel.app", cover: "/img/magenta-cover.png" }, { key: "esteban", href: "https://estebanfirpo.com", cover: "/img/esteban.png" }, { key: "lem_web", href: "https://lem-box.com.uy", cover: "/img/lem-box-cover.png" }, @@ -17,6 +16,7 @@ export const projects: Project[] = [ { key: "mutter", href: "https://www.muttergames.com", cover: "/img/mutter-cover.png" }, { key: "federico", href: "https://www.federicoroma.com", cover: "/img/federico-cover.jpg" }, { key: "boating", href: "https://www.boatingadventuresmiami.com", cover: "/img/Fondo.jpg" }, + { key: "campings_demo", href: "https://github.com/devrodri-com/reservas-campings-nacionales", cover: "/img/campings-concept-cover.jpg" }, ]; export type Category = "all" | "ecom" | "personal" | "services"; @@ -28,7 +28,7 @@ export const projectMeta: Record = { }, campings_demo: { summaryEs: - "MVP funcional avanzado para gestionar reservas de campings y áreas recreativas. Incluye catálogo público, flujo de reserva, consulta por código, panel administrativo con roles y soporte de inventario híbrido: por capacidad o por unidades físicas.", + "Prototipo técnico con flujo público, consulta de reservas, panel administrativo con roles e inventario híbrido por capacidad o unidades físicas.", summaryEn: - "Advanced functional MVP to manage campground and recreational area bookings. It includes a public catalog, booking flow, code-based booking lookup, an admin panel with roles, and hybrid inventory support: by capacity or by physical units.", + "Technical prototype with a public flow, booking lookup, role-based admin panel and hybrid inventory by capacity or physical units.", stack: [ "Frontend: Next.js 16 + React 19 + TypeScript + App Router", "Backend/servicios: Firebase Auth + Cloud Firestore", @@ -477,16 +477,16 @@ export const caseDetails: Record = { "Separation between private booking data and a public availability projection.", ], resultsEs: [ - "Núcleo del producto resuelto en versión demostrable.", - "Operación administrativa principal ya modelada dentro del MVP.", - "Base técnica preparada para evolucionar a pagos reales, mapa interactivo y automatizaciones.", - "Caso apto para portfolio si se presenta explícitamente como MVP/demo.", + "Flujo público y panel administrativo disponibles en un prototipo navegable.", + "Disponibilidad, reservas e inventario híbrido modelados de extremo a extremo.", + "Pagos mantenidos de forma explícitamente simulada y no productiva.", + "Base técnica preparada para experimentación futura.", ], resultsEn: [ - "Core product flow solved in a demonstrable version.", - "Primary admin operations already modeled within the MVP.", - "Technical foundation prepared for real payments, interactive maps and automations.", - "Portfolio-ready only if presented explicitly as an MVP/demo.", + "Public flow and admin panel available in a navigable prototype.", + "Availability, bookings and hybrid inventory modeled end to end.", + "Payments kept explicitly simulated and non-production.", + "Technical foundation prepared for future experimentation.", ], }, }; diff --git a/src/pages/PortfolioPage.tsx b/src/pages/PortfolioPage.tsx index de0a170..e1f63bf 100644 --- a/src/pages/PortfolioPage.tsx +++ b/src/pages/PortfolioPage.tsx @@ -101,6 +101,8 @@ export default function PortfolioPage() { desc={P[p.key].desc} tags={(language === "es" ? projectMeta[p.key].tags : projectMeta[p.key].tagsEn).join(" · ")} expanded={expanded[p.key]} + status={p.key === "campings_demo" ? t.portfolio.campings_demo.status : undefined} + disclaimer={p.key === "campings_demo" ? t.portfolio.campings_demo.disclaimer : undefined} > {p.key === "lem_web" ? ( <> diff --git a/src/translations.ts b/src/translations.ts index f9dab53..d52732a 100644 --- a/src/translations.ts +++ b/src/translations.ts @@ -110,6 +110,8 @@ export type TranslationsStructure = { campings_demo: { title: string; desc: string; + status: string; + disclaimer: string; link: string; }; seo: { @@ -334,9 +336,11 @@ const translations: Record = { link: "Ver sitio", }, campings_demo: { - title: "Campings reservas (demo)", - desc: "MVP funcional avanzado para reservas de campings, con flujo público, panel administrativo e inventario híbrido por cupo o por unidades.", - link: "Ver caso", + title: "Plataforma de reservas de campings", + desc: "Prototipo full-stack presentado como propuesta para explorar la gestión de disponibilidad, reservas, pagos simulados y administración de campings. No fue encargado ni adoptado por la organización destinataria.", + status: "Prototipo conceptual", + disclaimer: "Proyecto conceptual e independiente. No es un sistema oficial ni está afiliado a Administración de Parques Nacionales.", + link: "Ver código", }, seo: { title: "Portfolio | Rodrigo Opalo", @@ -608,9 +612,11 @@ const translations: Record = { link: "Visit site", }, campings_demo: { - title: "Campings bookings (demo)", - desc: "Advanced functional MVP for campground bookings, with public flow, admin panel and hybrid inventory by capacity or physical units.", - link: "View case", + title: "Campground booking platform", + desc: "Full-stack prototype presented as a proposal to explore campground availability, bookings, simulated payments and administration. It was not commissioned or adopted by the intended organization.", + status: "Concept prototype", + disclaimer: "Independent concept project. It is not an official system and is not affiliated with Administración de Parques Nacionales.", + link: "View code", }, seo: { title: "Portfolio | Rodrigo Opalo", @@ -733,4 +739,4 @@ const translations: Record = { }, }; -export default translations; \ No newline at end of file +export default translations;