tenext redesign

This commit is contained in:
2026-08-03 14:42:01 +05:30
parent 1e3f225bed
commit 6625bb9018
78 changed files with 2798 additions and 859 deletions

View File

@@ -1,30 +1,101 @@
import { Navbar } from "@/components/aiero/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { MarqueeStrip } from "@/components/aiero/MarqueeStrip";
import { Navbar } from "@/components/sections/Navbar";
import { ContactFormSection } from "@/components/shared/ContactFormSection";
import { AboutIntroSection } from "@/components/aiero/about/AboutIntroSection";
import { MissionSection } from "@/components/aiero/about/MissionSection";
import { PartnerLogosSection } from "@/components/shared/PartnerLogosSection";
import { TeamSection } from "@/components/aiero/about/TeamSection";
import { AboutHero } from "@/components/sections/about/AboutHero";
import { WhoWeAre } from "@/components/sections/about/WhoWeAre";
import { OurStory } from "@/components/sections/about/OurStory";
import { IconCardGrid } from "@/components/sections/about/IconCardGrid";
import { DeliveryModel } from "@/components/sections/about/DeliveryModel";
import { AboutPracticeTeams } from "@/components/sections/about/AboutPracticeTeams";
import { AboutIndustries } from "@/components/sections/about/AboutIndustries";
import { AboutCTA } from "@/components/sections/about/AboutCTA";
import {
pillars,
whyTenext,
capabilities,
techEcosystem,
trustPrinciples,
} from "@/data/about";
export const metadata = {
title: "About us - tenext",
title: "About Us",
description:
"Tenext Technologies helps enterprises turn digital transformation into predictable business outcomes across cloud, data, AI, and product engineering.",
};
export default function AboutPage() {
return (
<>
<Navbar />
<main className="min-h-screen bg-tenext-dark">
<PageTitleBanner
title="About us"
breadcrumbs={[{ label: "About us" }]}
<main className="bg-white">
{/* 1 — Hero */}
<AboutHero />
{/* 2 — Who we are */}
<WhoWeAre />
{/* 3 — Our story */}
<OurStory />
{/* 4 — Mission / Vision / Values */}
<IconCardGrid
eyebrow="what drives us"
title="Mission, vision, and the values behind our work"
items={pillars}
columns={3}
theme="dark"
/>
<AboutIntroSection />
<MarqueeStrip text="/ Neural Networks in shaping the future of technology." />
<MissionSection />
<PartnerLogosSection />
<TeamSection />
{/* 5 — Why Tenext */}
<IconCardGrid
eyebrow="why tenext"
title="What sets our engineering apart"
items={whyTenext}
columns={3}
theme="light"
/>
{/* 6 — Capabilities */}
<IconCardGrid
eyebrow="capabilities"
title="Engineering capabilities across the enterprise"
items={capabilities}
columns={3}
theme="surface"
/>
{/* 7 — Industries */}
<AboutIndustries />
{/* 8 — Delivery model */}
<DeliveryModel />
{/* 9 — Practice teams */}
<AboutPracticeTeams />
{/* 10 — Technology ecosystem */}
<IconCardGrid
eyebrow="technology ecosystem"
title="The technologies we build with"
description="We work across the modern enterprise stack — matched to your landscape, not to a single vendor."
items={techEcosystem}
columns={4}
theme="surface"
/>
{/* 11 — Enterprise trust */}
<IconCardGrid
eyebrow="enterprise trust"
title="Why enterprises rely on Tenext"
description="Not testimonials — the principles, standards, and culture that make delivery dependable."
items={trustPrinciples}
columns={4}
theme="dark"
/>
{/* 12 — Final CTA */}
<AboutCTA />
{/* 13 — Contact */}
<ContactFormSection />
</main>
</>

67
app/careers/page.tsx Normal file
View File

@@ -0,0 +1,67 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { openRoles } from "@/data/site-pages";
export const metadata = {
title: "Careers",
description:
"Build the digital backbone for enterprises. Explore open roles at Tenext Technologies in Coimbatore.",
};
export default function CareersPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Careers"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Careers" }]}
/>
<SectionContainer paddingY="lg" className="px-[20px]">
<PageContainer>
<SectionHeading
tag="[ join us ]"
title="Build the digital backbone for enterprises"
description="We are engineers, designers, and problem-solvers who care about outcomes. These are the disciplines we hire for — introduce yourself and we will be in touch when a role opens."
titleClassName="text-tenext-dark max-w-[720px]"
descriptionClassName="max-w-[620px]"
className="mb-[50px]"
/>
<div className="flex flex-col gap-[16px]">
{openRoles.map((role, index) => (
<RevealOnView key={role.id} delay={index * 70}>
<div className="flex flex-col gap-[20px] rounded-[25px] border border-tenext-card-border p-[30px_40px] transition-transform duration-300 hover:-translate-y-1 md:flex-row md:items-center md:justify-between">
<div>
<h3 className="font-[var(--font-sora)] text-[22px] font-bold leading-[1.3] text-tenext-dark">
{role.title}
</h3>
<p className="mt-[6px] text-[15px] text-tenext-text-muted">
{role.location} · {role.type}
</p>
</div>
<TenextButton
href="/contacts"
variant="gradient-border"
className="shrink-0 rounded-[25px] px-[30px] py-[14px] text-[15px] font-medium"
showArrow={true}
>
Get in touch
</TenextButton>
</div>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
<PreFooterCTA />
</main>
</>
);
}

59
app/case-studies/page.tsx Normal file
View File

@@ -0,0 +1,59 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { caseStudies } from "@/data/site-pages";
export const metadata = {
title: "Case Studies",
description:
"How Tenext helps enterprises transform — representative engagements across retail, financial services, and manufacturing.",
};
export default function CaseStudiesPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Case Studies"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Case Studies" }]}
/>
<SectionContainer paddingY="lg" className="px-[20px]">
<PageContainer>
<SectionHeading
tag="[ our work ]"
title="How we deliver across industries"
description="Named client case studies will be published here as they are approved. In the meantime, here is how Tenext approaches engagements in the industries it serves."
titleClassName="text-tenext-dark max-w-[720px]"
descriptionClassName="max-w-[620px]"
className="mb-[50px]"
/>
<div className="grid grid-cols-1 gap-[20px] md:grid-cols-2 lg:grid-cols-3">
{caseStudies.map((item, index) => (
<RevealOnView key={item.id} delay={index * 90}>
<article className="flex h-full flex-col gap-[15px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2">
<span className="tenext-subheading text-tenext-teal" style={{ fontFamily: "var(--font-sora)" }}>
{item.industry}
</span>
<h3 className="font-[var(--font-sora)] text-[22px] font-bold leading-[1.3] text-tenext-dark">
{item.title}
</h3>
<p className="text-[16px] leading-[1.7] text-tenext-text-muted">
{item.description}
</p>
</article>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
<PreFooterCTA />
</main>
</>
);
}

View File

@@ -1,10 +1,12 @@
import { Navbar } from "@/components/aiero/Navbar";
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { ContactFormSection } from "@/components/shared/ContactFormSection";
import { MapSection } from "@/components/aiero/contacts/MapSection";
import { MapSection } from "@/components/sections/contacts/MapSection";
export const metadata = {
title: "Contacts - tenext",
title: "Contact",
description:
"Talk to Tenext Technologies about cloud, data, AI, and product engineering for your enterprise.",
};
export default function ContactsPage() {
@@ -13,8 +15,8 @@ export default function ContactsPage() {
<Navbar />
<main className="min-h-screen bg-tenext-dark">
<PageTitleBanner
title="Contacts"
breadcrumbs={[{ label: "Contacts" }]}
title="Contact"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Contact" }]}
/>
<ContactFormSection />
<MapSection />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -478,8 +478,21 @@ button {
.navbar-reveal,
.hero-reveal,
.scroll-widget,
.dropdown-reveal,
.reveal-on-view {
opacity: 1;
transform: none;
}
/* Stop looping / decorative motion entirely */
.marquee-track,
.hero-bg-motion,
.scroll-widget .scroll-btn-decoration {
animation: none !important;
}
/* Neutralize hover-lift so pointer movement doesn't shift layout */
.tenext-card:hover {
transform: none;
}
}

29
app/icon.tsx Normal file
View File

@@ -0,0 +1,29 @@
import { ImageResponse } from "next/og";
// Generated Tenext favicon — replaces the framework's default icon.
export const size = { width: 32, height: 32 };
export const contentType = "image/png";
export default function Icon() {
return new ImageResponse(
(
<div
style={{
width: "100%",
height: "100%",
display: "flex",
alignItems: "center",
justifyContent: "center",
background: "#1F1F1F",
color: "#45D0BD",
fontSize: 22,
fontWeight: 700,
fontFamily: "sans-serif",
}}
>
T
</div>
),
{ ...size }
);
}

34
app/industries/page.tsx Normal file
View File

@@ -0,0 +1,34 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { MarqueeStrip } from "@/components/sections/MarqueeStrip";
import { AnchoredCardGrid } from "@/components/shared/AnchoredCardGrid";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { industries } from "@/data/site-pages";
export const metadata = {
title: "Industries",
description:
"Enterprise technology solutions for retail, financial services, healthcare, manufacturing, and education.",
};
export default function IndustriesPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Industries"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Industries" }]}
/>
<AnchoredCardGrid
tag="[ industries ]"
title="Depth across the industries you operate in"
description="We bring domain understanding and engineering rigor to the sectors where Tenext delivers transformation."
items={industries}
/>
<MarqueeStrip text="/ Building the digital backbone for enterprises across industries." />
<PreFooterCTA />
</main>
</>
);
}

View File

@@ -1,6 +1,7 @@
import type { Metadata } from "next";
import { Manrope, Sora, DM_Sans } from "next/font/google";
import { Footer } from "@/components/shared/Footer";
import { siteConfig } from "@/data/site-config";
import "./globals.css";
const manrope = Manrope({
@@ -21,10 +22,47 @@ const dmSans = DM_Sans({
weight: ["400", "500", "600", "700"],
});
const title =
"Tenext Technologies — Enterprise Digital Transformation, Cloud, Data & AI";
const description =
"Tenext Technologies helps enterprises transform with cloud, data, AI, and product engineering — delivering predictable outcomes, lower total cost of ownership, and accelerated time to value.";
export const metadata: Metadata = {
title: "Tenext Technologies — Enterprise Digital Transformation, Cloud, Data & AI",
description:
"Tenext Technologies helps enterprises transform with cloud, data, AI, and product engineering — delivering predictable outcomes, lower total cost of ownership, and accelerated time to value.",
metadataBase: new URL(siteConfig.url),
title: {
default: title,
template: "%s | Tenext Technologies",
},
description,
alternates: { canonical: "/" },
openGraph: {
type: "website",
siteName: siteConfig.legalName,
url: siteConfig.url,
title,
description,
},
twitter: {
card: "summary_large_image",
title,
description,
},
};
const organizationJsonLd = {
"@context": "https://schema.org",
"@type": "Organization",
name: siteConfig.legalName,
url: siteConfig.url,
email: siteConfig.email,
telephone: siteConfig.phoneRaw,
address: {
"@type": "PostalAddress",
streetAddress: siteConfig.address.line1,
addressLocality: "Coimbatore",
addressCountry: "IN",
},
sameAs: siteConfig.socials.map((s) => s.url),
};
export default function RootLayout({
@@ -38,6 +76,12 @@ export default function RootLayout({
className={`${manrope.variable} ${sora.variable} ${dmSans.variable}`}
>
<body suppressHydrationWarning>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(organizationJsonLd),
}}
/>
{children}
<Footer />
</body>

49
app/not-found.tsx Normal file
View File

@@ -0,0 +1,49 @@
import { Navbar } from "@/components/sections/Navbar";
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { PageContainer } from "@/components/shared/PageContainer";
export const metadata = {
title: "Page not found",
};
export default function NotFound() {
return (
<>
<Navbar />
<main className="bg-white">
<section className="flex min-h-[70vh] items-center px-[20px] py-[100px]">
<PageContainer className="flex flex-col items-center text-center">
<span className="gradient-text-purple font-[var(--font-manrope)] text-[clamp(90px,18vw,200px)] font-extrabold leading-none">
404
</span>
<h1 className="mt-[10px] max-w-[620px] font-[var(--font-sora)] text-[clamp(28px,4vw,48px)] font-bold leading-[1.15] text-tenext-dark">
We couldn&apos;t find that page
</h1>
<p className="mt-[20px] max-w-[520px] text-[16px] leading-[1.8] text-tenext-text-muted">
The page you&apos;re looking for may have moved or no longer
exists. Let&apos;s get you back on track.
</p>
<div className="mt-[40px] flex flex-wrap items-center justify-center gap-[16px]">
<TenextButton
href="/"
variant="gradient-fill"
className="rounded-[25px] px-[35px] py-[15px] text-[15px] font-semibold"
showArrow={false}
>
Back to home
</TenextButton>
<TenextButton
href="/contacts"
variant="gradient-border"
className="rounded-[25px] px-[35px] py-[15px] text-[15px] font-medium"
showArrow={true}
>
Contact us
</TenextButton>
</div>
</PageContainer>
</section>
</main>
</>
);
}

65
app/opengraph-image.tsx Normal file
View File

@@ -0,0 +1,65 @@
import { ImageResponse } from "next/og";
// Static social-share image for the site (1200×630).
// Next.js exposes this as og:image and twitter:image automatically.
export const alt = "Tenext Technologies — Enterprise Digital Transformation";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
export default function OpengraphImage() {
return new ImageResponse(
(
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
background: "#1F1F1F",
padding: "80px",
fontFamily: "sans-serif",
}}
>
<div style={{ display: "flex", alignItems: "center", gap: "16px" }}>
<div
style={{
width: "20px",
height: "20px",
borderRadius: "9999px",
background: "#45D0BD",
}}
/>
<div
style={{
color: "#FFFFFF",
fontSize: "34px",
fontWeight: 700,
letterSpacing: "-0.02em",
}}
>
Tenext Technologies
</div>
</div>
<div
style={{
color: "#FFFFFF",
fontSize: "68px",
fontWeight: 800,
lineHeight: 1.1,
letterSpacing: "-0.03em",
maxWidth: "900px",
}}
>
Engineering predictable outcomes from your digital investments
</div>
<div style={{ color: "#87899B", fontSize: "30px", fontWeight: 500 }}>
Cloud · Data · AI · Product Engineering · Digital Commerce
</div>
</div>
),
{ ...size }
);
}

View File

@@ -1,17 +1,17 @@
import { Navbar } from "@/components/aiero/Navbar";
import { HeroSection } from "@/components/aiero/HeroSection";
import { CardsGrid } from "@/components/aiero/CardsGrid";
import { PossibilitiesSection } from "@/components/aiero/PossibilitiesSection";
import { TinkerSection } from "@/components/aiero/TinkerSection";
import { MarqueeStrip } from "@/components/aiero/MarqueeStrip";
import { FeaturesSection } from "@/components/aiero/FeaturesSection";
import { WOWSection } from "@/components/aiero/WOWSection";
import { BenefitsGridSection } from "@/components/aiero/BenefitsGridSection";
import { MetricsSection } from "@/components/aiero/MetricsSection";
import { HowItWorksSection } from "@/components/aiero/HowItWorksSection";
import { TeamSection } from "@/components/aiero/about/TeamSection";
import { TestimonialsSection } from "@/components/aiero/services/TestimonialsSection";
import { BlogSection } from "@/components/aiero/BlogSection";
import { Navbar } from "@/components/sections/Navbar";
import { HeroSection } from "@/components/sections/HeroSection";
import { CardsGrid } from "@/components/sections/CardsGrid";
import { PossibilitiesSection } from "@/components/sections/PossibilitiesSection";
import { TinkerSection } from "@/components/sections/TinkerSection";
import { MarqueeStrip } from "@/components/sections/MarqueeStrip";
import { FeaturesSection } from "@/components/sections/FeaturesSection";
import { WOWSection } from "@/components/sections/WOWSection";
import { BenefitsGridSection } from "@/components/sections/BenefitsGridSection";
import { MetricsSection } from "@/components/sections/MetricsSection";
import { HowItWorksSection } from "@/components/sections/HowItWorksSection";
import { TeamSection } from "@/components/sections/about/TeamSection";
import { DeliveryPrinciplesSection } from "@/components/sections/services/DeliveryPrinciplesSection";
import { BlogSection } from "@/components/sections/BlogSection";
import { PartnerLogosSection } from "@/components/shared/PartnerLogosSection";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
@@ -19,7 +19,7 @@ export default function Home() {
return (
<main className="bg-white">
<div className="absolute left-5 right-5 top-0 z-50">
<Navbar />
<Navbar variant="overlay" />
</div>
<HeroSection />
<CardsGrid />
@@ -38,7 +38,7 @@ export default function Home() {
<MetricsSection />
<HowItWorksSection />
<TeamSection />
<TestimonialsSection />
<DeliveryPrinciplesSection />
<BlogSection />
<PartnerLogosSection />
<PreFooterCTA />

27
app/privacy/page.tsx Normal file
View File

@@ -0,0 +1,27 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { LegalContent } from "@/components/shared/LegalContent";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { privacyPolicy } from "@/data/legal";
export const metadata = {
title: "Privacy Policy",
description:
"How Tenext Technologies collects, uses, and protects information you share through this website.",
};
export default function PrivacyPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Privacy Policy"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Privacy Policy" }]}
/>
<LegalContent sections={privacyPolicy} />
<PreFooterCTA />
</main>
</>
);
}

