From e1ccf94b6cc5d8c18ee02793e18462271fe005b1 Mon Sep 17 00:00:00 2001 From: meistergpc Date: Fri, 7 Nov 2025 12:50:06 +0100 Subject: [PATCH 1/5] feat: implement service detail view and enhance services grid functionality --- .../_components/ClientTechyBackground.tsx | 11 + .../_components/ServiceDetailView.tsx | 23 ++ .../services/_components/ServicesGrid.tsx | 35 +++ .../_components/ServicesPageContent.tsx | 43 +++ .../_components/ServicesServiceCard.tsx | 123 ++++---- .../services/_components/ServicesTab.tsx | 26 +- .../app/(marketing)/services/page.tsx | 27 +- .../home/projects/_components/ProjectCard.tsx | 266 +++++++++--------- 8 files changed, 348 insertions(+), 206 deletions(-) create mode 100644 apps/codebility/app/(marketing)/services/_components/ClientTechyBackground.tsx create mode 100644 apps/codebility/app/(marketing)/services/_components/ServiceDetailView.tsx create mode 100644 apps/codebility/app/(marketing)/services/_components/ServicesGrid.tsx create mode 100644 apps/codebility/app/(marketing)/services/_components/ServicesPageContent.tsx diff --git a/apps/codebility/app/(marketing)/services/_components/ClientTechyBackground.tsx b/apps/codebility/app/(marketing)/services/_components/ClientTechyBackground.tsx new file mode 100644 index 000000000..93aed7a80 --- /dev/null +++ b/apps/codebility/app/(marketing)/services/_components/ClientTechyBackground.tsx @@ -0,0 +1,11 @@ +"use client"; + +import dynamic from "next/dynamic"; + +const TechyBackground = dynamic(() => import("./TechyBackground"), { + ssr: false, +}); + +export default function ClientTechyBackground() { + return ; +} diff --git a/apps/codebility/app/(marketing)/services/_components/ServiceDetailView.tsx b/apps/codebility/app/(marketing)/services/_components/ServiceDetailView.tsx new file mode 100644 index 000000000..45e58090d --- /dev/null +++ b/apps/codebility/app/(marketing)/services/_components/ServiceDetailView.tsx @@ -0,0 +1,23 @@ +"use client"; + +export const ServiceDetailView = ({ service, onBack }) => { + console.log("ServiceDetailView rendered with service:", service); + + return ( +
+ +

{service.name}

+

{service.description}

+ {/* Design here */} +
+

Full-page detail view for: {service.name}

+

Add your custom design here

+
+
+ ); +}; diff --git a/apps/codebility/app/(marketing)/services/_components/ServicesGrid.tsx b/apps/codebility/app/(marketing)/services/_components/ServicesGrid.tsx new file mode 100644 index 000000000..e7be5a0e7 --- /dev/null +++ b/apps/codebility/app/(marketing)/services/_components/ServicesGrid.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { useState } from "react"; + +import type { ServiceProject } from "./ServicesServiceCard"; +import { ServiceDetailView } from "./ServiceDetailView"; +import ServicesServiceCard from "./ServicesServiceCard"; + +export const ServicesGrid = ({ services }) => { + const [activeService, setActiveService] = useState( + null, + ); + + console.log("ServicesGrid - activeService:", activeService); + + if (activeService) { + return ( + setActiveService(null)} + /> + ); + } + return ( +
+ {services.map((service) => ( + setActiveService(s)} + /> + ))} +
+ ); +}; diff --git a/apps/codebility/app/(marketing)/services/_components/ServicesPageContent.tsx b/apps/codebility/app/(marketing)/services/_components/ServicesPageContent.tsx new file mode 100644 index 000000000..9b0f6149b --- /dev/null +++ b/apps/codebility/app/(marketing)/services/_components/ServicesPageContent.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { useState } from "react"; + +import type { ServiceProject } from "./ServicesServiceCard"; +import Calendly from "../../_components/MarketingCalendly"; +import Footer from "../../_components/MarketingFooter"; +import { ServiceDetailView } from "./ServiceDetailView"; +import Hero from "./ServicesHero"; +import ServicesTab from "./ServicesTab"; + +interface Props { + servicesData: any[]; +} + +export function ServicesPageContent({ servicesData }: Props) { + const [activeService, setActiveService] = useState( + null, + ); + + // If a service is selected, show only the detail view + if (activeService) { + return ( + setActiveService(null)} + /> + ); + } + + // Otherwise, show the normal services page + return ( + <> + + setActiveService(service)} + /> + +