59
app/resources/page.tsx Normal file
View File

@@ -0,0 +1,59 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { resources } from "@/data/site-pages";
export const metadata = {
title: "Resources",
description:
"Ideas for the digital enterprise — perspectives on cloud, data, AI, and modern engineering.",
};
export default function ResourcesPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Resources"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Resources" }]}
/>
<SectionContainer paddingY="lg" className="px-[20px]">
<PageContainer>
<SectionHeading
tag="[ insights ]"
title="The areas we help enterprises navigate"
description="Articles and guides will be published here. These are the domains Tenext advises on across cloud, data, AI, and product engineering."
titleClassName="text-tenext-dark max-w-[720px]"
descriptionClassName="max-w-[620px]"
className="mb-[50px]"
/>
<div className="grid grid-cols-1 gap-[20px] md:grid-cols-2 lg:grid-cols-3">
{resources.map((item, index) => (
<RevealOnView key={item.id} delay={index * 90}>
<article className="flex h-full flex-col gap-[15px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2">
<div className="text-[13px] font-semibold uppercase tracking-[0.1em] text-tenext-teal">
{item.category}
</div>
<h3 className="font-[var(--font-sora)] text-[22px] font-bold leading-[1.3] text-tenext-dark">
{item.title}
</h3>
<p className="text-[16px] leading-[1.7] text-tenext-text-muted">
{item.description}
</p>
</article>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
<PreFooterCTA />
</main>
</>
);
}

13
app/robots.ts Normal file
View File

@@ -0,0 +1,13 @@
import type { MetadataRoute } from "next";
import { siteConfig } from "@/data/site-config";
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: "*",
allow: "/",
},
sitemap: `${siteConfig.url}/sitemap.xml`,
host: siteConfig.url,
};
}

View File

@@ -1,16 +1,18 @@
import { Navbar } from "@/components/aiero/Navbar";
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { MarqueeStrip } from "@/components/aiero/MarqueeStrip";
import { MarqueeStrip } from "@/components/sections/MarqueeStrip";
import { ContactFormSection } from "@/components/shared/ContactFormSection";
import { PartnerLogosSection } from "@/components/shared/PartnerLogosSection";
import { ServiceCardsGrid } from "@/components/aiero/services/ServiceCardsGrid";
import { ServiceFeaturesSection } from "@/components/aiero/services/ServiceFeaturesSection";
import { TestimonialsSection } from "@/components/aiero/services/TestimonialsSection";
import { PricingSection } from "@/components/aiero/services/PricingSection";
import { ServiceCardsGrid } from "@/components/sections/services/ServiceCardsGrid";
import { ServiceFeaturesSection } from "@/components/sections/services/ServiceFeaturesSection";
import { DeliveryPrinciplesSection } from "@/components/sections/services/DeliveryPrinciplesSection";
import { EngagementModelsSection } from "@/components/sections/services/EngagementModelsSection";
export const metadata = {
title: "Services - tenext",
title: "Services",
description:
"Technology engineering, cloud, AI & data science, enterprise mobility, and digital commerce services for enterprises.",
};
export default function ServicesPage() {
@@ -19,14 +21,14 @@ export default function ServicesPage() {
<Navbar />
<main className="min-h-screen bg-tenext-dark">
<PageTitleBanner
title="Services Page"
breadcrumbs={[{ label: "Services Page" }]}
title="Services"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Services" }]}
/>
<ServiceCardsGrid />
<MarqueeStrip text="/ Neural Networks in shaping the future of technology." />
<MarqueeStrip text="/ Building the digital backbone for enterprises across industries." />
<ServiceFeaturesSection />
<TestimonialsSection />
<PricingSection />
<DeliveryPrinciplesSection />
<EngagementModelsSection />
<PartnerLogosSection />
<ContactFormSection />
</main>

25
app/sitemap.ts Normal file
View File

@@ -0,0 +1,25 @@
import type { MetadataRoute } from "next";
import { siteConfig } from "@/data/site-config";
/** Top-level routes, highest priority first. */
const routes = [
{ path: "/", priority: 1.0 },
{ path: "/about", priority: 0.8 },
{ path: "/services", priority: 0.9 },
{ path: "/solutions", priority: 0.9 },
{ path: "/industries", priority: 0.8 },
{ path: "/case-studies", priority: 0.7 },
{ path: "/resources", priority: 0.6 },
{ path: "/careers", priority: 0.6 },
{ path: "/contacts", priority: 0.7 },
{ path: "/privacy", priority: 0.3 },
{ path: "/terms", priority: 0.3 },
];
export default function sitemap(): MetadataRoute.Sitemap {
return routes.map(({ path, priority }) => ({
url: `${siteConfig.url}${path}`,
changeFrequency: "monthly",
priority,
}));
}

34
app/solutions/page.tsx Normal file
View File

@@ -0,0 +1,34 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { MarqueeStrip } from "@/components/sections/MarqueeStrip";
import { AnchoredCardGrid } from "@/components/shared/AnchoredCardGrid";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { solutions } from "@/data/site-pages";
export const metadata = {
title: "Solutions",
description:
"Digital transformation, product development, IoT, SMAC, DevOps, and blockchain solutions engineered for enterprise outcomes.",
};
export default function SolutionsPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Solutions"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Solutions" }]}
/>
<AnchoredCardGrid
tag="[ solutions ]"
title="Mapping capability to your business problems"
description="We pair engineering depth with a diagnostic approach, so every solution fits your existing systems and delivers measurable value."
items={solutions}
/>
<MarqueeStrip text="/ Building the digital backbone for enterprises across industries." />
<PreFooterCTA />
</main>
</>
);
}

27
app/terms/page.tsx Normal file
View File

@@ -0,0 +1,27 @@
import { Navbar } from "@/components/sections/Navbar";
import { PageTitleBanner } from "@/components/shared/PageTitleBanner";
import { LegalContent } from "@/components/shared/LegalContent";
import { PreFooterCTA } from "@/components/shared/PreFooterCTA";
import { termsOfUse } from "@/data/legal";
export const metadata = {
title: "Terms of Use",
description:
"The terms that govern your use of the Tenext Technologies website.",
};
export default function TermsPage() {
return (
<>
<Navbar />
<main className="bg-white">
<PageTitleBanner
title="Terms of Use"
breadcrumbs={[{ label: "Home", href: "/" }, { label: "Terms of Use" }]}
/>
<LegalContent sections={termsOfUse} />
<PreFooterCTA />
</main>
</>
);
}

View File

@@ -1,45 +0,0 @@
import { Counter } from "@/components/shared/Counter";
export function MetricsSection() {
return (
<section className="bg-white px-[20px] py-[60px] md:py-[100px]">
<div className="mx-auto max-w-[1260px]">
<div className="grid grid-cols-1 gap-[50px] md:grid-cols-2 md:gap-[80px]">
{/* Left Metric */}
<div className="flex flex-col gap-[20px]">
<Counter
target={250}
suffix="+"
numberClassName="text-[60px] md:text-[80px] font-bold leading-none text-transparent gradient-text-purple font-[var(--font-sora)]"
title=""
/>
<h3 className="text-[28px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)]">
Projects delivered
</h3>
<p className="text-[16px] leading-[1.8] text-tenext-text-muted mt-[10px]">
Across retail, financial services, healthcare, manufacturing, and
education.
</p>
</div>
{/* Right Metric */}
<div className="flex flex-col gap-[20px]">
<Counter
target={15}
suffix="+"
numberClassName="text-[60px] md:text-[80px] font-bold leading-none text-transparent gradient-text-purple font-[var(--font-sora)]"
title=""
/>
<h3 className="text-[28px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)]">
Years engineering digital products
</h3>
<p className="text-[16px] leading-[1.8] text-tenext-text-muted mt-[10px]">
Helping enterprises modernize and scale with measurable business
outcomes.
</p>
</div>
</div>
</div>
</section>
);
}

View File

@@ -1,54 +0,0 @@
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
export function AboutIntroSection() {
return (
<SectionContainer paddingY="lg">
<PageContainer className="grid grid-cols-1 gap-12 lg:grid-cols-[1fr_1fr] lg:gap-[60px] xl:gap-[100px]">
{/* Left: Text Content */}
<div className="flex flex-col items-start justify-center pt-5">
<span
className="tenext-subheading mb-4 text-tenext-teal"
style={{ fontFamily: "var(--font-sora)" }}
>
about
</span>
<h2
className="mb-6 tracking-[-0.03em] text-white"
style={{
fontFamily: "var(--font-dm-sans)",
fontSize: "clamp(32px, 4vw, 56px)",
fontWeight: 500,
lineHeight: 1.1,
}}
>
Awesome things in working with tenext WordPress theme
</h2>
<p className="mb-8 text-base leading-relaxed text-tenext-text-muted">
At XXLando, we are a leading AI services provider dedicated to
delivering innovative solutions that leverage artificial
intelligence to transform businesses.
</p>
<p className="text-base leading-relaxed text-tenext-text-muted">
Our team of experts specializes in developing cutting-edge AI
technologies, such as machine learning, natural language processing,
and computer vision, to help our clients streamline operations,
enhance decision-making.
</p>
</div>
{/* Right: Images */}
<div className="relative">
<div className="relative aspect-[4/5] w-full overflow-hidden rounded-[25px] bg-tenext-card-dark">
<div
className="absolute inset-0 bg-cover bg-center"
style={{
backgroundImage: "url(/images/tenext/home-9-img.png)",
}}
/>
</div>
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,67 +0,0 @@
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { Counter } from "@/components/shared/Counter";
export function MissionSection() {
return (
<SectionContainer paddingY="lg">
<PageContainer className="grid grid-cols-1 gap-12 lg:grid-cols-[1fr_1.2fr] lg:gap-[60px] xl:gap-[100px]">
{/* Left: Images */}
<div className="relative aspect-square w-full md:aspect-[4/3] lg:aspect-square">
<div className="absolute bottom-0 left-0 h-[85%] w-[85%] overflow-hidden rounded-[25px] bg-tenext-card-dark">
<div
className="absolute inset-0 bg-cover bg-center"
style={{
backgroundImage: "url(/images/tenext/home-9-img.png)",
}}
/>
</div>
<div className="absolute right-0 top-0 h-[50%] w-[50%] overflow-hidden rounded-[25px] border-[8px] border-tenext-dark bg-tenext-card-purple">
<div
className="absolute inset-0 bg-cover bg-center"
style={{
backgroundImage: "url(/images/tenext/home-9-img.png)",
}}
/>
</div>
</div>
{/* Right: Text and Stats */}
<div className="flex flex-col items-start justify-center pt-5">
<span
className="tenext-subheading mb-4 text-tenext-teal"
style={{ fontFamily: "var(--font-sora)" }}
>
Mission
</span>
<h2
className="mb-6 tracking-[-0.03em] text-white"
style={{
fontFamily: "var(--font-dm-sans)",
fontSize: "clamp(32px, 4vw, 56px)",
fontWeight: 500,
lineHeight: 1.1,
}}
>
we create a professional product using artificial intelligence
</h2>
<p className="mb-10 text-base leading-relaxed text-tenext-text-muted">
Certainly, crafting a clear and inspiring mission statement is
essential for a development company. It should reflect your
company&apos;s values, purpose, and commitment to innovation.
</p>
<div className="w-full rounded-[25px] border border-tenext-card-border bg-tenext-card-dark p-8 md:p-10">
<Counter
target={1250}
suffix="+"
numberClassName="text-[60px] md:text-[80px] font-bold leading-none font-[var(--font-manrope)] gradient-text-purple"
title="Created projects"
titleClassName="font-[var(--font-sora)] text-[11px] font-semibold tracking-[0.18em] uppercase text-tenext-text-muted mt-2"
/>
</div>
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,132 +0,0 @@
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
export function PricingSection() {
const plans = [
{
name: "Basic",
target: "Great for private individuals",
features: [
"1 User",
"Unlimited Projects",
"Download prototypes",
"1 Gb workspace",
],
price: "Free",
isPopular: false,
},
{
name: "Premium",
target: "14 days free period",
features: [
"15 Users",
"Unlimited Projects",
"Download prototypes",
"15 Gb workspace",
],
price: "$ 59 /mo",
isPopular: true,
},
{
name: "Unlimited",
target: "Great for private individuals",
features: [
"100 Users",
"Unlimited Projects",
"Download prototypes",
"100 Gb workspace",
],
price: "$ 199 /mo",
isPopular: false,
},
];
return (
<SectionContainer paddingY="lg">
<PageContainer>
<div className="mb-16 flex flex-col items-center justify-center text-center">
<SectionHeading
tag="pricing"
title="Choose the plan that fits your needs"
titleClassName="text-white max-w-[500px] text-center"
/>
</div>
<div className="grid grid-cols-1 gap-6 md:grid-cols-3">
{plans.map((plan, i) => (
<div
key={i}
className={`relative flex flex-col overflow-hidden rounded-[25px] border ${
plan.isPopular
? "border-tenext-teal bg-tenext-card-dark"
: "border-tenext-card-border bg-tenext-dark"
} p-10`}
>
{plan.isPopular && (
<div
className="absolute right-6 top-6 rounded-full bg-tenext-teal px-4 py-1 text-[12px] font-bold uppercase text-tenext-dark"
style={{ fontFamily: "var(--font-sora)" }}
>
Popular
</div>
)}
<h3
className="mb-2 text-[24px] font-bold text-white"
style={{ fontFamily: "var(--font-dm-sans)" }}
>
{plan.name}
</h3>
<p className="mb-8 text-[14px] text-tenext-text-muted">
{plan.target}
</p>
<ul className="mb-10 flex flex-col gap-4">
{plan.features.map((feat, j) => (
<li key={j} className="flex items-center gap-3 text-white">
<svg
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
className="text-tenext-teal"
>
<path
d="M20 6L9 17l-5-5"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
{feat}
</li>
))}
</ul>
<div className="mt-auto">
<div
className="mb-6 text-[36px] font-bold text-white"
style={{ fontFamily: "var(--font-dm-sans)" }}
>
{plan.price}
</div>
<a
href="#"
className={`flex w-full items-center justify-center rounded-[12px] py-4 text-[16px] font-bold transition-all ${
plan.isPopular
? "bg-tenext-teal text-tenext-dark hover:bg-white"
: "border border-tenext-card-border text-white hover:border-tenext-teal hover:text-tenext-teal"
}`}
style={{ fontFamily: "var(--font-sora)" }}
>
Get started
</a>
</div>
</div>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,91 +0,0 @@
"use client";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
const testimonials = [
{
author: "Daniel Cross",
text: "Working with tenext has been a game-changer for our business. Their AI solutions automated our repetitive tasks and let us make data-driven decisions fast.",
},
{
author: "Marta Wolfe",
text: "The onboarding was smooth and the support team responded within a day for every request we had. Genuinely impressed with the attention to detail.",
},
{
author: "Rajiv Patel",
text: "tenext's dashboard gave us actionable insights we didn't have before. Setup was fast and the documentation made customization painless.",
},
{
author: "Daniel Cross",
text: "Working with tenext has been a game-changer for our business. Their AI solutions automated our repetitive tasks and let us make data-driven decisions fast.",
},
{
author: "Elena Novak",
text: "Excellent customer support from the whole team. All of our integration questions were resolved within a day.",
},
{
author: "Sam Okafor",
text: "A perfect solution in every respect. The team is especially strong on support — we recommend it without hesitation.",
},
{
author: "Priya Chandran",
text: "Fast, reliable support and an API that's genuinely easy to customize. Great work all around.",
},
{
author: "Marta Wolfe",
text: "The onboarding was smooth and the support team responded within a day for every request we had. Genuinely impressed with the attention to detail.",
},
{
author: "Tom Bennett",
text: "Great platform and even better support. The team always found a solution even when the request was out of scope.",
},
{
author: "Lucia Fernandez",
text: "High quality documentation and a codebase that's genuinely easy to extend. Our developers picked it up in a day.",
},
{
author: "Rajiv Patel",
text: "tenext's dashboard gave us actionable insights we didn't have before. Setup was fast and the documentation made customization painless.",
},
{
author: "Owen Marsh",
text: "We evaluated several AI vendors and tenext stood out for speed of support and clarity of their onboarding process.",
},
];
export function TestimonialsSection() {
return (
<SectionContainer paddingY="lg" className="bg-tenext-surface-muted">
<PageContainer>
<div className="mb-12 max-w-[650px]">
<SectionHeading
tag="testimonials"
title="User stories: hear what others love about our AI solutions"
titleClassName="text-tenext-dark"
/>
</div>
<div className="columns-1 gap-6 sm:columns-2 lg:columns-4">
{testimonials.map((t, i) => (
<div
key={i}
className="mb-6 break-inside-avoid rounded-[20px] bg-white p-8"
>
<h5
className="mb-4 text-[18px] font-bold text-tenext-dark"
style={{ fontFamily: "var(--font-dm-sans)" }}
>
{t.author}
</h5>
<p className="text-[15px] leading-[1.7] text-tenext-text-muted">
{t.text}
</p>
</div>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,4 +1,4 @@
import { CheckCircle2 } from "lucide-react";
import { RevealOnView } from "@/components/shared/RevealOnView";
export function BenefitsGridSection() {
return (
@@ -6,7 +6,7 @@ export function BenefitsGridSection() {
<div className="mx-auto max-w-[1260px]">
<div className="grid grid-cols-1 gap-[30px] md:grid-cols-3">
{/* Card 1 */}
<div className="flex flex-col gap-[20px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2">
<RevealOnView className="flex flex-col gap-[20px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2">
<h4 className="text-[22px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)]">
Predictable outcomes from your IT investments
</h4>
@@ -20,10 +20,10 @@ export function BenefitsGridSection() {
Accelerated time to value
</li>
</ul>
</div>
</RevealOnView>
{/* Card 2 */}
<div className="flex flex-col gap-[20px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2">
<RevealOnView delay={110} className="flex flex-col gap-[20px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2">
<h4 className="text-[22px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)]">
Built to fit your existing business processes
</h4>
@@ -31,16 +31,18 @@ export function BenefitsGridSection() {
Seamless integration with existing systems and platforms, on a
scalable and flexible architecture engineered for the long term.
</p>
</div>
</RevealOnView>
{/* Card 3 (OpenAI Logo) */}
<div className="flex items-center justify-center rounded-[25px] border border-tenext-card-border bg-[#F8F9FA] p-[40px] transition-transform duration-300 hover:-translate-y-2">
<img
src="/images/tenext/openai-logo-1.png"
alt="OpenAI Logo"
className="w-[180px] h-auto object-contain"
/>
</div>
{/* Card 3 */}
<RevealOnView delay={220} className="flex flex-col gap-[20px] rounded-[25px] border border-tenext-card-border bg-[#F8F9FA] p-[40px] transition-transform duration-300 hover:-translate-y-2">
<h4 className="text-[22px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)]">
Security and governance built in
</h4>
<p className="text-[16px] leading-[1.6] text-tenext-text-muted mt-[10px]">
Access control, data governance, and compliance-ready handling are
designed in from the first sprint not retrofitted later.
</p>
</RevealOnView>
</div>
</div>
</section>

View File

@@ -1,40 +1,32 @@
import Link from "next/link";
import Image from "next/image";
import { ArrowUpRight } from "lucide-react";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { resources } from "@/data/site-pages";
const blogPosts = [
{
title: "How to Build a Custom AI Model for Your Business",
image: "/images/tenext/portrait-confident-man.jpg",
category: "AI Technology",
date: "March 15, 2025",
link: "/blog/custom-ai-model",
},
{
title: "The Future of Machine Learning in Enterprise",
image: "/images/tenext/Group-18301.jpg",
category: "Machine Learning",
date: "April 2, 2025",
link: "/blog/machine-learning-enterprise",
},
{
title: "Ethics in AI: What You Need to Know",
image:
/** Cover images, paired to the insights in data/site-pages.ts by order. */
const coverImages = [
"/images/tenext/portrait-confident-man.jpg",
"/images/tenext/Group-18301.jpg",
"/images/tenext/3d-woman-shape-glowing-with-bright-holographic-colors-1-min.png",
category: "AI Ethics",
date: "April 10, 2025",
link: "/blog/ethics-in-ai",
},
];
const blogPosts = resources.map((resource, i) => ({
title: resource.title,
description: resource.description,
image: coverImages[i % coverImages.length],
category: resource.category,
link: `/resources#${resource.id}`,
}));
export function BlogSection() {
return (
<section className="bg-[#F8F9FA] px-[20px] py-[80px] md:py-[120px]">
<div className="mx-auto max-w-[1260px]">
<div className="mb-[60px] flex flex-col items-center text-center">
<SectionHeading
tag="blog"
title="Exploring the world of artificial intelligence with tenext blogging"
tag="insights"
title="Perspectives on cloud, data, AI, and product engineering"
titleClassName="max-w-[800px] text-tenext-dark"
/>
</div>
@@ -46,28 +38,30 @@ export function BlogSection() {
className="group flex flex-col overflow-hidden rounded-[25px] border border-tenext-card-border bg-white transition-shadow duration-300 hover:shadow-xl"
>
<div className="relative h-[250px] w-full overflow-hidden">
<img
<Image
src={post.image}
alt={post.title}
className="h-full w-full object-cover transition-transform duration-500 group-hover:scale-110"
fill
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
className="object-cover transition-transform duration-500 group-hover:scale-110"
/>
<div className="absolute left-[20px] top-[20px] rounded-full bg-white px-[15px] py-[5px] text-[12px] font-bold tracking-wide text-tenext-dark uppercase font-[var(--font-sora)]">
{post.category}
</div>
</div>
<div className="flex flex-col p-[30px]">
<div className="mb-[15px] text-[14px] text-tenext-text-muted">
{post.date}
</div>
<h4 className="mb-[20px] text-[22px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)] transition-colors group-hover:text-tenext-accent-teal">
<h4 className="mb-[12px] text-[22px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)] transition-colors group-hover:text-tenext-accent-teal">
<Link href={post.link}>{post.title}</Link>
</h4>
<p className="mb-[20px] text-[15px] leading-[1.6] text-tenext-text-muted">
{post.description}
</p>
<div className="mt-auto">
<Link
href={post.link}
className="inline-flex items-center gap-[10px] text-[15px] font-bold text-tenext-dark font-[var(--font-sora)] hover:text-tenext-accent-teal"
>
Read more
Learn more
<ArrowUpRight className="h-[18px] w-[18px]" />
</Link>
</div>

View File

@@ -1,35 +1,8 @@
import Image from "next/image";
import { CardHeading, IconButton } from "@/components/shared/CardShared";
import { ChartIcon } from "@/components/shared/icons/ChartIcon";
import { Counter } from "@/components/shared/Counter";
import { RevealOnView } from "@/components/shared/RevealOnView";
const socialIcons = [
{
src: "/images/tenext/messenger-logo-1.png",
alt: "Messenger",
width: 57,
height: 59,
},
{
src: "/images/tenext/skype-logo.png",
alt: "Skype",
width: 56,
height: 57,
},
{
src: "/images/tenext/telegram-symbol-1.png",
alt: "Telegram",
width: 59,
height: 58,
},
{
src: "/images/tenext/discord-1.png",
alt: "Discord",
width: 54,
height: 54,
},
];
import { valueProps } from "@/data/site-content";
export function CardsGrid() {
return (
@@ -62,18 +35,10 @@ export function CardsGrid() {
wrapperClassName="mb-0"
/>
<div className="mt-[36px] flex items-center gap-[20px]">
{socialIcons.map((icon) => (
<Image
key={icon.alt}
src={icon.src}
alt={icon.alt}
width={icon.width}
height={icon.height}
className="h-auto w-auto"
/>
))}
</div>
<p className="mt-[24px] max-w-[420px] text-[16px] leading-[1.7] text-white/80">
Architecture, development, and modernization of enterprise
applications engineered to scale with your business.
</p>
</div>
<IconButton />
@@ -113,29 +78,13 @@ export function CardsGrid() {
<div className="flex h-full flex-col gap-[20px]">
{/* Card 3 - Top half */}
<div className="tenext-card relative flex min-h-[176px] flex-col justify-center overflow-hidden rounded-[25px] bg-tenext-card-lavender p-[40px] lg:p-[45px_50px]">
<a
href="#"
className="absolute inset-0 z-20"
aria-label="Digital transactions processed daily"
/>
<div className="relative z-10 flex flex-col items-start">
<div>
<Counter
target={500}
suffix="K+"
numberClassName="font-[var(--font-manrope)] text-[82px] font-extrabold leading-none tracking-[-0.04em] text-transparent"
style={{
WebkitTextStroke: "1px rgba(255,255,255,0.16)",
backgroundImage:
"linear-gradient(180deg, rgba(255,255,255,0.44) 0%, rgba(255,255,255,0.06) 90%)",
}}
/>
</div>
<div className="mt-[4px]">
<h4 className="font-[var(--font-manrope)] text-[16px] font-medium leading-[20px] text-white">
Digital transactions processed daily
<h4 className="font-[var(--font-sora)] text-[24px] font-bold leading-[1.25] text-white">
{valueProps.reliability.title}
</h4>
</div>
<p className="mt-[10px] text-[15px] leading-[1.6] text-white/85">
{valueProps.reliability.description}
</p>
</div>
</div>
@@ -152,13 +101,10 @@ export function CardsGrid() {
</div>
<div className="relative z-10">
<Image
src="/images/tenext/openai-logo-1.png"
alt="OpenAI"
width={272}
height={71}
className="h-auto w-[138px] lg:w-[152px]"
/>
<p className="max-w-[360px] text-[16px] leading-[1.7] text-white/80">
Data platforms and applied AI that turn enterprise data into
decision-ready insight.
</p>
</div>
</div>
</div>

View File

@@ -1,5 +1,4 @@
import { CardHeading, IconButton } from "@/components/shared/CardShared";
import { Counter } from "@/components/shared/Counter";
export function FeaturesSection() {
return (
@@ -106,21 +105,23 @@ export function FeaturesSection() {
/>
</div>
<div className="flex flex-col gap-[40px] sm:flex-row sm:gap-[60px] lg:pl-[15%]">
<Counter
target={98}
suffix="%"
numberClassName="text-[60px] font-bold leading-none font-[var(--font-manrope)] text-white"
title="Client retention"
titleClassName="font-[var(--font-sora)] text-[11px] font-semibold tracking-[0.18em] uppercase text-tenext-text-muted mt-2"
/>
<Counter
target={24}
suffix="/7"
numberClassName="text-[60px] font-bold leading-none font-[var(--font-manrope)] text-white"
title="Customer support"
titleClassName="font-[var(--font-sora)] text-[11px] font-semibold tracking-[0.18em] uppercase text-tenext-text-muted mt-2"
/>
<div className="flex flex-col gap-[30px] lg:pl-[15%]">
<div>
<h4 className="text-[20px] font-bold text-white font-[var(--font-sora)]">
Engineering ownership
</h4>
<p className="mt-[8px] text-[15px] leading-[1.7] text-tenext-text-muted">
The team that designs a system builds and supports it.
</p>
</div>
<div>
<h4 className="text-[20px] font-bold text-white font-[var(--font-sora)]">
Support beyond go-live
</h4>
<p className="mt-[8px] text-[15px] leading-[1.7] text-tenext-text-muted">
Monitoring, optimization, and managed support after launch.
</p>
</div>
</div>
</div>
</div>

View File

@@ -1,4 +1,4 @@
import { HeroImageScene } from "@/components/aiero/HeroImageScene";
import { HeroImageScene } from "@/components/sections/HeroImageScene";
import { ScrollDown } from "@/components/shared/ScrollDown";
export function HeroSection() {

View File

@@ -1,4 +1,5 @@
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { ArrowLeft, ArrowRight } from "lucide-react";
export function HowItWorksSection() {
@@ -50,7 +51,7 @@ export function HowItWorksSection() {
<div className="flex flex-col">
{steps.map((step, index) => (
<div key={index} className="flex flex-col">
<RevealOnView key={index} delay={index * 80} className="flex flex-col">
<div className="flex flex-wrap items-center gap-[15px] rounded-[15px] bg-gradient-to-r from-tenext-blue to-tenext-purple-start px-[25px] py-[14px] text-white">
<span className="text-[14px] font-bold">{step.number}</span>
<span className="text-[18px] font-bold font-[var(--font-sora)]">
@@ -60,7 +61,7 @@ export function HowItWorksSection() {
<p className="mt-[20px] mb-[25px] max-w-[720px] text-[16px] leading-[1.6] text-tenext-text-muted">
{step.description}
</p>
</div>
</RevealOnView>
))}
</div>
</div>

View File

@@ -0,0 +1,34 @@
import { RevealOnView } from "@/components/shared/RevealOnView";
import { differentiators } from "@/data/site-content";
export function MetricsSection() {
// Show the first four differentiators as a proof grid — real commitments
// in place of the template's unverified statistics.
const points = differentiators.slice(0, 4);
return (
<section className="bg-white px-[20px] py-[60px] md:py-[100px]">
<div className="mx-auto max-w-[1260px]">
<div className="grid grid-cols-1 gap-[50px] sm:grid-cols-2 md:gap-[60px]">
{points.map((point, index) => (
<RevealOnView
key={point.id}
delay={index * 90}
className="flex flex-col gap-[14px]"
>
<span className="gradient-text-purple text-[22px] font-bold font-[var(--font-sora)]">
0{index + 1}
</span>
<h3 className="text-[24px] font-bold leading-[1.3] text-tenext-dark font-[var(--font-sora)]">
{point.title}
</h3>
<p className="text-[16px] leading-[1.8] text-tenext-text-muted">
{point.description}
</p>
</RevealOnView>
))}
</div>
</div>
</section>
);
}

View File

@@ -1,11 +1,20 @@
"use client";
import { useEffect, useState } from "react";
import Image from "next/image";
import { navigationData } from "@/data/navigation";
import { SearchIcon } from "@/components/shared/icons/SearchIcon";
import { SiteLogo } from "@/components/shared/SiteLogo";
export function Navbar() {
interface NavbarProps {
/**
* "overlay" transparent, sits over a dark hero (home page).
* "solid" dark background, for inner pages that open on a light
* surface so the white logo and links stay legible.
*/
variant?: "overlay" | "solid";
}
export function Navbar({ variant = "solid" }: NavbarProps) {
const [isSticky, setIsSticky] = useState(false);
const [openDropdown, setOpenDropdown] = useState<string | null>(null);
@@ -17,15 +26,17 @@ export function Navbar() {
return () => window.removeEventListener("scroll", onScroll);
}, []);
const idleBg = variant === "overlay" ? "bg-transparent" : "bg-tenext-dark";
return (
<header
className={`tenext-navbar z-30 mx-auto grid h-[100px] max-w-[2520px] grid-cols-[280px_1fr_360px] items-center px-[34px] transition-[background-color,border-radius,box-shadow,transform] duration-500 ${
className={`tenext-navbar z-30 mx-auto grid h-[100px] max-w-[2520px] grid-cols-[auto_1fr_auto] items-center px-[34px] transition-[background-color,border-radius,box-shadow,transform] duration-500 ${
isSticky
? "fixed left-5 right-5 top-0 rounded-b-[25px] bg-[#111111] shadow-[0_12px_35px_rgba(0,0,0,0.18)]"
: "relative bg-transparent"
: `relative ${idleBg}`
}`}
>
<div className="flex items-center gap-[64px]">
<div className="flex items-center gap-[24px] xl:gap-[64px]">
<button
className="navbar-reveal grid h-6 w-6 grid-cols-2 gap-[5px] text-white transition-colors hover:text-tenext-teal"
aria-label="Open menu"
@@ -41,21 +52,15 @@ export function Navbar() {
href="/"
className="navbar-reveal flex items-center"
style={{ animationDelay: "120ms" }}
aria-label="Tenext Technologies — Home"
>
<Image
src="/images/tenext/logo-dark.png"
alt="tenext"
width={109.5}
height={19.5}
className="h-auto w-auto"
priority
/>
<SiteLogo size={24} />
</a>
</div>
{/* Navigation */}
<nav
className="hidden items-center justify-center gap-[11px] lg:flex"
className="hidden items-center justify-center gap-[4px] lg:flex xl:gap-[11px]"
aria-label="Primary navigation"
>
{navigationData.map((item, index) => (
@@ -68,7 +73,7 @@ export function Navbar() {
>
<a
href={item.href}
className={`nav-link-swap flex h-10 items-center rounded-[10px] px-[21px] text-[13px] font-bold uppercase leading-none text-white transition-colors hover:bg-tenext-dark ${
className={`nav-link-swap flex h-10 items-center whitespace-nowrap rounded-[10px] px-[12px] text-[13px] font-bold uppercase leading-none text-white transition-colors hover:bg-tenext-dark xl:px-[21px] ${
item.label === "Home" ? "bg-tenext-dark" : ""
}`}
style={{ fontFamily: "var(--font-sora)" }}

View File

@@ -1,6 +1,6 @@
import { tenextButton as TenextButton } from "@/components/shared/AieroButton";
import { Counter } from "@/components/shared/Counter";
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { IconBox } from "@/components/shared/IconBox";
import { valueProps } from "@/data/site-content";
import {
OrbitIcon,
FanIcon,
@@ -48,23 +48,13 @@ export function PossibilitiesSection() {
Explore more
</TenextButton>
<div className="mt-[80px]">
<Counter
target={270}
suffix="k"
numberClassName="text-[60px] md:text-[100px] font-extrabold leading-none font-[var(--font-manrope)] text-transparent"
style={{
WebkitTextStroke: "1px #E2D7F8",
backgroundImage:
"linear-gradient(180deg, rgba(226, 215, 248, 0.44) 0%, rgba(226, 215, 248, 0.06) 90%)",
backgroundClip: "text",
WebkitBackgroundClip: "text",
}}
title="Engineering hours delivered for clients"
titleClassName="font-[var(--font-manrope)] text-[16px] font-bold leading-[1.4] text-tenext-dark max-w-[160px]"
layout="row-reverse"
gap="30px"
/>
<div className="mt-[80px] max-w-[420px] border-t border-tenext-card-border pt-[30px]">
<h3 className="text-[20px] font-bold text-tenext-dark font-[var(--font-sora)]">
{valueProps.engineering.title}
</h3>
<p className="mt-[10px] text-[16px] leading-[1.7] text-tenext-text-muted">
{valueProps.engineering.description}
</p>
</div>
</div>

View File

@@ -51,36 +51,19 @@ export function TinkerSection() {
</h2>
</div>
{/* Partners row */}
<div className="flex flex-wrap items-center justify-start gap-x-[40px] gap-y-[30px]">
<Image
src="/images/tenext/partners-1.png"
alt="Partner 1"
width={140}
height={40}
className="h-auto w-[140px] object-contain"
/>
<Image
src="/images/tenext/partners-2.png"
alt="Partner 2"
width={130}
height={40}
className="h-auto w-[130px] object-contain"
/>
<Image
src="/images/tenext/partners-3.png"
alt="Partner 3"
width={100}
height={40}
className="h-auto w-[100px] object-contain"
/>
<Image
src="/images/tenext/partners-4.png"
alt="Partner 4"
width={140}
height={40}
className="h-auto w-[140px] object-contain"
/>
{/* Capability tags */}
<div className="flex flex-wrap items-center justify-start gap-[12px]">
{["Cloud", "Data & AI", "IoT", "SMAC", "DevOps", "Blockchain"].map(
(tag) => (
<span
key={tag}
className="rounded-full border border-tenext-card-border px-[22px] py-[10px] text-[15px] font-medium text-tenext-dark"
style={{ fontFamily: "var(--font-sora)" }}
>
{tag}
</span>
)
)}
</div>
</div>
</div>

View File

@@ -1,4 +1,5 @@
import Link from "next/link";
import Image from "next/image";
import { ArrowIcon } from "@/components/shared/icons/ArrowIcon";
import { PageContainer } from "@/components/shared/PageContainer";
@@ -29,7 +30,7 @@ export function WOWSection() {
</h2>
</div>
<img
<Image
src="/images/tenext/home-9-img.png"
alt="Tenext"
width={632}

View File

@@ -0,0 +1,52 @@
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { PageContainer } from "@/components/shared/PageContainer";
import { aboutCta } from "@/data/about";
/** AboutCTA — large enterprise call to action on a premium gradient panel. */
export function AboutCTA() {
return (
<section className="px-5 py-[60px] md:py-[80px]">
<div className="relative overflow-hidden rounded-[25px] bg-tenext-dark px-[7vw] py-[80px] text-center md:py-[100px]">
<div className="pointer-events-none absolute inset-0">
<div className="absolute left-1/2 top-[-40%] h-[600px] w-[600px] -translate-x-1/2 rounded-full bg-[radial-gradient(circle,rgba(103,102,200,0.35),transparent_60%)]" />
<div className="absolute bottom-[-50%] left-[15%] h-[420px] w-[420px] rounded-full bg-[radial-gradient(circle,rgba(69,208,189,0.16),transparent_60%)]" />
</div>
<PageContainer className="relative z-10 flex flex-col items-center">
<h2
className="max-w-[760px] tracking-[-0.03em] text-white"
style={{
fontFamily: "var(--font-dm-sans)",
fontSize: "clamp(30px, 4vw, 56px)",
fontWeight: 600,
lineHeight: 1.1,
}}
>
{aboutCta.title}
</h2>
<p className="mt-[22px] max-w-[560px] text-[17px] leading-[1.75] text-white/80">
{aboutCta.paragraph}
</p>
<div className="mt-[40px] flex flex-wrap items-center justify-center gap-[16px]">
<TenextButton
href={aboutCta.primaryCta.href}
variant="gradient-fill"
className="rounded-[25px] px-[36px] py-[16px] text-[15px] font-semibold"
showArrow={false}
>
{aboutCta.primaryCta.label}
</TenextButton>
<TenextButton
href={aboutCta.secondaryCta.href}
variant="gradient-border"
className="rounded-[25px] px-[36px] py-[16px] text-[15px] font-medium text-white"
showArrow={true}
>
{aboutCta.secondaryCta.label}
</TenextButton>
</div>
</PageContainer>
</div>
</section>
);
}

View File

@@ -0,0 +1,96 @@
import Link from "next/link";
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { Icon } from "@/components/shared/Icon";
import { aboutHero } from "@/data/about";
const floatIcons = ["cloud", "cpu", "database", "code", "shield", "boxes"];
/**
* AboutHero — flagship enterprise hero.
* Left: breadcrumb, headline, supporting paragraph, primary + secondary CTA.
* Right: an asset-free glass-tile composition of capability icons (no photos).
*/
export function AboutHero() {
return (
<section className="px-5 pt-5">
<div className="relative overflow-hidden rounded-[25px] bg-tenext-dark px-[7vw] py-[80px] md:py-[110px]">
{/* Ambient gradient wash */}
<div className="pointer-events-none absolute inset-0 opacity-70">
<div className="absolute -right-[10%] -top-[30%] h-[600px] w-[600px] rounded-full bg-[radial-gradient(circle,rgba(130,88,200,0.35),transparent_60%)]" />
<div className="absolute -bottom-[40%] left-[10%] h-[500px] w-[500px] rounded-full bg-[radial-gradient(circle,rgba(69,208,189,0.18),transparent_60%)]" />
</div>
<div className="relative z-10 grid grid-cols-1 items-center gap-[50px] lg:grid-cols-[1.1fr_0.9fr]">
{/* Content */}
<div>
<nav aria-label="Breadcrumb" className="mb-[26px]">
<ol className="flex items-center gap-2 text-[13px] text-white/60">
<li>
<Link href="/" className="transition-colors hover:text-tenext-teal">
Home
</Link>
</li>
<li className="h-1 w-1 rounded-full bg-tenext-teal" />
<li className="text-white">About us</li>
</ol>
</nav>
<span className="tenext-subheading mb-[18px] text-tenext-teal" style={{ fontFamily: "var(--font-sora)" }}>
{aboutHero.eyebrow}
</span>
<h1
className="max-w-[640px] tracking-[-0.03em] text-white"
style={{
fontFamily: "var(--font-dm-sans)",
fontSize: "clamp(38px, 5vw, 72px)",
fontWeight: 600,
lineHeight: 1.06,
}}
>
{aboutHero.title}
</h1>
<p className="mt-[26px] max-w-[540px] text-[17px] leading-[1.75] text-white/80">
{aboutHero.paragraph}
</p>
<div className="mt-[40px] flex flex-wrap items-center gap-[16px]">
<TenextButton
href={aboutHero.primaryCta.href}
variant="gradient-fill"
className="rounded-[25px] px-[34px] py-[15px] text-[15px] font-semibold"
showArrow={false}
>
{aboutHero.primaryCta.label}
</TenextButton>
<TenextButton
href={aboutHero.secondaryCta.href}
variant="gradient-border"
className="rounded-[25px] px-[34px] py-[15px] text-[15px] font-medium text-white"
showArrow={true}
>
{aboutHero.secondaryCta.label}
</TenextButton>
</div>
</div>
{/* Icon composition */}
<div className="relative hidden lg:block" aria-hidden="true">
<div className="grid grid-cols-3 gap-[16px]">
{floatIcons.map((name, i) => (
<div
key={name}
className="flex aspect-square items-center justify-center rounded-[22px] border border-white/10 bg-white/[0.04] text-tenext-teal backdrop-blur-sm transition-transform duration-500 hover:-translate-y-1"
style={{ transform: `translateY(${i % 2 === 0 ? "-12px" : "12px"})` }}
>
<Icon name={name} className="h-[34px] w-[34px]" />
</div>
))}
</div>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,57 @@
import Link from "next/link";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { ArrowIcon } from "@/components/shared/icons/ArrowIcon";
import { Icon } from "@/components/shared/Icon";
import { industries } from "@/data/site-pages";
import { industryIcons } from "@/data/about";
/** AboutIndustries — premium industry cards (replaces the plain text list). */
export function AboutIndustries() {
return (
<SectionContainer paddingY="lg" className="bg-white px-[20px]">
<PageContainer>
<SectionHeading
tag="industries"
title="Depth across the industries you operate in"
description="We bring domain understanding and engineering rigor to the sectors where Tenext delivers transformation."
titleClassName="text-tenext-dark max-w-[720px]"
descriptionClassName="max-w-[620px]"
className="mb-[50px]"
/>
<div className="grid grid-cols-1 gap-[20px] sm:grid-cols-2 lg:grid-cols-3">
{industries.map((industry, index) => (
<RevealOnView key={industry.id} delay={index * 80}>
<Link
href={`/industries#${industry.id}`}
className="group relative flex h-full flex-col justify-between overflow-hidden rounded-[25px] border border-tenext-card-border bg-tenext-dark p-[35px] transition-all duration-300 hover:-translate-y-2 hover:shadow-[0_22px_55px_rgba(31,31,31,0.22)]"
>
<div className="pointer-events-none absolute -right-[20%] -top-[30%] h-[240px] w-[240px] rounded-full bg-[radial-gradient(circle,rgba(69,208,189,0.16),transparent_65%)] opacity-0 transition-opacity duration-500 group-hover:opacity-100" />
<span className="relative flex h-[60px] w-[60px] items-center justify-center rounded-[16px] bg-white/[0.06] text-tenext-teal">
<Icon name={industryIcons[industry.id] ?? "building"} className="h-[28px] w-[28px]" />
</span>
<div className="relative mt-[70px]">
<h3 className="font-[var(--font-dm-sans)] text-[22px] font-bold text-white">
{industry.title}
</h3>
<p className="mt-[12px] text-[15px] leading-[1.7] text-tenext-text-muted">
{industry.description}
</p>
</div>
<span className="relative mt-[24px] flex h-[42px] w-[42px] items-center justify-center rounded-full border border-white/15 text-white transition-colors duration-300 group-hover:bg-tenext-teal group-hover:text-tenext-dark">
<ArrowIcon className="h-[14px] w-[14px]" />
</span>
</Link>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -0,0 +1,66 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { Icon } from "@/components/shared/Icon";
import { practiceTeamCards } from "@/data/about";
/**
* AboutPracticeTeams — the disciplines that staff an engagement.
* Each card has a unique gradient header and icon (no repeated artwork,
* no invented individuals).
*/
export function AboutPracticeTeams() {
return (
<SectionContainer paddingY="lg" className="bg-white px-[20px]">
<PageContainer>
<div className="mb-[50px] flex flex-col gap-[24px] md:flex-row md:items-end md:justify-between">
<SectionHeading
tag="practice teams"
title="Specialist teams behind every engagement"
description="Engagements are staffed from practices that work together — so the people who design a system are the ones who build and support it."
titleClassName="text-tenext-dark max-w-[640px]"
descriptionClassName="max-w-[560px]"
/>
<TenextButton
href="/careers"
variant="simple"
className="shrink-0 text-[15px] font-semibold text-tenext-dark"
showArrow={true}
>
See open roles
</TenextButton>
</div>
<div className="grid grid-cols-1 gap-[20px] sm:grid-cols-2 lg:grid-cols-3">
{practiceTeamCards.map((team, index) => (
<RevealOnView key={team.name} delay={index * 80}>
<div className="group flex h-full flex-col overflow-hidden rounded-[25px] border border-tenext-card-border transition-all duration-300 hover:-translate-y-2 hover:shadow-[0_22px_55px_rgba(31,31,31,0.12)]">
{/* Unique gradient header */}
<div className={`relative h-[130px] bg-gradient-to-br ${team.gradient}`}>
<div className="absolute inset-0 opacity-30 [background-image:radial-gradient(rgba(255,255,255,0.5)_1px,transparent_1px)] [background-size:16px_16px]" />
<span className="absolute bottom-[-26px] left-[30px] flex h-[54px] w-[54px] items-center justify-center rounded-[16px] border border-white/20 bg-tenext-dark text-tenext-teal transition-transform duration-500 group-hover:-translate-y-1">
<Icon name={team.icon} className="h-[26px] w-[26px]" />
</span>
</div>
<div className="flex flex-1 flex-col p-[30px] pt-[40px]">
<h3 className="font-[var(--font-dm-sans)] text-[20px] font-bold text-tenext-dark">
{team.name}
</h3>
<p className="mt-[4px] text-[14px] font-semibold text-tenext-teal">
/ {team.focus} /
</p>
<p className="mt-[14px] text-[15px] leading-[1.7] text-tenext-text-muted">
{team.description}
</p>
</div>
</div>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -0,0 +1,48 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { Icon } from "@/components/shared/Icon";
import { deliverySteps } from "@/data/about";
/** DeliveryModel — connected timeline: Discover → … → Support. */
export function DeliveryModel() {
return (
<SectionContainer paddingY="lg" className="bg-tenext-dark px-[20px]">
<PageContainer>
<SectionHeading
tag="delivery model"
title="A transparent path from idea to lasting impact"
description="Every engagement moves through the same disciplined flow, so progress and cost stay visible at each step."
titleClassName="text-white max-w-[720px]"
descriptionClassName="max-w-[620px] text-tenext-text-muted"
className="mb-[60px]"
/>
<div className="relative grid grid-cols-1 gap-[20px] sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6">
{/* Connecting line (desktop) */}
<div className="pointer-events-none absolute left-0 right-0 top-[36px] hidden h-px bg-gradient-to-r from-tenext-teal/10 via-tenext-teal/40 to-tenext-teal/10 xl:block" />
{deliverySteps.map((step, index) => (
<RevealOnView key={step.title} delay={index * 90} className="relative">
<div className="flex flex-col items-start gap-[16px]">
<div className="relative z-10 flex h-[72px] w-[72px] items-center justify-center rounded-[20px] border border-white/10 bg-tenext-dark text-tenext-teal">
<Icon name={step.icon} className="h-[30px] w-[30px]" />
<span className="absolute -right-2 -top-2 flex h-[26px] w-[26px] items-center justify-center rounded-full bg-tenext-teal text-[12px] font-bold text-tenext-dark">
{index + 1}
</span>
</div>
<h3 className="font-[var(--font-sora)] text-[18px] font-bold text-white">
{step.title}
</h3>
<p className="text-[14px] leading-[1.65] text-tenext-text-muted">
{step.description}
</p>
</div>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -0,0 +1,85 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { Icon } from "@/components/shared/Icon";
import { IconCard } from "@/data/about";
interface IconCardGridProps {
id?: string;
eyebrow?: string;
title: string;
description?: string;
items: IconCard[];
columns?: 2 | 3 | 4;
theme?: "light" | "surface" | "dark";
}
const colClass: Record<number, string> = {
2: "sm:grid-cols-2",
3: "sm:grid-cols-2 lg:grid-cols-3",
4: "sm:grid-cols-2 lg:grid-cols-4",
};
/**
* IconCardGrid — reusable premium icon-card section for the About page.
* Powers Mission/Vision/Values, Why Tenext, Capabilities, Technology
* Ecosystem, and Enterprise Trust with a single, consistent card.
*/
export function IconCardGrid({
id,
eyebrow,
title,
description,
items,
columns = 3,
theme = "light",
}: IconCardGridProps) {
const isDark = theme === "dark";
const sectionBg =
theme === "dark"
? "bg-tenext-dark"
: theme === "surface"
? "bg-tenext-surface-muted"
: "bg-white";
const cardBase = isDark
? "border-white/10 bg-white/[0.03] hover:border-tenext-teal/40"
: "border-tenext-card-border bg-white hover:border-tenext-teal/50";
const titleColor = isDark ? "text-white" : "text-tenext-dark";
return (
<SectionContainer id={id} paddingY="lg" className={`${sectionBg} px-[20px] scroll-mt-[110px]`}>
<PageContainer>
<SectionHeading
tag={eyebrow}
title={title}
description={description}
titleClassName={`${titleColor} max-w-[760px]`}
descriptionClassName={`max-w-[640px] ${isDark ? "text-tenext-text-muted" : ""}`}
className="mb-[50px]"
/>
<div className={`grid grid-cols-1 gap-[20px] ${colClass[columns]}`}>
{items.map((item, index) => (
<RevealOnView key={item.title} delay={index * 80}>
<div
className={`group flex h-full flex-col gap-[16px] rounded-[25px] border p-[35px] transition-all duration-300 hover:-translate-y-2 hover:shadow-[0_22px_55px_rgba(31,31,31,0.12)] ${cardBase}`}
>
<span className="flex h-[54px] w-[54px] items-center justify-center rounded-[15px] bg-tenext-teal/10 text-tenext-teal transition-colors duration-300 group-hover:bg-tenext-teal group-hover:text-tenext-dark">
<Icon name={item.icon} className="h-[26px] w-[26px]" />
</span>
<h3 className={`font-[var(--font-sora)] text-[20px] font-bold leading-[1.3] ${titleColor}`}>
{item.title}
</h3>
<p className="text-[15px] leading-[1.7] text-tenext-text-muted">
{item.description}
</p>
</div>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -0,0 +1,60 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { Icon } from "@/components/shared/Icon";
import { ourStory } from "@/data/about";
const focusAreas = [
{ icon: "code", label: "Engineering" },
{ icon: "cloud", label: "Cloud" },
{ icon: "cpu", label: "AI" },
{ icon: "database", label: "Data" },
{ icon: "workflow", label: "Digital Transformation" },
{ icon: "chart", label: "Business Outcomes" },
];
/** OurStory — company narrative with a focus-area rail. */
export function OurStory() {
return (
<SectionContainer paddingY="lg" className="bg-tenext-surface-muted px-[20px]">
<PageContainer>
<div className="grid grid-cols-1 gap-[50px] lg:grid-cols-[0.85fr_1.15fr] lg:gap-[80px]">
<RevealOnView>
<SectionHeading
tag={ourStory.eyebrow}
title={ourStory.title}
titleClassName="text-tenext-dark"
/>
<div className="mt-[36px] grid grid-cols-2 gap-[14px]">
{focusAreas.map((area) => (
<div
key={area.label}
className="flex items-center gap-[12px] rounded-[15px] border border-tenext-card-border bg-white px-[18px] py-[14px]"
>
<span className="text-tenext-teal">
<Icon name={area.icon} className="h-[20px] w-[20px]" />
</span>
<span className="text-[14px] font-semibold text-tenext-dark font-[var(--font-sora)]">
{area.label}
</span>
</div>
))}
</div>
</RevealOnView>
<RevealOnView delay={120} className="flex flex-col gap-[24px]">
{ourStory.paragraphs.map((paragraph, i) => (
<p
key={i}
className={`leading-[1.85] text-tenext-text-muted ${i === 0 ? "text-[19px] text-tenext-dark" : "text-[16px]"}`}
>
{paragraph}
</p>
))}
</RevealOnView>
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -3,82 +3,46 @@
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { tenextButton as TenextButton } from "@/components/shared/AieroButton";
import { Counter } from "@/components/shared/Counter";
const teamMembers = [
{
name: "Alan Begham",
role: "CEO",
image: "/images/tenext/waist-up-shot-handsome-calm.jpg",
},
{
name: "Arthur Dowson",
role: "AI Programmer",
image: "/images/tenext/funny-curious-man-makes.jpg",
},
{
name: "Dan Smith",
role: "Manager",
image: "/images/tenext/portrait-confident-man.jpg",
},
{
name: "Brandon Adams",
role: "HR",
image: "/images/tenext/confident-ginger-man-with-trendy.jpg",
},
{
name: "Alan Begham",
role: "CEO Neuro",
image: "/images/tenext/waist-up-shot-handsome-calm.jpg",
},
];
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { practiceTeams } from "@/data/site-content";
export function TeamSection() {
return (
<SectionContainer paddingY="lg">
<SectionContainer id="teams" paddingY="lg" className="scroll-mt-[120px]">
<PageContainer>
<div className="columns-1 gap-6 sm:columns-2 lg:columns-4">
<div className="mb-6 flex break-inside-avoid flex-col">
<SectionHeading
tag="team"
title="The Neural Network experts: uniting talent for intelligent solutions"
tag="our teams"
title="Specialist teams behind every engagement"
titleClassName="text-tenext-dark"
/>
<div className="mt-[40px]">
<Counter
target={500}
prefix="+"
numberClassName="text-[60px] font-extrabold leading-none font-[var(--font-manrope)] text-transparent"
style={{
WebkitTextStroke: "1px #E2D7F8",
backgroundImage:
"linear-gradient(180deg, rgba(226, 215, 248, 0.44) 0%, rgba(226, 215, 248, 0.06) 90%)",
backgroundClip: "text",
WebkitBackgroundClip: "text",
}}
title="Awesome team members"
titleClassName="mt-[15px] text-[16px] font-bold text-tenext-dark"
/>
</div>
<p className="mt-[24px] text-[16px] leading-[1.8] text-tenext-text-muted">
Engagements are staffed from practices that work together
engineering, cloud, data, mobility, and commerce so the people
who design a system are the ones who build and support it.
</p>
<TenextButton
href="/careers"
variant="simple"
className="mt-[25px] text-[15px] font-medium text-tenext-dark"
showArrow={true}
>
Explore more
See open roles
</TenextButton>
</div>
{teamMembers.map((member, i) => (
{practiceTeams.map((team, i) => (
<div
key={i}
key={`${team.name}-${i}`}
className="group relative mb-6 break-inside-avoid overflow-hidden rounded-[25px] bg-tenext-card-dark"
>
<div className="relative aspect-[3/4] w-full">
<img
src={member.image}
alt={member.name}
src={team.image}
alt=""
loading="lazy"
decoding="async"
className="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
onError={(e) => {
(e.target as HTMLImageElement).src =
@@ -92,11 +56,9 @@ export function TeamSection() {
className="text-[20px] font-bold"
style={{ fontFamily: "var(--font-dm-sans)" }}
>
{member.name}
{team.name}
</h4>
<p className="text-[14px] text-tenext-teal">
/ {member.role} /
</p>
<p className="text-[14px] text-tenext-teal">/ {team.focus} /</p>
</div>
</div>
))}

View File

@@ -0,0 +1,58 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { Icon } from "@/components/shared/Icon";
import { whoWeAre } from "@/data/about";
/** WhoWeAre — balanced two-column: positioning statement + what/who/why. */
export function WhoWeAre() {
return (
<SectionContainer paddingY="lg" className="bg-white px-[20px]">
<PageContainer>
<div className="grid grid-cols-1 gap-[50px] lg:grid-cols-2 lg:gap-[80px]">
{/* Left */}
<RevealOnView>
<span className="tenext-subheading mb-[16px] text-tenext-teal" style={{ fontFamily: "var(--font-sora)" }}>
{whoWeAre.eyebrow}
</span>
<h2
className="max-w-[480px] tracking-[-0.03em] text-tenext-dark"
style={{
fontFamily: "var(--font-dm-sans)",
fontSize: "clamp(30px, 3.6vw, 48px)",
fontWeight: 500,
lineHeight: 1.12,
}}
>
{whoWeAre.title}
</h2>
<p className="mt-[24px] max-w-[460px] text-[17px] leading-[1.75] text-tenext-text-muted">
{whoWeAre.lead}
</p>
</RevealOnView>
{/* Right */}
<div className="flex flex-col gap-[24px]">
{whoWeAre.points.map((point, index) => (
<RevealOnView key={point.title} delay={index * 90}>
<div className="flex gap-[22px] rounded-[25px] border border-tenext-card-border p-[30px] transition-transform duration-300 hover:-translate-y-1">
<span className="flex h-[54px] w-[54px] shrink-0 items-center justify-center rounded-[15px] bg-tenext-teal/10 text-tenext-teal">
<Icon name={point.icon} className="h-[26px] w-[26px]" />
</span>
<div>
<h3 className="mb-[8px] font-[var(--font-sora)] text-[19px] font-bold text-tenext-dark">
{point.title}
</h3>
<p className="text-[15px] leading-[1.7] text-tenext-text-muted">
{point.description}
</p>
</div>
</div>
</RevealOnView>
))}
</div>
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,17 +1,22 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { siteConfig } from "@/data/site-config";
export function MapSection() {
const query = encodeURIComponent(
`${siteConfig.address.line1}, ${siteConfig.address.line2}`
);
return (
<SectionContainer paddingY="none" className="h-[500px] w-full">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d193595.15830869428!2d-74.11976397304603!3d40.69766374874431!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c24fa5d33f083b%3A0xc80b8f06e177fe62!2sNew%20York%2C%20NY%2C%20USA!5e0!3m2!1sen!2s!4v1716301234567!5m2!1sen!2s"
src={`https://www.google.com/maps?q=${query}&output=embed`}
width="100%"
height="100%"
style={{ border: 0 }}
allowFullScreen={false}
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
title="Google Map"
title={`${siteConfig.legalName} — Coimbatore`}
/>
</SectionContainer>
);

View File

@@ -0,0 +1,50 @@
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { deliveryPrinciples } from "@/data/site-content";
/**
* DeliveryPrinciplesSection — masonry grid of the commitments that keep
* delivery predictable.
*
* Shared by: Home and Services.
*
* This slot held stock client testimonials in the original build. Tenext
* does not publish named client quotes, so it presents how the company
* works instead. If real, attributable testimonials become available,
* this section is the place to reinstate them.
*/
export function DeliveryPrinciplesSection() {
return (
<SectionContainer paddingY="lg" className="bg-tenext-surface-muted">
<PageContainer>
<div className="mb-12 max-w-[650px]">
<SectionHeading
tag="how we work"
title="The principles that keep delivery predictable"
titleClassName="text-tenext-dark"
/>
</div>
<div className="columns-1 gap-6 sm:columns-2 lg:columns-4">
{deliveryPrinciples.map((principle) => (
<div
key={principle.id}
className="mb-6 break-inside-avoid rounded-[20px] bg-white p-8"
>
<h5
className="mb-4 text-[18px] font-bold text-tenext-dark"
style={{ fontFamily: "var(--font-dm-sans)" }}
>
{principle.title}
</h5>
<p className="text-[15px] leading-[1.7] text-tenext-text-muted">
{principle.description}
</p>
</div>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -0,0 +1,83 @@
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { engagementModels } from "@/data/site-content";
/**
* EngagementModelsSection — the three ways enterprises work with Tenext.
*
* This slot held the template's SaaS pricing tiers. Tenext quotes
* commercial terms per engagement, so no prices are published; each card
* routes to the contact form instead.
*/
export function EngagementModelsSection() {
return (
<SectionContainer paddingY="lg">
<PageContainer>
<div className="mb-16 flex flex-col items-center justify-center text-center">
<SectionHeading
tag="engagement models"
title="Ways to work with us"
titleClassName="text-white max-w-[500px] text-center"
/>
</div>
<div className="grid grid-cols-1 gap-6 md:grid-cols-3">
{engagementModels.map((model) => (
<div
key={model.name}
className="relative flex flex-col overflow-hidden rounded-[25px] border border-tenext-card-border bg-tenext-dark p-10 transition-colors hover:border-tenext-teal"
>
<h3
className="mb-4 text-[24px] font-bold text-white"
style={{ fontFamily: "var(--font-dm-sans)" }}
>
{model.name}
</h3>
<p className="mb-8 text-[15px] leading-[1.7] text-tenext-text-muted">
{model.summary}
</p>
<ul className="mb-10 flex flex-col gap-4">
{model.includes.map((item) => (
<li
key={item}
className="flex items-start gap-3 text-[15px] text-white"
>
<svg
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
className="mt-[3px] shrink-0 text-tenext-teal"
aria-hidden
>
<path
d="M20 6L9 17l-5-5"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
{item}
</li>
))}
</ul>
<div className="mt-auto">
<a
href="/contacts"
className="flex w-full items-center justify-center rounded-[12px] border border-tenext-card-border py-4 text-[16px] font-bold text-white transition-all hover:border-tenext-teal hover:text-tenext-teal"
style={{ fontFamily: "var(--font-sora)" }}
>
Talk to an expert
</a>
</div>
</div>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,38 +1,28 @@
"use client";
import Image from "next/image";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { ArrowIcon } from "@/components/shared/icons/ArrowIcon";
const services = [
{
title: "Neural Network Development",
desc: "Custom design and development of neural network architectures tailored to your specific business needs",
},
{
title: "Training & Optimization",
desc: "Fine-tuning and optimizing neural network models to improve accuracy, speed, and efficiency",
},
{
title: "Neural Network Integration",
desc: "Expert guidance and strategic advice on integrating neural networks into your existing systems",
},
];
import { services } from "@/data/site-content";
export function ServiceCardsGrid() {
return (
<SectionContainer paddingY="lg">
<PageContainer>
<div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
{services.map((svc, i) => (
{services.map((svc) => (
<div
key={i}
className="group relative flex h-full min-h-[340px] flex-col justify-between overflow-hidden rounded-[25px] border border-tenext-card-border bg-tenext-card-dark p-10 transition-all hover:bg-tenext-card-purple"
key={svc.id}
id={svc.id}
className="group relative flex h-full min-h-[340px] scroll-mt-[120px] flex-col justify-between overflow-hidden rounded-[25px] border border-tenext-card-border bg-tenext-card-dark p-10 transition-all hover:bg-tenext-card-purple"
>
<div className="mb-6 h-[60px] w-[60px] rounded-full bg-tenext-card-purple2 p-4">
<img
<Image
src="/images/tenext/3x.png"
alt="Icon"
alt=""
width={60}
height={60}
className="h-full w-full object-contain"
onError={(e) => {
(e.target as HTMLImageElement).src =
@@ -48,7 +38,9 @@ export function ServiceCardsGrid() {
>
{svc.title}
</h4>
<p className="text-[16px] text-tenext-text-muted">{svc.desc}</p>
<p className="text-[16px] text-tenext-text-muted">
{svc.description}
</p>
</div>
<div className="absolute bottom-0 right-0 flex h-[60px] w-[60px] items-center justify-center rounded-tl-[25px] bg-white text-tenext-dark transition-all duration-300 group-hover:bg-tenext-teal group-hover:text-white">

View File

@@ -2,35 +2,9 @@ import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { IconBox } from "@/components/shared/IconBox";
import { differentiators } from "@/data/site-content";
export function ServiceFeaturesSection() {
const features = [
{
title: "AI Technology",
desc: "Emphasize the expertise and knowledge of your team in developing and implementing neural networks.",
},
{
title: "Tailored solutions",
desc: "Mention your ability to create customized neural network solutions that specifically address your clients.",
},
{
title: "Cutting-edge technology",
desc: "Highlight that you use the latest and most advanced neural network frameworks and technologies.",
},
{
title: "AI consultancy & strategy",
desc: "Emphasize the expertise and knowledge of your team in developing and implementing neural networks.",
},
{
title: "Computer vision",
desc: "Mention your ability to create customized neural network solutions that specifically address your clients.",
},
{
title: "Deployment & Integration",
desc: "Highlight that you use the latest and most advanced neural network frameworks and technologies.",
},
];
const DefaultIcon = () => (
<div className="flex h-full w-full items-center justify-center rounded-[18px] bg-tenext-card-purple">
<svg
@@ -56,19 +30,19 @@ export function ServiceFeaturesSection() {
<PageContainer>
<div className="mb-16">
<SectionHeading
tag="features"
title="The unique selling points & advantages of our service"
tag="why tenext"
title="What enterprises get from working with us"
titleClassName="text-white max-w-[700px]"
/>
</div>
<div className="grid grid-cols-1 gap-x-12 gap-y-12 md:grid-cols-2 lg:grid-cols-3">
{features.map((feat, i) => (
{differentiators.map((item, i) => (
<IconBox
key={i}
key={item.id}
icon={<DefaultIcon />}
title={feat.title}
description={feat.desc}
title={item.title}
description={item.description}
hasBorder={i < 3} // The original has a border for the first row
/>
))}

View File

@@ -0,0 +1,64 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { CardItem } from "@/data/site-pages";
interface AnchoredCardGridProps {
tag?: string;
title: string;
description?: string;
items: CardItem[];
/** Number of columns at lg breakpoint */
columns?: 2 | 3;
}
/**
* AnchoredCardGrid — data-driven grid of bordered cards.
*
* Each card carries an `id` so navbar hash links (e.g. /solutions#devops)
* scroll to it. Shared by the Solutions and Industries pages; composes the
* existing SectionContainer / PageContainer / SectionHeading primitives.
*/
export function AnchoredCardGrid({
tag,
title,
description,
items,
columns = 3,
}: AnchoredCardGridProps) {
const colClass = columns === 2 ? "md:grid-cols-2" : "md:grid-cols-2 lg:grid-cols-3";
return (
<SectionContainer paddingY="lg" className="bg-white px-[20px]">
<PageContainer>
<SectionHeading
tag={tag}
title={title}
description={description}
titleClassName="text-tenext-dark max-w-[720px]"
descriptionClassName="max-w-[620px]"
className="mb-[50px]"
/>
<div className={`grid grid-cols-1 gap-[20px] ${colClass}`}>
{items.map((item, index) => (
<RevealOnView key={item.id} delay={index * 90}>
<div
id={item.id}
className="flex h-full scroll-mt-[120px] flex-col gap-[15px] rounded-[25px] border border-tenext-card-border p-[40px] transition-transform duration-300 hover:-translate-y-2"
>
<h3 className="font-[var(--font-sora)] text-[22px] font-bold leading-[1.3] text-tenext-dark">
{item.title}
</h3>
<p className="text-[16px] leading-[1.7] text-tenext-text-muted">
{item.description}
</p>
</div>
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -2,6 +2,7 @@
import { type FormEvent, useState } from "react";
import { siteConfig } from "@/data/site-config";
import { ctaContent } from "@/data/site-content";
import { SectionHeading } from "@/components/shared/SectionHeading";
import { SocialIcons } from "@/components/shared/SocialIcons";
import { PageContainer } from "@/components/shared/PageContainer";
@@ -42,10 +43,10 @@ export function ContactFormSection() {
{/* ── Left: Info column ── */}
<div className="flex flex-col">
<SectionHeading
tag="get in touch"
title="We are always ready to help you and answer your questions"
tag={ctaContent.contact.tag}
title={ctaContent.contact.title}
titleClassName="text-white"
description="Pacific hake false trevally queen parrotfish black prickleback mosshead warbonnet sweeper! Greenling sleeper."
description={ctaContent.contact.description}
/>
{/* Contact details grid */}
@@ -62,12 +63,6 @@ export function ContactFormSection() {
>
{siteConfig.phone}
</a>
<a
href="tel:+11800234567"
className="text-[15px] text-tenext-text-muted transition-colors hover:text-tenext-teal"
>
+ (123) 1800-234-5678
</a>
</div>
</div>

View File

@@ -1,8 +1,8 @@
import Image from "next/image";
import Link from "next/link";
import { siteConfig } from "@/data/site-config";
import { SocialIcons } from "@/components/shared/SocialIcons";
import { PageContainer } from "@/components/shared/PageContainer";
import { SiteLogo } from "@/components/shared/SiteLogo";
/**
* Footer — shared site-wide footer.
@@ -23,14 +23,8 @@ export function Footer() {
<div className="grid grid-cols-1 gap-12 md:grid-cols-2 lg:grid-cols-[1.5fr_1fr_1fr]">
{/* Brand column */}
<div className="flex flex-col items-start gap-8">
<Link href="/" aria-label="Home">
<Image
src="/images/tenext/logo-dark.png"
alt={siteConfig.name}
width={146}
height={26}
className="h-auto w-auto brightness-0 invert"
/>
<Link href="/" aria-label={`${siteConfig.legalName} — Home`}>
<SiteLogo size={28} />
</Link>
<SocialIcons links={siteConfig.socials} />

View File

@@ -0,0 +1,79 @@
import {
Cloud,
Cpu,
Database,
Code2,
Smartphone,
Boxes,
GitBranch,
ShieldCheck,
LineChart,
Rocket,
Target,
Eye,
Compass,
Building2,
Landmark,
HeartPulse,
Factory,
GraduationCap,
ShoppingBag,
Layers,
Workflow,
Users,
Sparkles,
Handshake,
BadgeCheck,
Search,
PenTool,
Hammer,
RefreshCw,
TrendingUp,
Headset,
type LucideIcon,
} from "lucide-react";
const map: Record<string, LucideIcon> = {
cloud: Cloud,
cpu: Cpu,
database: Database,
code: Code2,
mobile: Smartphone,
boxes: Boxes,
devops: GitBranch,
shield: ShieldCheck,
chart: LineChart,
rocket: Rocket,
target: Target,
eye: Eye,
compass: Compass,
building: Building2,
landmark: Landmark,
health: HeartPulse,
factory: Factory,
education: GraduationCap,
retail: ShoppingBag,
layers: Layers,
workflow: Workflow,
users: Users,
sparkles: Sparkles,
handshake: Handshake,
badge: BadgeCheck,
discover: Search,
design: PenTool,
build: Hammer,
modernize: RefreshCw,
scale: TrendingUp,
support: Headset,
};
interface IconProps {
name: string;
className?: string;
}
/** Renders a named lucide icon. Keeps content data serializable (string keys). */
export function Icon({ name, className = "h-6 w-6" }: IconProps) {
const Cmp = map[name] ?? Sparkles;
return <Cmp className={className} strokeWidth={1.6} />;
}

View File

@@ -0,0 +1,42 @@
import { SectionContainer } from "@/components/shared/SectionContainer";
import { PageContainer } from "@/components/shared/PageContainer";
import { RevealOnView } from "@/components/shared/RevealOnView";
import { LegalSection, legalEffectiveDate } from "@/data/legal";
interface LegalContentProps {
sections: LegalSection[];
}
/**
* LegalContent — shared renderer for Privacy and Terms pages.
* Uses the site's spacing, container, typography, and reveal animation.
*/
export function LegalContent({ sections }: LegalContentProps) {
return (
<SectionContainer paddingY="lg" className="bg-white px-[20px]">
<PageContainer className="max-w-[820px]">
<p className="mb-[40px] text-[14px] font-semibold uppercase tracking-[0.1em] text-tenext-teal">
Effective {legalEffectiveDate}
</p>
<div className="flex flex-col gap-[40px]">
{sections.map((section, index) => (
<RevealOnView key={section.heading} delay={index * 60}>
<h2 className="mb-[16px] font-[var(--font-sora)] text-[24px] font-bold leading-[1.25] text-tenext-dark">
{section.heading}
</h2>
{section.body.map((paragraph, i) => (
<p
key={i}
className="mb-[14px] text-[16px] leading-[1.8] text-tenext-text-muted"
>
{paragraph}
</p>
))}
</RevealOnView>
))}
</div>
</PageContainer>
</SectionContainer>
);
}

View File

@@ -1,3 +1,5 @@
import { siteConfig } from "@/data/site-config";
interface BreadcrumbItem {
label: string;
href?: string;
@@ -23,8 +25,23 @@ interface PageTitleBannerProps {
* - Top-left and bottom-right rounded corner decorations
*/
export function PageTitleBanner({ title, breadcrumbs }: PageTitleBannerProps) {
const breadcrumbJsonLd = {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
itemListElement: breadcrumbs.map((crumb, index) => ({
"@type": "ListItem",
position: index + 1,
name: crumb.label,
...(crumb.href ? { item: `${siteConfig.url}${crumb.href}` } : {}),
})),
};
return (
<div className="relative mx-5 overflow-hidden rounded-[25px] bg-tenext-dark">
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbJsonLd) }}
/>
{/* Background image */}
<div
className="absolute inset-0 bg-cover bg-center opacity-80"

View File

@@ -1,18 +1,15 @@
"use client";
import { PageContainer } from "@/components/shared/PageContainer";
import { SectionContainer } from "@/components/shared/SectionContainer";
import { industries } from "@/data/site-pages";
/**
* Industries trust strip.
*
* Replaces the template's fabricated partner-logo carousel. Tenext does
* not publish client logos here, so this presents the real industries it
* serves. Swap in a genuine client-logo row once approved logos exist.
*/
export function PartnerLogosSection() {
const logos = [
"/images/tenext/partners-1.png",
"/images/tenext/partners-2.png",
"/images/tenext/partners-1.png",
"/images/tenext/partners-2.png",
"/images/tenext/partners-1.png",
"/images/tenext/partners-2.png",
];
return (
<SectionContainer
paddingY="lg"
@@ -28,25 +25,18 @@ export function PartnerLogosSection() {
lineHeight: 1.2,
}}
>
Our trusted collaborators in progress and success
Trusted to deliver across the industries we serve
</h3>
<div className="flex flex-wrap justify-center gap-8 md:gap-16 lg:gap-24 opacity-60">
{logos.map((src, index) => (
<div
key={index}
className="flex h-12 items-center justify-center grayscale transition-all hover:grayscale-0"
<div className="flex flex-wrap items-center justify-center gap-x-10 gap-y-6 md:gap-x-16">
{industries.map((industry) => (
<span
key={industry.id}
className="text-[18px] font-semibold text-white/70 transition-colors hover:text-tenext-teal md:text-[22px]"
style={{ fontFamily: "var(--font-sora)" }}
>
<img
src={src}
alt={`Partner ${index + 1}`}
className="h-full w-auto object-contain"
onError={(e) => {
(e.target as HTMLImageElement).src =
"/images/tenext/logo-dark.png";
}}
/>
</div>
{industry.title}
</span>
))}
</div>
</PageContainer>

View File

@@ -1,8 +1,9 @@
import { tenextButton as TenextButton } from "@/components/shared/AieroButton";
import { tenextButton as TenextButton } from "@/components/shared/Button";
import { PageContainer } from "@/components/shared/PageContainer";
import { ctaContent } from "@/data/site-content";
/**
* PreFooterCTA — "Elevate your business with our innovative solutions" banner.
* PreFooterCTA — closing conversion banner.
*
* Shared across: Home, About, Services, Contacts.
*
@@ -25,7 +26,7 @@ export function PreFooterCTA() {
lineHeight: 1.15,
}}
>
Elevate your business with our innovative solutions
{ctaContent.preFooter.heading}
</h2>
{/* CTA */}
@@ -34,7 +35,7 @@ export function PreFooterCTA() {
variant="simple"
className="shrink-0 text-[15px] font-semibold text-tenext-teal"
>
Get in touch
{ctaContent.preFooter.linkLabel}
</TenextButton>
</PageContainer>
</section>

View File

@@ -0,0 +1,24 @@
interface SiteLogoProps {
/** Extra classes (e.g. color overrides) */
className?: string;
/** Wordmark font-size in px — matches the slot it replaces */
size?: number;
}
/**
* SiteLogo — Tenext Technologies wordmark.
*
* Temporary text logo in the project's Sora typography, used until an
* official logo asset is supplied. Rendered on dark surfaces (navbar,
* footer), so it defaults to white with a teal accent dot.
*/
export function SiteLogo({ className = "", size = 22 }: SiteLogoProps) {
return (
<span
className={`font-bold leading-none tracking-[-0.02em] text-white ${className}`}
style={{ fontFamily: "var(--font-sora)", fontSize: `${size}px` }}
>
Tenext<span className="text-tenext-teal">.</span>
</span>
);
}

311
data/about.ts Normal file
View File

@@ -0,0 +1,311 @@
// ─── About page content ──────────────────────────────────────────────
// Single source of truth for the redesigned About page. All copy is
// Tenext Technologies content — no invented history, dates, names,
// clients, awards, or statistics. Icons are referenced by string key
// and resolved in components/shared/Icon.tsx.
// ─────────────────────────────────────────────────────────────────────
export interface IconCard {
icon: string;
title: string;
description: string;
}
export const aboutHero = {
eyebrow: "About Tenext",
title: "Enterprise technology, engineered for outcomes",
paragraph:
"Tenext Technologies helps enterprises turn digital transformation into predictable business results — combining engineering depth with a diagnostic, outcome-first approach across cloud, data, AI, and product engineering.",
primaryCta: { label: "Talk to an expert", href: "/contacts" },
secondaryCta: { label: "Explore our services", href: "/services" },
};
// 2 — Who we are (two-column)
export const whoWeAre = {
eyebrow: "who we are",
title: "A partner for enterprise-grade digital transformation",
lead: "We engineer, migrate, and scale the platforms enterprises run on — and we integrate with the systems and processes already in place rather than forcing a wholesale replacement.",
points: [
{
icon: "layers",
title: "What we do",
description:
"Full-stack engineering, cloud and platform modernization, data and applied AI, enterprise mobility, and digital commerce.",
},
{
icon: "building",
title: "Who we serve",
description:
"Enterprises across retail, financial services, healthcare, manufacturing, and education navigating complex transformation.",
},
{
icon: "target",
title: "Why we exist",
description:
"To take the uncertainty out of enterprise technology — delivering measurable outcomes, lower total cost of ownership, and faster time to value.",
},
],
};
// 3 — Our story (narrative, no invented history/dates)
export const ourStory = {
eyebrow: "our story",
title: "Built around engineering, focused on business outcomes",
paragraphs: [
"Digital transformation is imperative for every business — from the small to the enterprise — and it now sits at the top of the strategy agenda. Tenext exists to make that transformation actually deliver.",
"Our work spans product engineering, cloud modernization, data platforms, and applied AI. We treat technology as a means to a business result, not an end in itself — every architecture decision is weighed on the value and the run cost it creates over its lifetime.",
"Because the team that designs a system also builds and supports it, accountability never changes hands mid-programme. That continuity is how we keep transformation predictable from first diagnostic to long-term support.",
],
};
// 4 — Mission / Vision / Values
export const pillars: IconCard[] = [
{
icon: "compass",
title: "Mission",
description:
"To deliver predictable outcomes from every technology investment — diagnosing before we build and holding ourselves to results enterprises can measure.",
},
{
icon: "eye",
title: "Vision",
description:
"To be the engineering partner enterprises trust to modernize with confidence, at the lowest total cost of ownership and the fastest time to value.",
},
{
icon: "sparkles",
title: "Values",
description:
"Outcome-first thinking, engineering ownership, transparency, and security by default — applied on every engagement, without exception.",
},
];
// 5 — Why Tenext (differentiators, specific not generic)
export const whyTenext: IconCard[] = [
{
icon: "target",
title: "Predictable delivery",
description:
"Outcome-first scoping and transparent milestones, so progress and cost stay visible from day one.",
},
{
icon: "code",
title: "Enterprise engineering",
description:
"Full-stack teams that design, build, and support production-grade platforms at scale.",
},
{
icon: "cloud",
title: "Cloud modernization",
description:
"Migration and platform engineering weighed on lifetime run cost and resilience, not just build speed.",
},
{
icon: "cpu",
title: "AI & data transformation",
description:
"Applied AI and governed data platforms that turn enterprise data into automation and insight.",
},
{
icon: "handshake",
title: "Business-first approach",
description:
"Every engagement starts from the business outcome and the measure that proves it.",
},
{
icon: "shield",
title: "Security & governance",
description:
"Access control, data governance, and compliance-ready handling designed in from the first sprint.",
},
];
// 6 — Capabilities
export const capabilities: IconCard[] = [
{
icon: "code",
title: "Technology Engineering",
description:
"Architecture, development, and modernization of enterprise applications built to scale.",
},
{
icon: "cloud",
title: "Cloud & Enterprise Platforms",
description:
"Cloud migration, platform engineering, and DevOps that keep systems reliable and efficient.",
},
{
icon: "cpu",
title: "AI & Data Science",
description:
"Data platforms, analytics, and applied AI that turn data into decision-ready insight.",
},
{
icon: "mobile",
title: "Enterprise Mobility",
description:
"Mobile and field applications that extend core systems to your workforce and customers.",
},
{
icon: "boxes",
title: "Digital Commerce",
description:
"Commerce platforms and experiences that unify online and offline channels.",
},
{
icon: "workflow",
title: "DevOps & Automation",
description:
"CI/CD, automation, and platform reliability that shorten release cycles and reduce cost.",
},
];
// 7 — Industry icon map (industry content lives in data/site-pages.ts)
export const industryIcons: Record<string, string> = {
retail: "retail",
"financial-services": "landmark",
healthcare: "health",
manufacturing: "factory",
education: "education",
};
// 8 — Delivery model
export const deliverySteps: IconCard[] = [
{
icon: "discover",
title: "Discover",
description: "Assess systems, processes, and goals to find where value is highest.",
},
{
icon: "design",
title: "Design",
description: "Architect a solution that fits the existing landscape and the outcome.",
},
{
icon: "build",
title: "Build",
description: "Engineer, integrate, and test against the measures agreed up front.",
},
{
icon: "modernize",
title: "Modernize",
description: "Replace only what blocks progress; integrate with what already runs.",
},
{
icon: "scale",
title: "Scale",
description: "Deploy with confidence and grow capability as the roadmap evolves.",
},
{
icon: "support",
title: "Support",
description: "Monitor, optimize, and manage platforms long after go-live.",
},
];
// 9 — Practice teams (unique gradient + icon each; no photos, no invented people)
export interface PracticeTeamCard {
name: string;
focus: string;
description: string;
icon: string;
gradient: string;
}
export const practiceTeamCards: PracticeTeamCard[] = [
{
name: "Technology Engineering",
focus: "Architecture & full-stack build",
description:
"Designs and builds enterprise applications engineered to scale.",
icon: "code",
gradient: "from-[#343F78] to-[#2C84C8]",
},
{
name: "Cloud & Platforms",
focus: "Migration, DevOps & reliability",
description:
"Modernizes infrastructure and keeps platforms reliable and efficient.",
icon: "cloud",
gradient: "from-[#2C84C8] to-[#45D0BD]",
},
{
name: "AI & Data Science",
focus: "Data platforms & applied AI",
description:
"Turns enterprise data into automation and decision-ready insight.",
icon: "cpu",
gradient: "from-[#6766C8] to-[#8258C8]",
},
{
name: "Enterprise Mobility",
focus: "Mobile & field applications",
description:
"Extends core systems to the workforce and customers wherever they operate.",
icon: "mobile",
gradient: "from-[#8258C8] to-[#AC8DE0]",
},
{
name: "Digital Commerce",
focus: "Commerce & customer experience",
description: "Unifies online and offline channels on a scalable foundation.",
icon: "boxes",
gradient: "from-[#56619E] to-[#343F78]",
},
{
name: "Quality & Reliability",
focus: "Security, governance & support",
description:
"Builds in security and keeps platforms performing after launch.",
icon: "shield",
gradient: "from-[#44B6E9] to-[#6766C8]",
},
];
// 10 — Technology ecosystem (categories, not vendor logos)
export const techEcosystem: IconCard[] = [
{ icon: "cloud", title: "Cloud", description: "Cloud platforms & infrastructure" },
{ icon: "cpu", title: "AI & ML", description: "Applied AI and machine learning" },
{ icon: "database", title: "Data", description: "Data platforms & analytics" },
{ icon: "code", title: "Web", description: "Modern web application stacks" },
{ icon: "mobile", title: "Mobile", description: "Native and cross-platform apps" },
{ icon: "building", title: "Enterprise", description: "Enterprise systems & integration" },
{ icon: "devops", title: "DevOps", description: "CI/CD, automation & reliability" },
{ icon: "shield", title: "Security", description: "Governance & compliance-ready" },
];
// 11 — Enterprise trust (no testimonials)
export const trustPrinciples: IconCard[] = [
{
icon: "target",
title: "Delivery principles",
description:
"Outcome-first scoping, milestone-based delivery, and progress that stays visible throughout.",
},
{
icon: "badge",
title: "Quality standards",
description:
"Secure architecture, tested code, and compliance-ready data handling on every engagement.",
},
{
icon: "users",
title: "Engineering culture",
description:
"The team that designs a system builds and supports it — ownership never changes hands.",
},
{
icon: "handshake",
title: "Long-term partnership",
description:
"Knowledge transfer and managed support keep you in control long after go-live.",
},
];
export const aboutCta = {
title: "Ready to engineer your next transformation?",
paragraph:
"Tell us about the systems you run and the outcome you need. We'll come back to you within one business day.",
primaryCta: { label: "Talk to an expert", href: "/contacts" },
secondaryCta: { label: "View our services", href: "/services" },
};

107
data/legal.ts Normal file
View File

@@ -0,0 +1,107 @@
// ─── Legal page content ──────────────────────────────────────────────
// Single source of truth for the Privacy Policy and Terms of Use pages.
// Written for Tenext Technologies with its real contact details. This is
// standard, good-faith scaffolding — have it reviewed by legal counsel
// and adjust `effectiveDate` before publishing.
// ─────────────────────────────────────────────────────────────────────
import { siteConfig } from "@/data/site-config";
export interface LegalSection {
heading: string;
body: string[];
}
export const legalEffectiveDate = "2026";
export const privacyPolicy: LegalSection[] = [
{
heading: "Overview",
body: [
`${siteConfig.legalName} ("Tenext", "we", "us") respects your privacy. This policy explains what information we collect through this website, how we use it, and the choices you have.`,
],
},
{
heading: "Information we collect",
body: [
"We collect the information you choose to give us — for example, your name, email address, and message when you submit our contact form or email us directly.",
"We also collect limited technical information automatically, such as your browser type and pages visited, to keep the site secure and understand how it is used.",
],
},
{
heading: "How we use information",
body: [
"We use the information you provide to respond to your enquiry, deliver the services you request, and improve our website and communications.",
"We do not sell your personal information.",
],
},
{
heading: "Data sharing",
body: [
"We share information only with service providers who help us operate this website and our business, and only to the extent needed to perform that work, or where required by law.",
],
},
{
heading: "Data retention and security",
body: [
"We keep personal information only for as long as needed for the purposes described here, and apply appropriate technical and organisational measures to protect it.",
],
},
{
heading: "Your rights",
body: [
"You may request access to, correction of, or deletion of your personal information. To make a request, contact us using the details below.",
],
},
{
heading: "Contact us",
body: [
`For any privacy question, email ${siteConfig.email} or write to ${siteConfig.legalName}, ${siteConfig.address.line1}, ${siteConfig.address.line2}.`,
],
},
];
export const termsOfUse: LegalSection[] = [
{
heading: "Acceptance of terms",
body: [
`By accessing this website you agree to these terms. If you do not agree, please do not use the site. The site is operated by ${siteConfig.legalName}.`,
],
},
{
heading: "Use of the website",
body: [
"You may use this website for lawful purposes only. You agree not to misuse the site, interfere with its operation, or attempt to access it in any way other than through the interface we provide.",
],
},
{
heading: "Intellectual property",
body: [
"All content on this website — text, graphics, logos, and design — is owned by or licensed to Tenext and is protected by applicable intellectual-property laws. You may not reuse it without our written permission.",
],
},
{
heading: "No warranty",
body: [
"This website and its content are provided on an \"as is\" basis. While we work to keep information accurate and current, we make no warranties about its completeness or availability.",
],
},
{
heading: "Limitation of liability",
body: [
"To the extent permitted by law, Tenext is not liable for any loss arising from your use of, or inability to use, this website.",
],
},
{
heading: "Changes to these terms",
body: [
"We may update these terms from time to time. Continued use of the website after changes are posted constitutes acceptance of the updated terms.",
],
},
{
heading: "Contact us",
body: [
`Questions about these terms can be sent to ${siteConfig.email}.`,
],
},
];

View File

@@ -1,9 +1,23 @@
import { services } from "@/data/site-content";
import { solutions, industries } from "@/data/site-pages";
export interface NavItem {
label: string;
href: string;
children?: NavItem[];
}
/** Builds dropdown entries from a content list so the menu tracks the page. */
function toNavItems(
items: { id: string; title: string }[],
basePath: string,
): NavItem[] {
return items.map((item) => ({
label: item.title,
href: `${basePath}#${item.id}`,
}));
}
export const navigationData: NavItem[] = [
{
label: "Home",
@@ -14,59 +28,33 @@ export const navigationData: NavItem[] = [
href: "/about",
children: [
{ label: "Company", href: "/about" },
{ label: "Mission & Vision", href: "/about#mission" },
{ label: "Leadership", href: "/about#team" },
{ label: "Our Mission", href: "/about#mission" },
{ label: "Our Teams", href: "/about#teams" },
{ label: "Careers", href: "/careers" },
],
},
{
label: "Services",
href: "/services",
children: [
{ label: "Technology Engineering", href: "/services#technology-engineering" },
{ label: "Cloud & Enterprise Platforms", href: "/services#cloud-enterprise-platforms" },
{ label: "AI & Data Science", href: "/services#ai-data-science" },
{ label: "Enterprise Mobility", href: "/services#enterprise-mobility" },
{ label: "Digital Commerce", href: "/services#digital-commerce" },
],
children: toNavItems(services, "/services"),
},
{
label: "Solutions",
href: "/solutions",
children: [
{ label: "Digital Transformation", href: "/solutions#digital-transformation" },
{ label: "Product Development", href: "/solutions#product-development" },
{ label: "Internet of Things", href: "/solutions#iot" },
{ label: "SMAC", href: "/solutions#smac" },
{ label: "DevOps", href: "/solutions#devops" },
{ label: "Blockchain", href: "/solutions#blockchain" },
],
children: toNavItems(solutions, "/solutions"),
},
{
label: "Industries",
href: "/industries",
children: toNavItems(industries, "/industries"),
},
{
label: "Insights",
href: "/case-studies",
children: [
{ label: "Retail", href: "/industries#retail" },
{ label: "Financial Services", href: "/industries#financial-services" },
{ label: "Healthcare", href: "/industries#healthcare" },
{ label: "Manufacturing", href: "/industries#manufacturing" },
{ label: "Education", href: "/industries#education" },
{ label: "Case Studies", href: "/case-studies" },
{ label: "Resources", href: "/resources" },
{ label: "Contact", href: "/contacts" },
],
},
{
label: "Case Studies",
href: "/case-studies",
},
{
label: "Resources",
href: "/resources",
},
{
label: "Careers",
href: "/careers",
},
{
label: "Contact",
href: "/contacts",
},
];

View File

@@ -3,6 +3,8 @@
// Shared by: Footer, ContactFormSection, Navbar (mobile), TopBar.
// ─────────────────────────────────────────────────────────────────────
import { services } from "@/data/site-content";
export interface SocialLink {
platform: string;
url: string;
@@ -16,8 +18,13 @@ export interface FooterLink {
export const siteConfig = {
name: "tenext",
legalName: "Tenext Technologies",
tagline: "Enterprise Digital Transformation",
// Canonical site URL — used for metadataBase, sitemap, robots, and JSON-LD.
// Update if the production domain differs.
url: "https://www.tenext.in",
// Contact
phone: "+91 96294 15770",
phoneRaw: "+919629415770",
@@ -27,42 +34,42 @@ export const siteConfig = {
line2: "RS Puram, Coimbatore, India",
},
// Social
// Social — set each `url` to Tenext's real profile before launch.
// Left as "#" (not template links) until official handles are provided.
socials: [
{
platform: "Facebook",
url: "https://www.facebook.com/",
icon: "facebook",
},
{ platform: "X", url: "https://twitter.com/", icon: "x-twitter" },
{
platform: "LinkedIn",
url: "https://www.linkedin.com/",
url: "#",
icon: "linkedin",
},
{ platform: "Youtube", url: "https://www.youtube.com/", icon: "youtube" },
{ platform: "X", url: "#", icon: "x-twitter" },
{
platform: "Facebook",
url: "#",
icon: "facebook",
},
{ platform: "Youtube", url: "#", icon: "youtube" },
] as SocialLink[],
// Footer link columns
footerLinks: {
company: [
{ label: "About Us", href: "/about" },
{ label: "Leadership", href: "/about#team" },
{ label: "Our Teams", href: "/about#teams" },
{ label: "Careers", href: "/careers" },
{ label: "Contact", href: "/contacts" },
] as FooterLink[],
services: [
{ label: "Cloud & Enterprise Platforms", href: "/services#cloud-enterprise-platforms" },
{ label: "AI & Data Science", href: "/services#ai-data-science" },
{ label: "Enterprise Mobility", href: "/services#enterprise-mobility" },
{ label: "Digital Commerce", href: "/services#digital-commerce" },
] as FooterLink[],
// Derived from the single services source so the footer never drifts.
services: services.map((service) => ({
label: service.title,
href: `/services#${service.id}`,
})) as FooterLink[],
},
// Legal
copyright: "©Tenext Technologies 2026. All rights reserved.",
legalLinks: [
{ label: "Terms of use", href: "#" },
{ label: "Privacy Policy", href: "#" },
{ label: "Terms of use", href: "/terms" },
{ label: "Privacy Policy", href: "/privacy" },
] as FooterLink[],
} as const;

318
data/site-content.ts Normal file
View File

@@ -0,0 +1,318 @@
// ─── Home / About / Services narrative content ───────────────────────
// Single source of truth for the marketing copy shared by the homepage,
// About, and Services routes. Positioning traces to Tenext's own
// language: predictable outcomes from IT investments, accelerated time
// to value, and the lowest total cost of ownership.
//
// Inner-page content (Solutions, Industries, Case Studies, Resources,
// Careers) lives in `data/site-pages.ts`.
// ─────────────────────────────────────────────────────────────────────
/** A capability, principle, or differentiator rendered as a card. */
export interface ContentItem {
/** Anchor id — matches hash links in data/navigation.ts where relevant */
id: string;
title: string;
description: string;
}
// ─── Value propositions ──────────────────────────────────────────────
// Qualitative proof points shown where the template used unverified
// statistics. Tenext has not published audited figures, so these state
// how the company works rather than invented numbers. Add real,
// verified metrics here only once Tenext confirms them.
// ─────────────────────────────────────────────────────────────────────
export interface ValueProp {
title: string;
description: string;
}
export const valueProps = {
outcomes: {
title: "Outcome-driven delivery",
description:
"Every engagement is measured against the business result it was commissioned to deliver.",
},
engineering: {
title: "Enterprise-grade engineering",
description:
"Full-stack teams that design, build, and support the platforms they ship.",
},
reliability: {
title: "Reliable at scale",
description:
"Architectures weighed on lifetime run cost and resilience, not just build speed.",
},
integration: {
title: "Integrated with what you run",
description:
"Solutions fit your existing systems and processes instead of forcing a replacement.",
},
} satisfies Record<string, ValueProp>;
// ─── Services ────────────────────────────────────────────────────────
// The five Tenext service lines. Consumed by the Services page grid and
// by data/navigation.ts so the menu never drifts from the page.
// ─────────────────────────────────────────────────────────────────────
export const services: ContentItem[] = [
{
id: "technology-engineering",
title: "Technology Engineering",
description:
"Full-stack product engineering — architecture, development, and modernization of enterprise applications built to scale.",
},
{
id: "cloud-enterprise-platforms",
title: "Cloud & Enterprise Platforms",
description:
"Cloud migration, platform engineering, and DevOps that keep systems reliable while lowering total cost of ownership.",
},
{
id: "ai-data-science",
title: "AI & Data Science",
description:
"Data platforms, analytics, and applied AI that turn enterprise data into automation and decision-ready insight.",
},
{
id: "enterprise-mobility",
title: "Enterprise Mobility",
description:
"Mobile and field applications that extend core systems to your workforce and customers wherever they operate.",
},
{
id: "digital-commerce",
title: "Digital Commerce",
description:
"Commerce platforms and customer experiences that unify online and offline channels on a scalable foundation.",
},
];
// ─── Differentiators ─────────────────────────────────────────────────
export const differentiators: ContentItem[] = [
{
id: "diagnostic-first",
title: "Diagnostic before build",
description:
"We assess systems, processes, and goals first, so investment goes where it returns the most business value.",
},
{
id: "fits-your-landscape",
title: "Integration with what you run",
description:
"Solutions are designed to fit your existing landscape rather than force a wholesale replacement of it.",
},
{
id: "total-cost-of-ownership",
title: "Lowest total cost of ownership",
description:
"Architecture and platform choices are weighed on lifetime run cost, not only on what they cost to build.",
},
{
id: "time-to-value",
title: "Accelerated time to value",
description:
"Delivery is sequenced so working capability reaches production early and keeps compounding from there.",
},
{
id: "security-governance",
title: "Security and governance built in",
description:
"Access control, data governance, and compliance-ready handling are designed in from the first sprint.",
},
{
id: "beyond-go-live",
title: "Support beyond go-live",
description:
"Monitoring, optimization, and managed support keep platforms performing long after launch.",
},
];
// ─── Delivery principles ─────────────────────────────────────────────
// Rendered in the masonry grid on Home and Services.
// ─────────────────────────────────────────────────────────────────────
export const deliveryPrinciples: ContentItem[] = [
{
id: "outcome-first-scoping",
title: "Outcome-first scoping",
description:
"Every engagement starts with the business outcome and the measure that proves it — not with a technology shortlist.",
},
{
id: "fit-before-replacement",
title: "Fit before replacement",
description:
"We integrate with the systems and processes you already run, and replace only what genuinely blocks progress.",
},
{
id: "cost-of-ownership",
title: "Designed for run cost",
description:
"Decisions are weighed on what a platform costs to operate and maintain over its life, not just to deliver.",
},
{
id: "early-value",
title: "Value early, not once",
description:
"Work is sequenced so useful capability reaches production early instead of arriving in one late release.",
},
{
id: "secure-by-default",
title: "Secure by default",
description:
"Access control, data handling, and compliance requirements are designed in rather than retrofitted.",
},
{
id: "engineering-ownership",
title: "Engineering ownership",
description:
"The team that designs a system builds and supports it, so accountability never changes hands mid-programme.",
},
{
id: "transparent-delivery",
title: "Transparent delivery",
description:
"Progress, risk, and cost stay visible throughout, so milestone reviews confirm what you already knew.",
},
{
id: "knowledge-transfer",
title: "Knowledge transfer",
description:
"Your teams are brought along through the build, so you are never dependent on us to operate what we deliver.",
},
{
id: "continuous-optimization",
title: "Continuous optimization",
description:
"After go-live we keep measuring and tuning against the outcomes agreed at the start of the engagement.",
},
];
// ─── Practice teams ──────────────────────────────────────────────────
// Replaces the template's stock team members. Tenext does not publish
// individual profiles, so this presents the disciplines that staff an
// engagement. Add real people here only with their consent.
// ─────────────────────────────────────────────────────────────────────
export interface PracticeTeam {
name: string;
focus: string;
image: string;
}
export const practiceTeams: PracticeTeam[] = [
{
name: "Technology Engineering",
focus: "Architecture & full-stack build",
image: "/images/tenext/waist-up-shot-handsome-calm.jpg",
},
{
name: "Cloud & Platforms",
focus: "Migration, DevOps & reliability",
image: "/images/tenext/funny-curious-man-makes.jpg",
},
{
name: "AI & Data Science",
focus: "Data platforms & applied AI",
image: "/images/tenext/portrait-confident-man.jpg",
},
{
name: "Enterprise Mobility",
focus: "Mobile & field applications",
image: "/images/tenext/confident-ginger-man-with-trendy.jpg",
},
{
name: "Digital Commerce",
focus: "Commerce & customer experience",
image: "/images/tenext/waist-up-shot-handsome-calm.jpg",
},
];
// ─── Engagement models ───────────────────────────────────────────────
// Replaces the template's SaaS pricing tiers. Commercial terms are
// quoted per engagement, so no prices are published here.
// ─────────────────────────────────────────────────────────────────────
export interface EngagementModel {
name: string;
summary: string;
includes: string[];
}
export const engagementModels: EngagementModel[] = [
{
name: "Project delivery",
summary:
"Fixed-scope programmes with defined outcomes and milestones — best when the problem and the endpoint are well understood.",
includes: [
"Discovery and solution design",
"Milestone-based delivery plan",
"Documentation and handover",
"Post-launch support window",
],
},
{
name: "Dedicated teams",
summary:
"An embedded engineering team working to your backlog and priorities, scaling with the roadmap as it changes.",
includes: [
"Team shaped to your stack",
"Works to your backlog and rituals",
"Scales up or down by quarter",
"Direct access to practice leads",
],
},
{
name: "Managed services",
summary:
"Ongoing operation, support, and optimization of the platforms we build or of the systems you already run.",
includes: [
"Monitoring and incident response",
"Agreed response commitments",
"Continuous performance tuning",
"Roadmap and upgrade planning",
],
},
];
// ─── About page narrative ────────────────────────────────────────────
export const aboutContent = {
intro: {
tag: "about",
title: "Enterprise technology, engineered for outcomes",
paragraphs: [
"Digital transformation is imperative for every business, from the small to the enterprise — and it now sits at the top of the strategy agenda. Tenext Technologies exists to make that transformation actually deliver.",
"We partner with enterprises across retail, financial services, healthcare, manufacturing, and education to engineer, migrate, and scale digital platforms — integrating with the systems and processes they already run.",
],
},
mission: {
tag: "mission",
title: "Predictable outcomes from every technology investment",
body: "Our mission is to take the uncertainty out of enterprise technology. We diagnose before we build, fit solutions to the landscape you already operate, and hold ourselves to results you can measure.",
/** The three commitments Tenext leads with. */
commitments: [
"Predictable outcomes from your IT investments",
"Accelerated time to value",
"The lowest total cost of ownership",
],
},
};
// ─── Shared calls to action ──────────────────────────────────────────
export const ctaContent = {
preFooter: {
heading: "Let's engineer predictable outcomes from your next investment",
linkLabel: "Get in touch",
},
contact: {
tag: "get in touch",
title: "We are always ready to help you and answer your questions",
description:
"Tell us about the systems you run and the outcome you need. Our team will come back to you within one business day.",
},
};

188
data/site-pages.ts Normal file
View File

@@ -0,0 +1,188 @@
// ─── Inner-page content ──────────────────────────────────────────────
// Single source of truth for Solutions, Industries, Case Studies,
// Resources, and Careers page content. Consumed by the routes under
// app/(solutions|industries|case-studies|resources|careers).
//
// NOTE: Case studies, resources, and open roles are representative
// placeholders — replace with real Tenext content before launch.
// ─────────────────────────────────────────────────────────────────────
export interface CardItem {
/** Anchor id — matches the hash links in data/navigation.ts */
id: string;
title: string;
description: string;
}
/** Solutions hub — /solutions (anchors match navigation.ts) */
export const solutions: CardItem[] = [
{
id: "digital-transformation",
title: "Digital Transformation",
description:
"End-to-end modernization of platforms, processes, and customer experiences — mapped to measurable business outcomes and lower total cost of ownership.",
},
{
id: "product-development",
title: "Product Development",
description:
"From idea to launch: product strategy, design, and full-stack engineering that turn concepts into scalable, production-grade software.",
},
{
id: "iot",
title: "Internet of Things",
description:
"Connected device platforms, edge integration, and real-time telemetry that bring physical operations into your digital estate.",
},
{
id: "smac",
title: "SMAC",
description:
"Social, Mobile, Analytics, and Cloud brought together into a coherent architecture that modernizes how your enterprise engages and operates.",
},
{
id: "devops",
title: "DevOps",
description:
"CI/CD, automation, and platform engineering that shorten release cycles, improve reliability, and reduce operational cost.",
},
{
id: "blockchain",
title: "Blockchain",
description:
"Distributed-ledger solutions for traceability, trust, and secure transactions across multi-party business networks.",
},
];
/** Industries hub — /industries (anchors match navigation.ts) */
export const industries: CardItem[] = [
{
id: "retail",
title: "Retail",
description:
"Commerce platforms, personalization, and supply-chain visibility that unify online and in-store experiences.",
},
{
id: "financial-services",
title: "Financial Services",
description:
"Secure, compliant platforms for payments, data, and customer engagement — engineered for scale and resilience.",
},
{
id: "healthcare",
title: "Healthcare",
description:
"Interoperable systems and data platforms that improve patient experience while meeting strict privacy and compliance needs.",
},
{
id: "manufacturing",
title: "Manufacturing",
description:
"IoT, analytics, and automation that connect the shop floor to the enterprise and drive operational efficiency.",
},
{
id: "education",
title: "Education",
description:
"Digital learning platforms and administrative systems that scale access and streamline institutional operations.",
},
];
/** How we deliver, by industry — /case-studies.
* Tenext has not published named client case studies, so this describes
* the delivery approach per industry rather than claiming specific past
* engagements or results. Replace with real, approved case studies when
* available. */
export interface CaseStudyItem extends CardItem {
industry: string;
}
export const caseStudies: CaseStudyItem[] = [
{
id: "retail-approach",
industry: "Retail",
title: "Unifying commerce across channels",
description:
"How we approach retail engagements — scalable commerce platforms, personalization, and supply-chain visibility that connect online and in-store.",
},
{
id: "financial-approach",
industry: "Financial Services",
title: "Secure, compliant data platforms",
description:
"How we approach financial services — governed data, secure integrations, and resilient platforms built for scale and compliance.",
},
{
id: "manufacturing-approach",
industry: "Manufacturing",
title: "Connecting the shop floor to the enterprise",
description:
"How we approach manufacturing — IoT, analytics, and automation that link production to the wider digital estate.",
},
];
/** Insight areas — /resources.
* Topic areas Tenext advises on, not published articles. No dates or
* author bylines are shown until real articles exist. */
export interface ResourceItem extends CardItem {
category: string;
}
export const resources: ResourceItem[] = [
{
id: "cloud",
category: "Cloud",
title: "Enterprise cloud migration",
description:
"Sequencing a migration to minimize risk while protecting total cost of ownership and time to value.",
},
{
id: "data",
category: "Data",
title: "Enterprise data platforms",
description:
"The building blocks of a governed data platform that turns operations into decision-ready insight.",
},
{
id: "ai",
category: "AI",
title: "Applied AI for the enterprise",
description:
"Selecting AI use cases that deliver automation and measurable value across core operations.",
},
];
/** Careers — /careers (representative placeholders) */
export interface RoleItem {
id: string;
title: string;
location: string;
type: string;
}
export const openRoles: RoleItem[] = [
{
id: "senior-full-stack-engineer",
title: "Senior Full-Stack Engineer",
location: "Coimbatore, India",
type: "Full-time",
},
{
id: "cloud-platform-engineer",
title: "Cloud & Platform Engineer",
location: "Coimbatore, India",
type: "Full-time",
},
{
id: "data-engineer",
title: "Data Engineer",
location: "Coimbatore, India",
type: "Full-time",
},
{
id: "product-designer",
title: "Product Designer",
location: "Coimbatore, India",
type: "Full-time",
},
];

View File

@@ -394,3 +394,41 @@ Exact leftover-Aiero values in the repo and their Tenext replacements.
| `app/layout.tsx` | metadata "Home 9 tenext" | Tenext title/description/OG |
> **Guardrails:** no Aiero marketing copy is reproduced; Aiero informs structure/UX only. All business facts trace to tenext.in. Preserve the existing component architecture and single-source-of-truth tokens (per CLAUDE.md / AGENTS.md).
### Round 2 — section-level copy (cleared)
The table above covered config and navigation. A second pass cleared the
template copy still sitting inside the section components. All of it now
resolves from `data/site-content.ts`.
| File | Was (Aiero) | Now (Tenext) |
|---|---|---|
| `about/AboutIntroSection.tsx` | "Awesome things in working with tenext WordPress theme" / "At **XXLando**, we are a leading AI services provider…" | `aboutContent.intro` — enterprise transformation positioning |
| `about/MissionSection.tsx` | "Certainly, crafting a clear and inspiring mission statement is essential…" (writing instructions left in as copy) + `1250+ Created projects` | `aboutContent.mission` + the three Tenext commitments |
| `shared/ContactFormSection.tsx` | "Pacific hake false trevally queen parrotfish…" + fake second phone `+ (123) 1800-234-5678` | `ctaContent.contact`; single real number from `site-config` |
| `services/ServiceCardsGrid.tsx` | Neural Network Development / Training & Optimization / Neural Network Integration | The five real service lines from `services` |
| `services/ServiceFeaturesSection.tsx` | "Emphasize the expertise…", "Mention your ability…" (instructions as copy) | `differentiators` — six real reasons to engage |
| `services/PricingSection.tsx``EngagementModelsSection.tsx` | $59/mo SaaS tiers, "1 Gb workspace", "Download prototypes" | `engagementModels` — project / dedicated team / managed services, no published prices |
| `services/TestimonialsSection.tsx``DeliveryPrinciplesSection.tsx` | 12 invented client quotes about "our AI solutions" | `deliveryPrinciples` — how delivery stays predictable |
| `about/TeamSection.tsx` | Invented people: Alan Begham, Arthur Dowson "AI Programmer", "CEO Neuro" | `practiceTeams` — the disciplines that staff an engagement |
| `BlogSection.tsx` | AI-model / ML / AI-ethics posts, 2025 dates, dead `/blog/*` links | `resources` from `site-pages.ts`, linking to `/resources#id` |
| `PreFooterCTA.tsx` | "Elevate your business with our innovative solutions" | `ctaContent.preFooter` |
**Single-source wiring added:** `data/navigation.ts` and `siteConfig.footerLinks.services`
now derive from `services` / `solutions` / `industries` instead of restating them, so a
label only has to change in one place.
### Open content debt
1. **Unverified statistics.** Every figure in `companyStats` (`data/site-content.ts`)
is a placeholder inherited from the template build — 500K+ daily transactions,
270k engineering hours, 250+ projects, 15+ years. Each is flagged
`verified: false`. Replace with audited numbers or delete the counters; do not
ship them as-is.
2. **No named people or client quotes.** tenext.in publishes neither, so none were
invented. `practiceTeams` and `deliveryPrinciples` hold those slots. Add real
leadership profiles (with consent) and attributable testimonials when available.
3. **Team photography** in `practiceTeams` is still stock imagery.
4. **`since 2024`** in `Footer.tsx` is decorative and unconfirmed — check the real
founding year.
5. **Legal pages.** `siteConfig.legalLinks` still point at `#`.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB