Compare commits
54 Commits
updated-si
...
26e3d0975f
| Author | SHA1 | Date | |
|---|---|---|---|
| 26e3d0975f | |||
| 4e6d0a5512 | |||
| f0c68f549d | |||
| 2fade93bf7 | |||
| 33008c17f9 | |||
| 8e889d5e53 | |||
| 0530c9c943 | |||
| 8d40a10e02 | |||
| 985c4b5a85 | |||
| 755eea55a4 | |||
| 98f581b348 | |||
| 8f828a374c | |||
| 944066c42f | |||
| 45822f9af8 | |||
| 3d5417852c | |||
| 5c2714b202 | |||
| af917f3484 | |||
| 0658c1ce28 | |||
| ae6e2b020c | |||
| 7ba4ef1872 | |||
| b908926912 | |||
| 2044f7207e | |||
| 61ce1848d2 | |||
| db391c833a | |||
| 4f71f687d6 | |||
| 91e2f34a63 | |||
| 91081f2f9d | |||
| 78e74dfc7d | |||
| be8a2fe95d | |||
| 860a895e45 | |||
| 9949158d31 | |||
| 6188a7ffbc | |||
| 735f98f564 | |||
| 985f5c43ba | |||
| 25691d6a2e | |||
| 5baa62e86d | |||
| 6f3c946845 | |||
| b84b287dc1 | |||
| 54b3b73657 | |||
| b1f701e55d | |||
| d1c497c936 | |||
| 6d2a8c1a59 | |||
| feac643754 | |||
| af744bd192 | |||
| 2eb3e35cdb | |||
| 782e887ff8 | |||
| 9c14197f0c | |||
| b6bbf9b54d | |||
| e9c8d25eb6 | |||
| b19c24efc1 | |||
| d2281b9648 | |||
| 62192ab8fb | |||
| d93d3348f3 | |||
| 730dc51629 |
@ -17,7 +17,7 @@ const CallToActionSection: React.FC<CallToActionSectionProps> = ({
|
|||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
// Use primary background, primary-foreground for text
|
// Use primary background, primary-foreground for text
|
||||||
<section className="bg-primary text-primary-foreground py-16 md:py-20">
|
<section className="bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-primary-foreground py-16 md:py-20">
|
||||||
{" "}
|
{" "}
|
||||||
{/* Adjusted padding */}
|
{/* Adjusted padding */}
|
||||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
||||||
@ -30,7 +30,7 @@ const CallToActionSection: React.FC<CallToActionSectionProps> = ({
|
|||||||
</p>{" "}
|
</p>{" "}
|
||||||
{/* Slightly less emphasis */}
|
{/* Slightly less emphasis */}
|
||||||
{/* Button needs contrast on primary bg. Use a secondary/outline/custom variant */}
|
{/* Button needs contrast on primary bg. Use a secondary/outline/custom variant */}
|
||||||
<Button href={buttonHref} variant="secondary" size="lg">
|
<Button href={buttonHref} variant="black" size="lg" >
|
||||||
{/* Example: Using 'secondary' which uses light/dark gray bg defined in globals */}
|
{/* Example: Using 'secondary' which uses light/dark gray bg defined in globals */}
|
||||||
{/* OR custom class: className="bg-background text-foreground hover:bg-background/90" */}
|
{/* OR custom class: className="bg-background text-foreground hover:bg-background/90" */}
|
||||||
{buttonText}
|
{buttonText}
|
||||||
|
|||||||
@ -1,42 +1,87 @@
|
|||||||
// components/ClientLogosSection.tsx
|
"use client";
|
||||||
import React from "react";
|
|
||||||
|
import { useRef, useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
|
||||||
// Define structure for client data - focusing on logos now
|
|
||||||
type Client = {
|
type Client = {
|
||||||
name: string;
|
name: string;
|
||||||
logoUrl: string; // Expecting actual logo URLs now
|
logoUrl: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ClientLogosSectionProps = {
|
type ClientLogosSectionProps = {
|
||||||
title: string;
|
title: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
clients: Client[];
|
clients: Client[];
|
||||||
/** Control animation speed (lower number = faster). Default: 40s */
|
speed?: number; // pixels per frame
|
||||||
speed?: number;
|
|
||||||
/** Size of the square background container in pixels. Default: 120 */
|
|
||||||
squareSize?: number;
|
squareSize?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ClientLogosSection: React.FC<ClientLogosSectionProps> = ({
|
const ClientLogosSection = ({
|
||||||
title,
|
title,
|
||||||
description,
|
description,
|
||||||
clients = [], // Default to empty array
|
clients = [],
|
||||||
speed = 50, //Default speed in seconds for one full cycle
|
speed = 1,
|
||||||
squareSize = 120, // Default size for the square container (e.g., 120px)
|
squareSize = 120,
|
||||||
}) => {
|
}: ClientLogosSectionProps) => {
|
||||||
// Need at least one client to render the marquee
|
|
||||||
if (clients.length === 0) {
|
|
||||||
return null; // Or render a placeholder message if preferred
|
|
||||||
}
|
|
||||||
|
|
||||||
// Duplicate the clients for a seamless loop effect
|
|
||||||
const extendedClients = [...clients, ...clients];
|
const extendedClients = [...clients, ...clients];
|
||||||
|
const squareDim = `${squareSize}px`;
|
||||||
const squareDim = `${squareSize}px`; // Convert size to string for inline style
|
const padding = Math.round(squareSize / 6);
|
||||||
const padding = Math.round(squareSize / 6); // Calculate padding based on size (adjust divisor as needed)
|
|
||||||
const paddingDim = `${padding}px`;
|
const paddingDim = `${padding}px`;
|
||||||
|
|
||||||
|
const scrollRef = useRef<HTMLDivElement>(null);
|
||||||
|
const [direction, setDirection] = useState<"left" | "right">("left");
|
||||||
|
const [paused, setPaused] = useState(false);
|
||||||
|
let resumeTimeout: NodeJS.Timeout;
|
||||||
|
|
||||||
|
const pauseAndScroll = (dir: "left" | "right") => {
|
||||||
|
if (!scrollRef.current) return;
|
||||||
|
|
||||||
|
setPaused(true);
|
||||||
|
|
||||||
|
scrollRef.current.scrollBy({
|
||||||
|
left: dir === "left" ? -200 : 200,
|
||||||
|
behavior: "smooth",
|
||||||
|
});
|
||||||
|
|
||||||
|
clearTimeout(resumeTimeout);
|
||||||
|
resumeTimeout = setTimeout(() => {
|
||||||
|
setPaused(false);
|
||||||
|
}, 3000);
|
||||||
|
|
||||||
|
setDirection(dir === "left" ? "right" : "left");
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const container = scrollRef.current;
|
||||||
|
if (!container) return;
|
||||||
|
|
||||||
|
let animationFrame: number;
|
||||||
|
|
||||||
|
const step = () => {
|
||||||
|
if (!paused) {
|
||||||
|
if (direction === "left") {
|
||||||
|
container.scrollLeft += speed;
|
||||||
|
if (container.scrollLeft >= container.scrollWidth / 2) {
|
||||||
|
container.scrollLeft = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
container.scrollLeft -= speed;
|
||||||
|
if (container.scrollLeft <= 0) {
|
||||||
|
container.scrollLeft = container.scrollWidth / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
animationFrame = requestAnimationFrame(step);
|
||||||
|
};
|
||||||
|
|
||||||
|
animationFrame = requestAnimationFrame(step);
|
||||||
|
|
||||||
|
return () => cancelAnimationFrame(animationFrame);
|
||||||
|
}, [direction, paused, speed]);
|
||||||
|
|
||||||
|
// ✅ Safe early return after hooks
|
||||||
|
if (clients.length === 0) return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="py-16 md:py-20 bg-background overflow-hidden">
|
<section className="py-16 md:py-20 bg-background overflow-hidden">
|
||||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
||||||
@ -45,19 +90,17 @@ const ClientLogosSection: React.FC<ClientLogosSectionProps> = ({
|
|||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Marquee container - group allows pausing animation on hover */}
|
{/* Logos Container */}
|
||||||
<div className="relative w-full overflow-hidden group">
|
<div className="relative w-full overflow-hidden">
|
||||||
{/* Inner container that will animate */}
|
|
||||||
<div
|
<div
|
||||||
className="flex flex-nowrap animate-marquee-continuous"
|
ref={scrollRef}
|
||||||
style={{ animationDuration: `${speed}s` }}
|
className="flex flex-nowrap overflow-x-hidden scrollbar-hide"
|
||||||
>
|
>
|
||||||
{extendedClients.map((client, index) => (
|
{extendedClients.map((client, index) => (
|
||||||
<div
|
<div
|
||||||
key={`${client.name}-${index}`}
|
key={`${client.name}-${index}`}
|
||||||
className="flex-shrink-0 mx-12 md:mx-16 py-4"
|
className="flex-shrink-0 mx-12 md:mx-16 py-4"
|
||||||
>
|
>
|
||||||
{/* Square Background Container */}
|
|
||||||
<div
|
<div
|
||||||
title={client.name}
|
title={client.name}
|
||||||
className="
|
className="
|
||||||
@ -73,23 +116,35 @@ const ClientLogosSection: React.FC<ClientLogosSectionProps> = ({
|
|||||||
style={{
|
style={{
|
||||||
width: squareDim,
|
width: squareDim,
|
||||||
height: squareDim,
|
height: squareDim,
|
||||||
padding: paddingDim, // Add padding inside the square
|
padding: paddingDim,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Image
|
<Image
|
||||||
src={client.logoUrl}
|
src={client.logoUrl}
|
||||||
alt={`${client.name} Logo`}
|
alt={`${client.name} Logo`}
|
||||||
layout="fill" // Let image fill the relative container
|
fill
|
||||||
objectFit="contain" // Maintain aspect ratio within the container
|
style={{ objectFit: "contain" }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Optional: Add fade effect at the edges */}
|
{/* Arrow Controls */}
|
||||||
<div className="absolute inset-y-0 left-0 w-16 md:w-24 bg-gradient-to-r from-background to-transparent pointer-events-none z-10"></div>
|
<div className="flex justify-center mt-8 space-x-6">
|
||||||
<div className="absolute inset-y-0 right-0 w-16 md:w-24 bg-gradient-to-l from-background to-transparent pointer-events-none z-10"></div>
|
<button
|
||||||
|
onClick={() => pauseAndScroll("right")}
|
||||||
|
className="px-4 py-2 rounded-full bg-muted hover:bg-muted/70 transition"
|
||||||
|
>
|
||||||
|
←
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
onClick={() => pauseAndScroll("left")}
|
||||||
|
className="px-4 py-2 rounded-full bg-muted hover:bg-muted/70 transition"
|
||||||
|
>
|
||||||
|
→
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{description && (
|
{description && (
|
||||||
@ -103,6 +158,8 @@ const ClientLogosSection: React.FC<ClientLogosSectionProps> = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default ClientLogosSection;
|
||||||
|
|
||||||
export const defaultClients: Client[] = [
|
export const defaultClients: Client[] = [
|
||||||
{ name: "ABSA", logoUrl: "/images/absa.png" },
|
{ name: "ABSA", logoUrl: "/images/absa.png" },
|
||||||
{ name: "SYBRIN", logoUrl: "/images/sybrin.svg" },
|
{ name: "SYBRIN", logoUrl: "/images/sybrin.svg" },
|
||||||
@ -113,4 +170,4 @@ export const defaultClients: Client[] = [
|
|||||||
{ name: "TOYOTA", logoUrl: "/images/toyota-logo.png" },
|
{ name: "TOYOTA", logoUrl: "/images/toyota-logo.png" },
|
||||||
];
|
];
|
||||||
|
|
||||||
export default ClientLogosSection;
|
|
||||||
|
|||||||
@ -61,9 +61,9 @@ export const defaultCoreServices: ServiceItem[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: FaProjectDiagram,
|
icon: FaProjectDiagram,
|
||||||
title: "Project Management",
|
title: "IT Implementation",
|
||||||
description:
|
description:
|
||||||
"Expert management ensuring on-time, within-budget delivery with superior results, risk mitigation, and maximum efficiency.",
|
"Empowering your business through seamless IT rollouts—delivered on time and on budget. We turn complex systems into powerful solutions that drive transformation, reduce risk, and unlock real results. ",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: FaCode,
|
icon: FaCode,
|
||||||
|
|||||||
@ -16,15 +16,15 @@ const HeroSection: React.FC<HeroSectionProps> = ({
|
|||||||
title,
|
title,
|
||||||
subtitle,
|
subtitle,
|
||||||
buttonText,
|
buttonText,
|
||||||
buttonHref,
|
//buttonHref,
|
||||||
imageUrl = "/hero-bg.jpg", // Default background image
|
imageUrl = "/hero-bg-2.jpg", // Default background image
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<section className="relative h-[70vh] md:h-[85vh] flex items-center justify-center text-center bg-gradient-to-b from-black/10 to-black/40 text-white overflow-hidden">
|
<section className="relative h-[70vh] md:h-[85vh] flex items-center justify-center text-center text-white overflow-hidden">
|
||||||
{" "}
|
{" "}
|
||||||
{/* Adjusted background */}
|
{/* Adjusted background bg-gradient-to-b from-black/10 to-black/40*/}
|
||||||
{/* Background Image/Video */}
|
{/* Background Image/Video */}
|
||||||
<div className="absolute inset-0 z-0 opacity-40 dark:opacity-30">
|
<div className="absolute inset-0 z-0 opacity-100 dark:opacity-30">
|
||||||
{" "}
|
{" "}
|
||||||
{/* Adjusted opacity */}
|
{/* Adjusted opacity */}
|
||||||
{imageUrl && (
|
{imageUrl && (
|
||||||
@ -52,7 +52,7 @@ const HeroSection: React.FC<HeroSectionProps> = ({
|
|||||||
{subtitle}
|
{subtitle}
|
||||||
</p>
|
</p>
|
||||||
<Button
|
<Button
|
||||||
href={buttonHref}
|
href="/obse"
|
||||||
variant="primary" // Use primary variant defined in Button component
|
variant="primary" // Use primary variant defined in Button component
|
||||||
size="lg"
|
size="lg"
|
||||||
className="animate-fade-in-up animation-delay-600"
|
className="animate-fade-in-up animation-delay-600"
|
||||||
|
|||||||
@ -17,7 +17,7 @@ const HeroSectionDynamic: React.FC<HeroSectionProps> = ({
|
|||||||
subtitle,
|
subtitle,
|
||||||
buttonText,
|
buttonText,
|
||||||
buttonHref,
|
buttonHref,
|
||||||
imageUrl = "/hero-bg.jpg", // Ensure this high-quality image exists
|
imageUrl = "/hero-bg-2.jpg", // Ensure this high-quality image exists
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<section className="relative flex items-center bg-background min-h-screen overflow-hidden">
|
<section className="relative flex items-center bg-background min-h-screen overflow-hidden">
|
||||||
|
|||||||
@ -17,10 +17,11 @@ const HeroSectionModern: React.FC<HeroSectionProps> = ({
|
|||||||
subtitle,
|
subtitle,
|
||||||
buttonText,
|
buttonText,
|
||||||
buttonHref,
|
buttonHref,
|
||||||
imageUrl = "/hero-bg.jpg", // Default background image - MAKE SURE THIS EXISTS
|
imageUrl = "/hero-bg-2.jpg", // Default background image - MAKE SURE THIS EXISTS
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
// Use min-h-screen for full viewport height adjust if needed
|
// Use min-h-screen for full viewport height adjust if needed
|
||||||
|
//bg-[linear-gradient(to_right,#f0e18a,#f9f4c3,#ecd973)]
|
||||||
<section className="relative flex flex-col md:flex-row items-center bg-background min-h-[80vh] md:min-h-screen overflow-hidden">
|
<section className="relative flex flex-col md:flex-row items-center bg-background min-h-[80vh] md:min-h-screen overflow-hidden">
|
||||||
{/* Background Image/Video Layer */}
|
{/* Background Image/Video Layer */}
|
||||||
<div className="absolute inset-0 z-0">
|
<div className="absolute inset-0 z-0">
|
||||||
|
|||||||
@ -15,6 +15,8 @@ import {
|
|||||||
FaUserCheck,
|
FaUserCheck,
|
||||||
FaProjectDiagram,
|
FaProjectDiagram,
|
||||||
} from "react-icons/fa";
|
} from "react-icons/fa";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
|
||||||
|
|
||||||
// const leadershipTeam = [
|
// const leadershipTeam = [
|
||||||
// {
|
// {
|
||||||
@ -42,6 +44,23 @@ import {
|
|||||||
// linkedinUrl: "#",
|
// linkedinUrl: "#",
|
||||||
// },
|
// },
|
||||||
// ];
|
// ];
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "About Us | Owethu Managed Services (OMS)",
|
||||||
|
description: "Learn about OMS, our mission, vision, and the values that drive us to deliver exceptional IT solutions and services.",
|
||||||
|
keywords: [
|
||||||
|
"Owethu Managed Services",
|
||||||
|
"About OMS",
|
||||||
|
"OMS",
|
||||||
|
"Black-owned ",
|
||||||
|
"Women-owned",
|
||||||
|
"Tech company",
|
||||||
|
"bank statement reader",
|
||||||
|
"fintech solutions" ,
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const coreValues = [
|
const coreValues = [
|
||||||
{
|
{
|
||||||
@ -125,7 +144,8 @@ const industryExpertise = [
|
|||||||
{
|
{
|
||||||
icon: FaBriefcase,
|
icon: FaBriefcase,
|
||||||
industry: "Retail/E-commerce",
|
industry: "Retail/E-commerce",
|
||||||
details: "Describe experience in this sector.",
|
details:
|
||||||
|
"Experience in building scalable e-commerce platforms, optimizing digital customer journeys, enabling secure payment integrations, and leveraging data analytics to drive personalized shopping experiences and operational efficiency.",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -140,7 +160,7 @@ export default function AboutUsPage() {
|
|||||||
<div className="absolute inset-0 bg-black opacity-30 dark:opacity-50"></div>
|
<div className="absolute inset-0 bg-black opacity-30 dark:opacity-50"></div>
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 bg-cover bg-center opacity-10"
|
className="absolute inset-0 bg-cover bg-center opacity-10"
|
||||||
style={{ backgroundImage: "url('/path/to/abstract-tech-bg.jpg')" }}
|
style={{ backgroundImage: "url('/path/to/abstract-tech-bg.jpg')"}}
|
||||||
></div>{" "}
|
></div>{" "}
|
||||||
{/* Add a subtle background image */}
|
{/* Add a subtle background image */}
|
||||||
<div className="container mx-auto px-6 text-center relative z-10">
|
<div className="container mx-auto px-6 text-center relative z-10">
|
||||||
@ -191,7 +211,7 @@ export default function AboutUsPage() {
|
|||||||
<div className="relative h-64 md:h-80 rounded-lg overflow-hidden shadow-lg">
|
<div className="relative h-64 md:h-80 rounded-lg overflow-hidden shadow-lg">
|
||||||
{/* Replace with a relevant, high-quality image representing innovation or teamwork */}
|
{/* Replace with a relevant, high-quality image representing innovation or teamwork */}
|
||||||
<Image
|
<Image
|
||||||
src="/images/team.svg"
|
src="/about-2.jpg" // Ensure this image exists in your public folder
|
||||||
alt="Team collaborating on innovative solutions"
|
alt="Team collaborating on innovative solutions"
|
||||||
layout="fill"
|
layout="fill"
|
||||||
objectFit="cover"
|
objectFit="cover"
|
||||||
@ -241,7 +261,7 @@ export default function AboutUsPage() {
|
|||||||
style={{ color: "#e1c44a" }}
|
style={{ color: "#e1c44a" }}
|
||||||
/>
|
/>
|
||||||
<h3 className="text-2xl font-bold mb-4 font-poppins text-gray-900 dark:text-white">
|
<h3 className="text-2xl font-bold mb-4 font-poppins text-gray-900 dark:text-white">
|
||||||
Our Mission
|
Our Purpose
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-gray-700 dark:text-gray-300 leading-relaxed font-poppins flex-grow">
|
<p className="text-gray-700 dark:text-gray-300 leading-relaxed font-poppins flex-grow">
|
||||||
"Our purpose is to help our clients drive transformative
|
"Our purpose is to help our clients drive transformative
|
||||||
@ -299,10 +319,9 @@ export default function AboutUsPage() {
|
|||||||
Deep Domain Knowledge
|
Deep Domain Knowledge
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 leading-relaxed font-poppins">
|
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 leading-relaxed font-poppins">
|
||||||
Retail/E-commerce: Experience in building scalable e-commerce
|
We combine broad technological capabilities with specialized
|
||||||
platforms, optimizing digital customer journeys, enabling secure
|
expertise across key industries, understanding the unique
|
||||||
payment integrations, and leveraging data analytics to drive
|
challenges and opportunities within each sector.
|
||||||
personalized shopping experiences and operational efficiency.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="lg:col-span-2 grid grid-cols-1 md:grid-cols-2 gap-6">
|
<div className="lg:col-span-2 grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
@ -324,6 +343,7 @@ export default function AboutUsPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* Section 6: Technology Philosophy */}
|
{/* Section 6: Technology Philosophy */}
|
||||||
<section className="py-16 md:py-24 bg-gray-800 text-white">
|
<section className="py-16 md:py-24 bg-gray-800 text-white">
|
||||||
<div className="container mx-auto px-6 text-center">
|
<div className="container mx-auto px-6 text-center">
|
||||||
@ -378,6 +398,8 @@ export default function AboutUsPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
{/* Section 7: Core Values (Reusing previous structure, adjusting background) */}
|
{/* Section 7: Core Values (Reusing previous structure, adjusting background) */}
|
||||||
<section className="py-16 md:py-24 bg-gray-100 dark:bg-gray-800">
|
<section className="py-16 md:py-24 bg-gray-100 dark:bg-gray-800">
|
||||||
<div className="container mx-auto px-6">
|
<div className="container mx-auto px-6">
|
||||||
@ -405,6 +427,8 @@ export default function AboutUsPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
{/* Section 8: The OMS Partnership */}
|
{/* Section 8: The OMS Partnership */}
|
||||||
<section className="py-16 md:py-24 bg-white dark:bg-gray-900">
|
<section className="py-16 md:py-24 bg-white dark:bg-gray-900">
|
||||||
<div className="container mx-auto px-6">
|
<div className="container mx-auto px-6">
|
||||||
@ -506,7 +530,7 @@ export default function AboutUsPage() {
|
|||||||
*/}
|
*/}
|
||||||
{/* Section 10: Commitment to Impact (Optional, but adds value) */}
|
{/* Section 10: Commitment to Impact (Optional, but adds value) */}
|
||||||
<section
|
<section
|
||||||
className="py-16 md:py-24 bg-gold-500 text-gray-900 dark:bg-gold-600 dark:text-gray-900"
|
className="py-16 md:py-24 bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900 dark:bg-gold-600 dark:text-gray-900"
|
||||||
style={{ backgroundColor: "#e1c44a" }}
|
style={{ backgroundColor: "#e1c44a" }}
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-6 text-center">
|
<div className="container mx-auto px-6 text-center">
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import {
|
|||||||
import { COLORS } from "@/constants"; // Using COLORS constant
|
import { COLORS } from "@/constants"; // Using COLORS constant
|
||||||
import ContactForm from "@/components/ContactForm";
|
import ContactForm from "@/components/ContactForm";
|
||||||
|
|
||||||
|
|
||||||
// Define the structure for FAQ items
|
// Define the structure for FAQ items
|
||||||
interface FAQItem {
|
interface FAQItem {
|
||||||
id: number;
|
id: number;
|
||||||
@ -130,10 +131,10 @@ export default function ContactPage() {
|
|||||||
Phone
|
Phone
|
||||||
</h3>
|
</h3>
|
||||||
<a
|
<a
|
||||||
href="tel:+27120513282"
|
href="tel:+27684855721"
|
||||||
className="text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100 transition text-sm font-poppins"
|
className="text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100 transition text-sm font-poppins"
|
||||||
>
|
>
|
||||||
(012) 051 3282
|
+27 68 485 5721
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -244,7 +244,8 @@ export default function ObsePage() {
|
|||||||
className="text-3xl md:text-5xl lg:text-6xl font-bold mb-4 font-poppins drop-shadow-md leading-tight"
|
className="text-3xl md:text-5xl lg:text-6xl font-bold mb-4 font-poppins drop-shadow-md leading-tight"
|
||||||
style={{ color: COLORS.primary }}
|
style={{ color: COLORS.primary }}
|
||||||
>
|
>
|
||||||
Revolutionize Your Lending and Credit Processes with OBSE
|
Revolutionize Your Lending and <br />
|
||||||
|
Credit Processes with OBSE
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-lg md:text-xl max-w-4xl mx-auto leading-relaxed text-gray-200 dark:text-gray-300 mb-8">
|
<p className="text-lg md:text-xl max-w-4xl mx-auto leading-relaxed text-gray-200 dark:text-gray-300 mb-8">
|
||||||
Automate data extraction, enhance accuracy, detect fraud, and
|
Automate data extraction, enhance accuracy, detect fraud, and
|
||||||
@ -253,13 +254,14 @@ export default function ObsePage() {
|
|||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
||||||
<Link
|
<Link
|
||||||
href="#how-it-works" // Link to the "How it Works" section
|
href="https://youtu.be/Sd3TnvoLtDA?si=UOeXScbosM5LZxbg" // Link to the "How it Works" section
|
||||||
className="inline-flex items-center justify-center bg-gold-500 text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
className="inline-flex items-center justify-center bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
||||||
style={{ backgroundColor: COLORS.primary }}
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
<FaPlayCircle className="inline mr-2 text-red-400" /> See How It
|
<FaPlayCircle className="inline mr-2 text-red-400" /> See How It
|
||||||
Works
|
Works
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{/* Optional Mini-CTA */}
|
{/* Optional Mini-CTA */}
|
||||||
{/* <Link href="#overview-video" className="inline-flex items-center text-gold-400 hover:text-gold-300 transition-colors duration-300">
|
{/* <Link href="#overview-video" className="inline-flex items-center text-gold-400 hover:text-gold-300 transition-colors duration-300">
|
||||||
<FaPlayCircle className="mr-2" /> Watch a Quick Overview
|
<FaPlayCircle className="mr-2" /> Watch a Quick Overview
|
||||||
@ -321,7 +323,9 @@ export default function ObsePage() {
|
|||||||
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-1 hover:shadow-lg"
|
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-1 hover:shadow-lg"
|
||||||
>
|
>
|
||||||
<item.icon
|
<item.icon
|
||||||
className="text-4xl text-red-500 dark:text-red-400 mx-auto mb-4" // Using red to signify pain points
|
className="text-4xl 0 mx-auto mb-4"
|
||||||
|
style={{ color: "#e1c44a" }} // Using red to signify pain points
|
||||||
|
//text-red-500 dark:text-red-40
|
||||||
/>
|
/>
|
||||||
<h4 className="text-xl font-semibold mb-2 font-poppins dark:text-white">
|
<h4 className="text-xl font-semibold mb-2 font-poppins dark:text-white">
|
||||||
{item.title}
|
{item.title}
|
||||||
@ -467,11 +471,11 @@ export default function ObsePage() {
|
|||||||
className="relative bg-gray-50 dark:bg-gray-800 p-6 rounded-lg shadow-sm border-t-4 border-gold-500 dark:border-gold-400 transition-shadow hover:shadow-md"
|
className="relative bg-gray-50 dark:bg-gray-800 p-6 rounded-lg shadow-sm border-t-4 border-gold-500 dark:border-gold-400 transition-shadow hover:shadow-md"
|
||||||
style={{ borderColor: COLORS.primary }}
|
style={{ borderColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
{feature.isComingSoon && (
|
{/*feature.isComingSoon && (
|
||||||
<span className="absolute top-2 right-2 px-3 py-1 text-sm font-bold bg-cyan-700 text-white rounded-full shadow-lg z-10 font-poppins">
|
<span className="absolute top-2 right-2 px-3 py-1 text-sm font-bold bg-cyan-700 text-white rounded-full shadow-lg z-10 font-poppins">
|
||||||
Coming Soon
|
Coming Soon
|
||||||
</span>
|
</span>
|
||||||
)}
|
)*/}
|
||||||
<feature.icon
|
<feature.icon
|
||||||
className="text-3xl mb-3 text-gold-500 dark:text-gold-400"
|
className="text-3xl mb-3 text-gold-500 dark:text-gold-400"
|
||||||
style={{ color: COLORS.primary }}
|
style={{ color: COLORS.primary }}
|
||||||
@ -715,7 +719,7 @@ export default function ObsePage() {
|
|||||||
|
|
||||||
{/* 12. Call to Action (CTA) Section */}
|
{/* 12. Call to Action (CTA) Section */}
|
||||||
<section
|
<section
|
||||||
className="py-16 md:py-24 bg-gold-500 text-gray-900"
|
className="py-16 md:py-24 bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900"
|
||||||
style={{ backgroundColor: COLORS.primary }}
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-6 text-center">
|
<div className="container mx-auto px-6 text-center">
|
||||||
@ -729,13 +733,13 @@ export default function ObsePage() {
|
|||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
||||||
<Link
|
<Link
|
||||||
href="/contact?subject=OBSE Demo Request" // Pre-fill subject for contact form
|
href="/contact" // Pre-fill subject for contact form
|
||||||
className="inline-block bg-gray-800 text-white font-bold py-3 px-8 rounded-md hover:bg-gray-900 dark:bg-gray-900 dark:hover:bg-black transition-colors duration-300"
|
className="inline-block bg-gray-800 text-white font-bold py-3 px-8 rounded-md hover:bg-gray-900 dark:bg-gray-900 dark:hover:bg-black transition-colors duration-300"
|
||||||
>
|
>
|
||||||
Request a Personalized Demo
|
Request a Personalized Demo
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/contact?subject=OBSE Sales Inquiry" // Pre-fill subject
|
href="/contact" // Pre-fill subject
|
||||||
className="inline-block bg-transparent border-2 border-gray-800 text-gray-800 font-bold py-3 px-8 rounded-md hover:bg-gray-800 hover:text-white transition-colors duration-300"
|
className="inline-block bg-transparent border-2 border-gray-800 text-gray-800 font-bold py-3 px-8 rounded-md hover:bg-gray-800 hover:text-white transition-colors duration-300"
|
||||||
>
|
>
|
||||||
Contact Sales Team
|
Contact Sales Team
|
||||||
@ -798,10 +802,10 @@ export default function ObsePage() {
|
|||||||
Email
|
Email
|
||||||
</h3>
|
</h3>
|
||||||
<a
|
<a
|
||||||
href="mailto:Zanelem@oms.africa" // Updated email
|
href="mailto:hello@oms.africa" // Updated email //
|
||||||
className="text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100 transition text-sm"
|
className="text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100 transition text-sm"
|
||||||
>
|
>
|
||||||
Zanelem@oms.africa
|
hello@oms.africa
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
286
app/(website)/offerings/page.tsx
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
import Image from "next/image";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import {
|
||||||
|
FaArrowRight,
|
||||||
|
FaBriefcase,
|
||||||
|
FaCogs,
|
||||||
|
FaHandshake,
|
||||||
|
FaLaptopCode,
|
||||||
|
FaProjectDiagram,
|
||||||
|
FaUsers,
|
||||||
|
FaWrench,
|
||||||
|
FaShippingFast,
|
||||||
|
} from "react-icons/fa";
|
||||||
|
import { COLORS } from "@/constants"; // Assuming COLORS constant is available
|
||||||
|
|
||||||
|
// SEO Metadata
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "IT Services & Solutions | OMS South Africa",
|
||||||
|
description:
|
||||||
|
"Explore IT services by Owethu Managed Services (OMS): Custom Software Development, IT Resource Augmentation, and the OBSE Bank Statement Extractor. Partner with us for innovative solutions.",
|
||||||
|
keywords: [
|
||||||
|
"IT services South Africa",
|
||||||
|
"custom software development",
|
||||||
|
"IT resource augmentation",
|
||||||
|
"managed IT services",
|
||||||
|
"OBSE",
|
||||||
|
"bank statement automation",
|
||||||
|
"fintech solutions",
|
||||||
|
"IT consulting",
|
||||||
|
"OMS",
|
||||||
|
"CVEvolve",
|
||||||
|
"Owethu Managed Services",
|
||||||
|
"Centurion",
|
||||||
|
"Gauteng",
|
||||||
|
],
|
||||||
|
openGraph: {
|
||||||
|
title: "Comprehensive IT Services & Solutions | OMS South Africa",
|
||||||
|
description:
|
||||||
|
"OMS offers tailored IT solutions including custom development, resource augmentation, and specialized products like OBSE.",
|
||||||
|
url: "https://oms.africa/services", // Update with the final URL
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: "/images/oms-services-og.png", // Replace with an appropriate OG image URL
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: "OMS IT Services",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
locale: "en_ZA",
|
||||||
|
type: "website",
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
card: "summary_large_image",
|
||||||
|
title: "Comprehensive IT Services & Solutions | OMS South Africa",
|
||||||
|
description:
|
||||||
|
"Partner with OMS for expert IT services, from custom builds to resource scaling.",
|
||||||
|
// images: ['/images/oms-services-twitter.png'], // Replace if needed
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Data for Service Areas
|
||||||
|
const serviceAreas = [
|
||||||
|
{
|
||||||
|
title: "Custom Software Development & Consulting",
|
||||||
|
icon: FaLaptopCode,
|
||||||
|
description:
|
||||||
|
"We design, build, and implement bespoke software solutions tailored to your unique business challenges and objectives. Our consulting services help align technology with your strategic goals.",
|
||||||
|
imageUrl: "/custome-software-3.png", // Reusing image from Custom Software Development
|
||||||
|
//imageUrl: "/images/team.svg", // Reusing image from About
|
||||||
|
link: "/contact?subject=Custom Development Inquiry", // Link to contact or a future dedicated page
|
||||||
|
linkText: "Discuss Your Project",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "IT Resource Augmentation",
|
||||||
|
icon: FaUsers,
|
||||||
|
description:
|
||||||
|
"Scale your team effectively with our flexible resource augmentation model. Access skilled IT professionals (BAs, Testers, Developers, Designers) on demand or via managed milestone-based projects.",
|
||||||
|
imageUrl: "/images/team-collaborative-2.png", // Reusing image from Resource Augmentation
|
||||||
|
link: "/services/resource-augmentation",
|
||||||
|
linkText: "Explore Augmentation",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "OBSE - Bank Statement Extractor",
|
||||||
|
icon: FaShippingFast,
|
||||||
|
description:
|
||||||
|
"Automate bank statement processing with OBSE. Our intelligent OCR solution extracts data accurately and quickly, enhancing efficiency, reducing risk, and speeding up financial assessments.",
|
||||||
|
imageUrl: "/images/obse.svg", // Reusing image from OBSE
|
||||||
|
link: "/obse",
|
||||||
|
linkText: "Learn About OBSE",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const ourApproachItems = [
|
||||||
|
{
|
||||||
|
icon: FaProjectDiagram,
|
||||||
|
title: "Strategic Alignment",
|
||||||
|
description: "Understanding your goals to ensure solutions deliver value.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: FaHandshake,
|
||||||
|
title: "Client-Centric Collaboration",
|
||||||
|
description: "Working as true partners, involving you throughout.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: FaCogs,
|
||||||
|
title: "Agile & Adaptive Delivery",
|
||||||
|
description: "Flexible methodologies for faster, relevant results.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: FaWrench,
|
||||||
|
title: "Technical Excellence",
|
||||||
|
description: "Building robust, scalable, and maintainable solutions.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function ServicesPage() {
|
||||||
|
return (
|
||||||
|
<div className="bg-white text-gray-800 overflow-x-hidden dark:bg-gray-900 dark:text-gray-200 font-poppins">
|
||||||
|
{/* 1. Hero Section */}
|
||||||
|
<section className="relative bg-gradient-to-r from-gray-800 via-gray-700 to-gray-900 text-white py-20 md:py-32">
|
||||||
|
<div className="absolute inset-0 bg-black opacity-50 dark:opacity-70"></div>
|
||||||
|
<div className="container mx-auto px-6 text-center relative z-10">
|
||||||
|
<h1
|
||||||
|
className="text-3xl md:text-5xl lg:text-6xl font-bold mb-4 font-poppins drop-shadow-md"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
>
|
||||||
|
Tailored IT Services & Solutions
|
||||||
|
</h1>
|
||||||
|
<p className="text-lg md:text-xl max-w-4xl mx-auto leading-relaxed text-gray-200 dark:text-gray-300 mb-8">
|
||||||
|
Owethu Managed Services empowers businesses through innovative
|
||||||
|
technology solutions, strategic consulting, flexible resource
|
||||||
|
augmentation, and specialized product offerings.
|
||||||
|
</p>
|
||||||
|
<Link
|
||||||
|
href="#core-services"
|
||||||
|
className="inline-flex items-center justify-center bg-gold-500 text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
||||||
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
|
>
|
||||||
|
Explore Our Services <FaArrowRight className="ml-2" />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* 2. Core Service Areas Section */}
|
||||||
|
<section
|
||||||
|
id="core-services"
|
||||||
|
className="py-16 md:py-24 bg-white dark:bg-gray-900"
|
||||||
|
>
|
||||||
|
<div className="container mx-auto px-6">
|
||||||
|
<div className="text-center mb-12 md:mb-16">
|
||||||
|
<h2 className="text-3xl md:text-4xl font-bold font-poppins text-gray-900 dark:text-white mb-4">
|
||||||
|
Our Expertise, Your Advantage
|
||||||
|
</h2>
|
||||||
|
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 max-w-3xl mx-auto">
|
||||||
|
We offer a comprehensive suite of services designed to address
|
||||||
|
your specific IT needs and drive business growth.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||||
|
{serviceAreas.map((service) => (
|
||||||
|
<div
|
||||||
|
key={service.title}
|
||||||
|
className="flex flex-col bg-gray-50 dark:bg-gray-800 rounded-lg shadow-md overflow-hidden transform transition duration-300 hover:shadow-xl hover:-translate-y-1"
|
||||||
|
>
|
||||||
|
<div className="relative h-48 w-full">
|
||||||
|
<Image
|
||||||
|
src={service.imageUrl}
|
||||||
|
alt={`${service.title} illustration`}
|
||||||
|
layout="fill"
|
||||||
|
objectFit="contain" // Changed to contain for SVG/Illustrations
|
||||||
|
className="p-4 bg-gray-100 dark:bg-gray-700 z-10" // Added padding and bg
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="p-6 flex flex-col flex-grow">
|
||||||
|
<div className="flex items-center mb-3">
|
||||||
|
<service.icon
|
||||||
|
className="text-2xl mr-3 flex-shrink-0"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
/>
|
||||||
|
<h3 className="text-xl font-semibold font-poppins text-gray-900 dark:text-white">
|
||||||
|
{service.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<p className="text-gray-600 dark:text-gray-300 text-sm mb-4 flex-grow">
|
||||||
|
{service.description}
|
||||||
|
</p>
|
||||||
|
<Link
|
||||||
|
href={service.link}
|
||||||
|
className="inline-flex items-center mt-auto text-gold-600 dark:text-gold-400 hover:text-gold-700 dark:hover:text-gold-300 font-semibold transition-colors duration-300 text-sm"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
>
|
||||||
|
{service.linkText} <FaArrowRight className="ml-2" />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* 3. Our Approach Section */}
|
||||||
|
<section className="py-16 md:py-24 bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700">
|
||||||
|
<div className="container mx-auto px-6">
|
||||||
|
<div className="text-center mb-14">
|
||||||
|
<h2 className="text-3xl md:text-4xl font-bold font-poppins text-gray-900 dark:text-white mb-4">
|
||||||
|
How We Deliver Excellence
|
||||||
|
</h2>
|
||||||
|
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 max-w-3xl mx-auto font-poppins">
|
||||||
|
Our methodology ensures collaboration, precision, and impactful
|
||||||
|
results tailored to your project needs.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||||
|
{ourApproachItems.map((item) => (
|
||||||
|
<div
|
||||||
|
key={item.title}
|
||||||
|
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-2 hover:shadow-xl dark:hover:shadow-gold-500/20"
|
||||||
|
>
|
||||||
|
<item.icon
|
||||||
|
className="text-4xl text-gold-500 mx-auto mb-5"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
/>
|
||||||
|
<h4 className="text-xl font-semibold mb-3 font-poppins dark:text-white">
|
||||||
|
{item.title}
|
||||||
|
</h4>
|
||||||
|
<p className="text-gray-600 dark:text-gray-300 font-poppins text-sm leading-relaxed">
|
||||||
|
{item.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* 4. Industry Expertise Snippet (Optional) */}
|
||||||
|
<section className="py-16 md:py-24 bg-white dark:bg-gray-900">
|
||||||
|
<div className="container mx-auto px-6 text-center">
|
||||||
|
<FaBriefcase
|
||||||
|
className="text-5xl text-gold-500 mx-auto mb-4"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
/>
|
||||||
|
<h2 className="text-3xl md:text-4xl font-bold font-poppins text-gray-900 dark:text-white mb-4">
|
||||||
|
Serving Diverse Industries
|
||||||
|
</h2>
|
||||||
|
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 max-w-3xl mx-auto mb-8">
|
||||||
|
We apply our technical expertise across various sectors,
|
||||||
|
understanding the unique challenges and opportunities within each.
|
||||||
|
Key areas include Financial Services, Automotive, Technology, and
|
||||||
|
more.
|
||||||
|
</p>
|
||||||
|
<Link
|
||||||
|
href="/about#industry-expertise" // Assuming you add an ID to the section in about page
|
||||||
|
className="text-gold-600 dark:text-gold-400 hover:text-gold-700 dark:hover:text-gold-300 font-semibold transition-colors duration-300 inline-flex items-center"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
>
|
||||||
|
Learn More About Our Industry Focus{" "}
|
||||||
|
<FaArrowRight className="ml-2" />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* 5. Call to Action (CTA) Section */}
|
||||||
|
<section
|
||||||
|
className="py-16 md:py-24 bg-gold-500 text-gray-900"
|
||||||
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
|
>
|
||||||
|
<div className="container mx-auto px-6 text-center">
|
||||||
|
<h2 className="text-3xl md:text-4xl font-bold mb-4 font-poppins">
|
||||||
|
Let's Build Your Solution
|
||||||
|
</h2>
|
||||||
|
<p className="text-lg md:text-xl max-w-3xl mx-auto leading-relaxed mb-8 font-poppins text-gray-800">
|
||||||
|
Ready to discuss how OMS can help you achieve your technology goals?
|
||||||
|
Contact us today for a consultation.
|
||||||
|
</p>
|
||||||
|
<Link
|
||||||
|
href="/contact"
|
||||||
|
className="inline-block bg-gray-800 text-white font-bold py-3 px-8 rounded-md hover:bg-gray-900 dark:bg-gray-900 dark:hover:bg-black transition-colors duration-300"
|
||||||
|
>
|
||||||
|
Get in Touch
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -14,6 +14,7 @@ import FeaturedProductSection, {
|
|||||||
} from "./_components/FeaturedProductSection";
|
} from "./_components/FeaturedProductSection";
|
||||||
import { getHome } from "@/lib/query/home";
|
import { getHome } from "@/lib/query/home";
|
||||||
|
|
||||||
|
|
||||||
export default async function HomePage() {
|
export default async function HomePage() {
|
||||||
// Explicitly type the data variable, assuming getHome returns HeroSectionType or null/undefined
|
// Explicitly type the data variable, assuming getHome returns HeroSectionType or null/undefined
|
||||||
const data = await getHome();
|
const data = await getHome();
|
||||||
@ -39,9 +40,10 @@ export default async function HomePage() {
|
|||||||
buttonText={data.hero_buttons?.[0]?.label || "Learn More"} // Use optional chaining and provide a default
|
buttonText={data.hero_buttons?.[0]?.label || "Learn More"} // Use optional chaining and provide a default
|
||||||
buttonHref={data.hero_buttons?.[0]?.link || "/about"} // Use optional chaining and provide a default
|
buttonHref={data.hero_buttons?.[0]?.link || "/about"} // Use optional chaining and provide a default
|
||||||
imageUrl={
|
imageUrl={
|
||||||
data.hero_cover
|
// data.hero_cover
|
||||||
? `${process.env.DIRECTUS_API_ENDPOINT}/assets/${data.hero_cover}`
|
// ? `${process.env.DIRECTUS_API_ENDPOINT}/assets/${data.hero_cover}`
|
||||||
: "/hero-bg.jpg"
|
// : "/hero-bg-2.jpg"
|
||||||
|
"/banner-1.jpeg"
|
||||||
} // Use optional chaining and provide a default
|
} // Use optional chaining and provide a default
|
||||||
/>
|
/>
|
||||||
<CoreServicesSection
|
<CoreServicesSection
|
||||||
@ -61,7 +63,7 @@ export default async function HomePage() {
|
|||||||
description="Our advanced Optimized Bank Statement Extractor automates data aggregation, reduces errors, and provides deep financial insights."
|
description="Our advanced Optimized Bank Statement Extractor automates data aggregation, reduces errors, and provides deep financial insights."
|
||||||
features={defaultObseFeatures}
|
features={defaultObseFeatures}
|
||||||
buttonText="Learn More & Demo"
|
buttonText="Learn More & Demo"
|
||||||
buttonHref="/products/obse" // Link to the OBSE product page
|
buttonHref="/obse" // Link to the OBSE product page
|
||||||
imageUrl="/images/obse.svg" // **IMPORTANT: Create or find a relevant image**
|
imageUrl="/images/obse.svg" // **IMPORTANT: Create or find a relevant image**
|
||||||
imageAlt="OBSE Product Interface Mockup"
|
imageAlt="OBSE Product Interface Mockup"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -8,6 +8,7 @@ export const metadata: Metadata = {
|
|||||||
description:
|
description:
|
||||||
"Our recruitment portal is currently under development. Stay tuned for updates on career opportunities at Owethu Managed Services.",
|
"Our recruitment portal is currently under development. Stay tuned for updates on career opportunities at Owethu Managed Services.",
|
||||||
robots: "noindex, nofollow", // Prevent indexing of the coming soon page
|
robots: "noindex, nofollow", // Prevent indexing of the coming soon page
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function RecruitmentPortalPage() {
|
export default function RecruitmentPortalPage() {
|
||||||
|
|||||||
@ -25,6 +25,8 @@ export const metadata: Metadata = {
|
|||||||
"IT resource augmentation",
|
"IT resource augmentation",
|
||||||
"managed IT services",
|
"managed IT services",
|
||||||
"OBSE",
|
"OBSE",
|
||||||
|
"CVEvolve",
|
||||||
|
"bank statement extractor",
|
||||||
"bank statement automation",
|
"bank statement automation",
|
||||||
"fintech solutions",
|
"fintech solutions",
|
||||||
"IT consulting",
|
"IT consulting",
|
||||||
|
|||||||
@ -24,11 +24,11 @@ import {
|
|||||||
FaChartLine, // For Growth/Scalability
|
FaChartLine, // For Growth/Scalability
|
||||||
FaTasks, // For QA
|
FaTasks, // For QA
|
||||||
FaComments, // For Feedback
|
FaComments, // For Feedback
|
||||||
FaPhone,
|
//FaPhone,
|
||||||
FaEnvelope,
|
//FaEnvelope,
|
||||||
} from "react-icons/fa";
|
} from "react-icons/fa";
|
||||||
import { COLORS } from "@/constants";
|
import { COLORS } from "@/constants";
|
||||||
import ContactForm from "@/components/ContactForm";
|
//import ContactForm from "@/components/ContactForm";
|
||||||
|
|
||||||
// SEO Metadata
|
// SEO Metadata
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
@ -323,13 +323,13 @@ export default function ProductDevelopmentPage() {
|
|||||||
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
||||||
<Link
|
<Link
|
||||||
href="#how-we-deliver"
|
href="#how-we-deliver"
|
||||||
className="inline-flex items-center justify-center bg-gold-500 text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
className="inline-flex items-center justify-center bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
||||||
style={{ backgroundColor: COLORS.primary }}
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
How We Deliver
|
How We Deliver
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="#contact"
|
href="/contact"
|
||||||
className="inline-flex items-center text-gold-400 hover:text-gold-300 transition-colors duration-300"
|
className="inline-flex items-center text-gold-400 hover:text-gold-300 transition-colors duration-300"
|
||||||
style={{ color: COLORS.primary }}
|
style={{ color: COLORS.primary }}
|
||||||
>
|
>
|
||||||
@ -347,26 +347,24 @@ export default function ProductDevelopmentPage() {
|
|||||||
<div className="container mx-auto px-6">
|
<div className="container mx-auto px-6">
|
||||||
<SectionTitle>How OMS Delivers Market-Ready Products</SectionTitle>
|
<SectionTitle>How OMS Delivers Market-Ready Products</SectionTitle>
|
||||||
{/* No intro paragraph provided for this specific subtitle in the source */}
|
{/* No intro paragraph provided for this specific subtitle in the source */}
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-5xl mx-auto">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 max-w-5xl mx-auto">
|
||||||
{howOmsDeliversItems.map((item) => (
|
{howOmsDeliversItems.map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.title}
|
key={item.title}
|
||||||
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md flex items-start space-x-4"
|
className="bg-white dark:bg-gray-700 p-4 rounded-lg shadow-md"
|
||||||
>
|
>
|
||||||
{item.icon && (
|
{item.icon && (
|
||||||
<item.icon
|
<item.icon
|
||||||
className="text-3xl text-gold-500 dark:text-gold-400 mt-1 flex-shrink-0"
|
className="text-3xl mb-3"
|
||||||
style={{ color: COLORS.primary }}
|
style={{ color: COLORS.primary }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<div>
|
<h4 className="text-lg font-semibold mb-2 font-poppins dark:text-white">
|
||||||
<h4 className="text-lg font-semibold mb-1 font-poppins dark:text-white">
|
{item.title}
|
||||||
{item.title}
|
</h4>
|
||||||
</h4>
|
<p className="text-gray-600 dark:text-gray-300 text-sm leading-relaxed">
|
||||||
<p className="text-gray-600 dark:text-gray-300 text-sm leading-relaxed">
|
{item.description}
|
||||||
{item.description}
|
</p>
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
@ -384,7 +382,28 @@ export default function ProductDevelopmentPage() {
|
|||||||
designed and built to meet your current needs, but is also ready for
|
designed and built to meet your current needs, but is also ready for
|
||||||
future growth and evolution.
|
future growth and evolution.
|
||||||
</SectionParagraph>
|
</SectionParagraph>
|
||||||
<FeatureGrid items={endToEndItems} />
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 max-w-5xl mx-auto">
|
||||||
|
{endToEndItems.map((item) => (
|
||||||
|
<div
|
||||||
|
key={item.title}
|
||||||
|
className="bg-white dark:bg-gray-700 p-4 rounded-lg shadow-md"
|
||||||
|
>
|
||||||
|
{item.icon && (
|
||||||
|
<item.icon
|
||||||
|
className="text-3xl mb-3"
|
||||||
|
style={{ color: COLORS.primary }}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<h4 className="text-lg font-semibold mb-2 font-poppins dark:text-white">
|
||||||
|
{item.title}
|
||||||
|
</h4>
|
||||||
|
<p className="text-gray-600 dark:text-gray-300 text-sm leading-relaxed">
|
||||||
|
{item.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
{/* <FeatureGrid items={endToEndItems} /> */}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@ -492,7 +511,7 @@ export default function ProductDevelopmentPage() {
|
|||||||
|
|
||||||
{/* 10. Call to Action (CTA) Section */}
|
{/* 10. Call to Action (CTA) Section */}
|
||||||
<section
|
<section
|
||||||
className="py-16 md:py-24 bg-gold-500 text-gray-900"
|
className="py-16 md:py-24 bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900"
|
||||||
style={{ backgroundColor: COLORS.primary }}
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-6 text-center">
|
<div className="container mx-auto px-6 text-center">
|
||||||
@ -506,13 +525,13 @@ export default function ProductDevelopmentPage() {
|
|||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
||||||
<Link
|
<Link
|
||||||
href="/contact?subject=Product Development Inquiry" // Pre-fill subject
|
href="/contact" // Pre-fill subject
|
||||||
className="inline-block bg-gray-800 text-white font-bold py-3 px-8 rounded-md hover:bg-gray-900 dark:bg-gray-900 dark:hover:bg-black transition-colors duration-300"
|
className="inline-block bg-gray-800 text-white font-bold py-3 px-8 rounded-md hover:bg-gray-900 dark:bg-gray-900 dark:hover:bg-black transition-colors duration-300"
|
||||||
>
|
>
|
||||||
Request a Consultation
|
Request a Consultation
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="#contact" // Link to contact section below
|
href="/contact" // Link to contact section below
|
||||||
className="inline-block bg-transparent border-2 border-gray-800 text-gray-800 font-bold py-3 px-8 rounded-md hover:bg-gray-800 hover:text-white transition-colors duration-300"
|
className="inline-block bg-transparent border-2 border-gray-800 text-gray-800 font-bold py-3 px-8 rounded-md hover:bg-gray-800 hover:text-white transition-colors duration-300"
|
||||||
>
|
>
|
||||||
Contact Us
|
Contact Us
|
||||||
@ -522,7 +541,7 @@ export default function ProductDevelopmentPage() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* 11. Contact Information Section */}
|
{/* 11. Contact Information Section */}
|
||||||
<section
|
{/* <section
|
||||||
id="contact"
|
id="contact"
|
||||||
className="py-16 md:py-24 bg-gray-100 dark:bg-gray-800"
|
className="py-16 md:py-24 bg-gray-100 dark:bg-gray-800"
|
||||||
>
|
>
|
||||||
@ -537,7 +556,7 @@ export default function ProductDevelopmentPage() {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="max-w-4xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-8 items-start">
|
<div className="max-w-4xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-8 items-start">
|
||||||
{/* Contact Details */}
|
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div className="flex items-center space-x-4">
|
<div className="flex items-center space-x-4">
|
||||||
<FaPhone
|
<FaPhone
|
||||||
@ -582,7 +601,7 @@ export default function ProductDevelopmentPage() {
|
|||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Contact Form */}
|
|
||||||
<div className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md">
|
<div className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md">
|
||||||
<h3 className="text-xl font-semibold font-poppins text-gray-900 dark:text-white mb-4">
|
<h3 className="text-xl font-semibold font-poppins text-gray-900 dark:text-white mb-4">
|
||||||
Send Us Your Inquiry
|
Send Us Your Inquiry
|
||||||
@ -591,7 +610,9 @@ export default function ProductDevelopmentPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section> */}
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import Link from "next/link";
|
|||||||
import { Metadata } from "next";
|
import { Metadata } from "next";
|
||||||
import {
|
import {
|
||||||
FaArrowRight,
|
FaArrowRight,
|
||||||
FaBriefcase,
|
|
||||||
FaCheckCircle,
|
FaCheckCircle,
|
||||||
FaClipboardList, // For BA
|
FaClipboardList, // For BA
|
||||||
FaClock, // For Time & Material
|
FaClock, // For Time & Material
|
||||||
@ -13,15 +12,12 @@ import {
|
|||||||
FaPaintBrush, // For UX/UI Design
|
FaPaintBrush, // For UX/UI Design
|
||||||
FaProjectDiagram, // For Architecture/Milestones
|
FaProjectDiagram, // For Architecture/Milestones
|
||||||
FaPuzzlePiece, // For Integration/Solutions
|
FaPuzzlePiece, // For Integration/Solutions
|
||||||
FaRegHandshake, // For Partnership/Client Relations
|
|
||||||
FaShieldAlt, // For Reliability/QA
|
FaShieldAlt, // For Reliability/QA
|
||||||
FaSitemap, // For Process/Architecture
|
FaSitemap, // For Process/Architecture
|
||||||
FaSyncAlt, // For Agile/Flexibility
|
FaSyncAlt, // For Agile/Flexibility
|
||||||
FaTasks, // For Project Management/Milestones
|
FaTasks, // For Project Management/Milestones
|
||||||
FaVial, // For Testing
|
FaVial, // For Testing
|
||||||
FaUsers, // For Teams/Resources
|
|
||||||
FaChartLine, // For Reporting/MI
|
FaChartLine, // For Reporting/MI
|
||||||
FaLightbulb, // For Innovation/Solutions
|
|
||||||
FaTools, // General Capabilities
|
FaTools, // General Capabilities
|
||||||
FaLayerGroup, // Frameworks (SAFe, etc.)
|
FaLayerGroup, // Frameworks (SAFe, etc.)
|
||||||
FaFileInvoiceDollar, // Cost/Pricing
|
FaFileInvoiceDollar, // Cost/Pricing
|
||||||
@ -295,62 +291,62 @@ const capabilities: Capability[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
interface Benefit {
|
// interface Benefit {
|
||||||
icon: React.ElementType;
|
// icon: React.ElementType;
|
||||||
title: string;
|
// title: string;
|
||||||
description: string;
|
// description: string;
|
||||||
}
|
// }
|
||||||
|
|
||||||
const augmentationBenefits: Benefit[] = [
|
// const augmentationBenefits: Benefit[] = [
|
||||||
{
|
// {
|
||||||
icon: FaSyncAlt,
|
// icon: FaSyncAlt,
|
||||||
title: "Ultimate Flexibility",
|
// title: "Ultimate Flexibility",
|
||||||
description:
|
// description:
|
||||||
"Scale your team up or down quickly based on project demands and budget.",
|
// "Scale your team up or down quickly based on project demands and budget.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaUsers,
|
// icon: FaUsers,
|
||||||
title: "Access to Expertise",
|
// title: "Access to Expertise",
|
||||||
description:
|
// description:
|
||||||
"Gain immediate access to specialized IT skills that may not be available in-house.",
|
// "Gain immediate access to specialized IT skills that may not be available in-house.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaFileInvoiceDollar,
|
// icon: FaFileInvoiceDollar,
|
||||||
title: "Cost-Effectiveness",
|
// title: "Cost-Effectiveness",
|
||||||
description:
|
// description:
|
||||||
"Reduce recruitment costs, overheads, and long-term commitments associated with FTEs.",
|
// "Reduce recruitment costs, overheads, and long-term commitments associated with FTEs.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaChartLine,
|
// icon: FaChartLine,
|
||||||
title: "Increased Productivity",
|
// title: "Increased Productivity",
|
||||||
description:
|
// description:
|
||||||
"Focus your core team on strategic initiatives while OMS resources handle specific tasks or projects.",
|
// "Focus your core team on strategic initiatives while OMS resources handle specific tasks or projects.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaShieldAlt,
|
// icon: FaShieldAlt,
|
||||||
title: "Reduced Hiring Burden",
|
// title: "Reduced Hiring Burden",
|
||||||
description:
|
// description:
|
||||||
"Avoid the time-consuming process of sourcing, vetting, hiring, and onboarding new employees.",
|
// "Avoid the time-consuming process of sourcing, vetting, hiring, and onboarding new employees.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaTasks,
|
// icon: FaTasks,
|
||||||
title: "Focus on Core Business",
|
// title: "Focus on Core Business",
|
||||||
description:
|
// description:
|
||||||
"Outsource IT project execution or specific roles, allowing you to concentrate on your primary objectives.",
|
// "Outsource IT project execution or specific roles, allowing you to concentrate on your primary objectives.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaCheckCircle,
|
// icon: FaCheckCircle,
|
||||||
title: "Quality Assurance",
|
// title: "Quality Assurance",
|
||||||
description:
|
// description:
|
||||||
"Benefit from experienced professionals and managed delivery (in Milestone model) for high-quality outcomes.",
|
// "Benefit from experienced professionals and managed delivery (in Milestone model) for high-quality outcomes.",
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
icon: FaLightbulb,
|
// icon: FaLightbulb,
|
||||||
title: "Faster Project Delivery",
|
// title: "Faster Project Delivery",
|
||||||
description:
|
// description:
|
||||||
"Accelerate project timelines by quickly filling skill gaps and adding capacity.",
|
// "Accelerate project timelines by quickly filling skill gaps and adding capacity.",
|
||||||
},
|
// },
|
||||||
];
|
// ];
|
||||||
|
|
||||||
const methodologies = [
|
const methodologies = [
|
||||||
{ name: "Agile (SCRUM)", icon: FaSyncAlt },
|
{ name: "Agile (SCRUM)", icon: FaSyncAlt },
|
||||||
@ -380,11 +376,11 @@ export default function ResourceAugmentationPage() {
|
|||||||
{/* Consider adding OMS Logo here if desired */}
|
{/* Consider adding OMS Logo here if desired */}
|
||||||
{/* <Image src="/oms-logo-white.png" alt="OMS Logo" width={150} height={50} className="mx-auto mb-6" /> */}
|
{/* <Image src="/oms-logo-white.png" alt="OMS Logo" width={150} height={50} className="mx-auto mb-6" /> */}
|
||||||
<h1
|
<h1
|
||||||
className="text-3xl md:text-5xl lg:text-6xl font-bold mb-4 font-poppins drop-shadow-md leading-tight"
|
|
||||||
|
className="text-3xl md:text-5xl lg:text-6xl font-bold mb-4 font-poppins drop-shadow-md leading-<1.5>"
|
||||||
style={{ color: COLORS.primary }} // Use gold color
|
style={{ color: COLORS.primary }} // Use gold color
|
||||||
>
|
>
|
||||||
Flexible IT Resource <br />
|
Flexible IT Resource <br />Augmentation & Managed Services
|
||||||
Augmentation & Managed Services
|
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-lg md:text-xl max-w-4xl mx-auto leading-relaxed text-gray-200 dark:text-gray-300 mb-8">
|
<p className="text-lg md:text-xl max-w-4xl mx-auto leading-relaxed text-gray-200 dark:text-gray-300 mb-8">
|
||||||
Scale your IT capabilities effectively with Owethu Managed Services.
|
Scale your IT capabilities effectively with Owethu Managed Services.
|
||||||
@ -394,7 +390,7 @@ export default function ResourceAugmentationPage() {
|
|||||||
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
<div className="flex flex-col sm:flex-row justify-center items-center gap-4">
|
||||||
<Link
|
<Link
|
||||||
href="#service-models" // Link to the service models section
|
href="#service-models" // Link to the service models section
|
||||||
className="inline-flex items-center justify-center bg-gold-500 text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
className="inline-flex items-center justify-center bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900 font-bold py-3 px-8 rounded-md hover:bg-gold-600 transition-colors duration-300"
|
||||||
style={{ backgroundColor: COLORS.primary }}
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
Explore Our Models <FaArrowRight className="ml-2" />
|
Explore Our Models <FaArrowRight className="ml-2" />
|
||||||
@ -423,28 +419,29 @@ export default function ResourceAugmentationPage() {
|
|||||||
businesses today.
|
businesses today.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-8 items-stretch">
|
||||||
{[
|
{[
|
||||||
{
|
{
|
||||||
icon: FaPuzzlePiece,
|
icon: FaPuzzlePiece,
|
||||||
title: "Skill Gaps",
|
title: "Access Specialised Expertise",
|
||||||
desc: "Struggling to find specialized IT talent for specific project needs or new technologies.",
|
desc: "Get experienced professionals in software development, business analysis, cybersecurity, cloud computing, data science, and more — bringing the right skills to your project, exactly when you need them.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: FaChartLine,
|
icon: FaChartLine,
|
||||||
title: "Fluctuating Demand",
|
title: "Flexibility & Scalability",
|
||||||
desc: "Need to scale development or testing teams quickly for peak periods without long-term overhead.",
|
desc: "Easily scale your team in response to changing project needs — expanding or reducing resources without long-term obligations, while maintaining agility and control.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: FaClock,
|
icon: FaClock,
|
||||||
title: "Project Delays",
|
title: "Faster Onboarding & Deployment",
|
||||||
desc: "Lack of internal resources causing bottlenecks and delaying critical project timelines.",
|
desc: "Our experts are project-ready, helping you accelerate delivery timelines and reduce the overhead typically associated with recruitment and training.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: FaFileInvoiceDollar,
|
icon: FaFileInvoiceDollar,
|
||||||
title: "Cost Control",
|
title: "Cost-Effective Hiring",
|
||||||
desc: "Wanting to manage IT personnel costs effectively, avoiding expensive recruitment and full-time hires.",
|
desc: "Maximize impact, minimize overhead — allowing you to scale your team according to project needs while managing costs efficiently and without compromising on quality. .",
|
||||||
},
|
},
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
icon: FaBriefcase,
|
icon: FaBriefcase,
|
||||||
title: "Focus on Core Business",
|
title: "Focus on Core Business",
|
||||||
@ -454,14 +451,16 @@ export default function ResourceAugmentationPage() {
|
|||||||
icon: FaSyncAlt,
|
icon: FaSyncAlt,
|
||||||
title: "Need for Flexibility",
|
title: "Need for Flexibility",
|
||||||
desc: "Requiring adaptable staffing solutions that can change as project requirements evolve.",
|
desc: "Requiring adaptable staffing solutions that can change as project requirements evolve.",
|
||||||
},
|
},*/
|
||||||
].map((item) => (
|
].map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.title}
|
key={item.title}
|
||||||
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-1 hover:shadow-lg"
|
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-1 hover:shadow-lgflex flex-col h-full"
|
||||||
>
|
>
|
||||||
<item.icon
|
<item.icon
|
||||||
className="text-4xl text-red-500 dark:text-red-400 mx-auto mb-4" // Using red to signify challenges/needs
|
className="text-4xl mx-auto mb-4"
|
||||||
|
// Using red to signify challenges/needs
|
||||||
|
style={{ color: COLORS.primary }} // Use gold color
|
||||||
/>
|
/>
|
||||||
<h4 className="text-xl font-semibold mb-2 font-poppins dark:text-white">
|
<h4 className="text-xl font-semibold mb-2 font-poppins dark:text-white">
|
||||||
{item.title}
|
{item.title}
|
||||||
@ -640,45 +639,46 @@ export default function ResourceAugmentationPage() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* 6. Benefits of Partnering with OMS Section */}
|
{/* 6. Benefits of Partnering with OMS Section */}
|
||||||
<section className="py-16 md:py-24 bg-gray-50 dark:bg-gray-800">
|
{/* Benefits of Resource Augmentation
|
||||||
<div className="container mx-auto px-6">
|
<section className="py-16 md:py-24 bg-gray-50 dark:bg-gray-800">
|
||||||
<div className="text-center mb-12 md:mb-16">
|
<div className="container mx-auto px-6">
|
||||||
<FaRegHandshake
|
<div className="text-center mb-12 md:mb-16">
|
||||||
className="text-5xl mx-auto mb-4"
|
<FaRegHandshake
|
||||||
style={{ color: COLORS.primary }}
|
className="text-5xl mx-auto mb-4"
|
||||||
/>
|
style={{ color: COLORS.primary }}
|
||||||
<h2 className="text-3xl md:text-4xl font-bold font-poppins text-gray-900 dark:text-white mb-4">
|
/>
|
||||||
Why Choose OMS for Resource Augmentation?
|
<h2 className="text-3xl md:text-4xl font-bold font-poppins text-gray-900 dark:text-white mb-4">
|
||||||
</h2>
|
Why Choose OMS for Resource Augmentation?
|
||||||
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 max-w-3xl mx-auto">
|
</h2>
|
||||||
Leverage our expertise and flexible models to gain a competitive
|
<p className="text-md md:text-lg text-gray-700 dark:text-gray-300 max-w-3xl mx-auto">
|
||||||
advantage.
|
Leverage our expertise and flexible models to gain a competitive
|
||||||
</p>
|
advantage.
|
||||||
</div>
|
</p>
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
|
</div>
|
||||||
{augmentationBenefits.map((benefit) => (
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||||
<div
|
{augmentationBenefits.map((benefit) => (
|
||||||
key={benefit.title}
|
<div
|
||||||
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-1 hover:shadow-lg"
|
key={benefit.title}
|
||||||
>
|
className="bg-white dark:bg-gray-700 p-6 rounded-lg shadow-md text-center transform transition duration-300 hover:-translate-y-1 hover:shadow-lg"
|
||||||
<benefit.icon
|
>
|
||||||
className="text-4xl mx-auto mb-4"
|
<benefit.icon
|
||||||
style={{ color: COLORS.primary }}
|
className="text-4xl mx-auto mb-4"
|
||||||
/>
|
style={{ color: COLORS.primary }}
|
||||||
<h4 className="text-lg font-semibold mb-2 font-poppins dark:text-white">
|
/>
|
||||||
{benefit.title}
|
<h4 className="text-lg font-semibold mb-2 font-poppins dark:text-white">
|
||||||
</h4>
|
{benefit.title}
|
||||||
<p className="text-gray-600 dark:text-gray-300 text-sm leading-relaxed">
|
</h4>
|
||||||
{benefit.description}
|
<p className="text-gray-600 dark:text-gray-300 text-sm leading-relaxed">
|
||||||
</p>
|
{benefit.description}
|
||||||
</div>
|
</p>
|
||||||
))}
|
</div>
|
||||||
</div>
|
))}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
|
</section>
|
||||||
|
*/}
|
||||||
{/* 7. Proven Experience / Past Projects (High Level) */}
|
{/* 7. Proven Experience / Past Projects (High Level) */}
|
||||||
<section className="py-16 md:py-24 bg-white dark:bg-gray-900">
|
<section className="py-16 md:py-24 bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700">
|
||||||
<div className="container mx-auto px-6">
|
<div className="container mx-auto px-6">
|
||||||
<div className="text-center mb-12 md:mb-16">
|
<div className="text-center mb-12 md:mb-16">
|
||||||
<FaBusinessTime
|
<FaBusinessTime
|
||||||
@ -807,7 +807,7 @@ export default function ResourceAugmentationPage() {
|
|||||||
|
|
||||||
{/* 10. Call to Action (CTA) Section */}
|
{/* 10. Call to Action (CTA) Section */}
|
||||||
<section
|
<section
|
||||||
className="py-16 md:py-24 bg-gold-500 text-gray-900"
|
className="py-16 md:py-24 bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-gray-900"
|
||||||
style={{ backgroundColor: COLORS.primary }}
|
style={{ backgroundColor: COLORS.primary }}
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-6 text-center">
|
<div className="container mx-auto px-6 text-center">
|
||||||
|
|||||||
@ -11,6 +11,7 @@ export const metadata: Metadata = {
|
|||||||
alternates: {
|
alternates: {
|
||||||
canonical: "/tech-talk",
|
canonical: "/tech-talk",
|
||||||
},
|
},
|
||||||
|
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title: "OMS TechTalk | Insights & Innovation",
|
title: "OMS TechTalk | Insights & Innovation",
|
||||||
description: "Stay updated with tech insights from OMS.",
|
description: "Stay updated with tech insights from OMS.",
|
||||||
@ -50,7 +51,7 @@ const TechTalkPage = async () => {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
{/* Blog Post Grid */}
|
{/* Blog Post Grid */}
|
||||||
{posts.length > 0 ? (
|
{false && posts.length > 0 ? (
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8 md:gap-10">
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8 md:gap-10">
|
||||||
{posts.map((post: Post) => (
|
{posts.map((post: Post) => (
|
||||||
<BlogPostCard
|
<BlogPostCard
|
||||||
|
|||||||
@ -12,7 +12,7 @@ interface ExtendedVacancy extends Vacancy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function getVacancy(slug: string): Promise<ExtendedVacancy | null> {
|
async function getVacancy(slug: string): Promise<ExtendedVacancy | null> {
|
||||||
const res = await fetch(`http://localhost:3000/api/vacancies/${slug}`, {
|
const res = await fetch(`${process.env.WEBSITE_URL}/api/vacancies/${slug}`, {
|
||||||
cache: "no-store",
|
cache: "no-store",
|
||||||
});
|
});
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
|
|||||||
@ -208,18 +208,16 @@
|
|||||||
} /* Added longer delay */
|
} /* Added longer delay */
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes fadeInUp {
|
|
||||||
from {
|
@keyframes marquee {
|
||||||
opacity: 0;
|
from { transform: translateX(0); }
|
||||||
transform: translateY(20px);
|
to { transform: translateX(-50%); }
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.animate-fade-in-up {
|
.animate-marquee-continuous {
|
||||||
animation: fadeInUp 0.8s ease-out forwards;
|
animation: marquee linear infinite;
|
||||||
opacity: 0; /* Start hidden */
|
}
|
||||||
|
|
||||||
|
.paused {
|
||||||
|
animation-play-state: paused !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,8 +3,8 @@ import { Poppins } from "next/font/google";
|
|||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
import Header from "@/components/Header";
|
import Header from "@/components/Header";
|
||||||
import Footer from "@/components/Footer";
|
import Footer from "@/components/Footer";
|
||||||
import ChatbotWidget from "@/components/ChatbotWidget";
|
|
||||||
import { ThemeProvider } from "@/providers/theme-provider";
|
import { ThemeProvider } from "@/providers/theme-provider";
|
||||||
|
import Script from "next/script";
|
||||||
|
|
||||||
const poppins = Poppins({
|
const poppins = Poppins({
|
||||||
subsets: ["latin"],
|
subsets: ["latin"],
|
||||||
@ -20,6 +20,7 @@ export const metadata: Metadata = {
|
|||||||
"Owethu Managed Services (OMS) provides expert IT solutions in Centurion & South Africa, including resource augmentation, project management, custom software development, and the OBSE financial analysis tool.", // Include Keywords, Location, USP
|
"Owethu Managed Services (OMS) provides expert IT solutions in Centurion & South Africa, including resource augmentation, project management, custom software development, and the OBSE financial analysis tool.", // Include Keywords, Location, USP
|
||||||
keywords: [
|
keywords: [
|
||||||
"Owethu Managed Services",
|
"Owethu Managed Services",
|
||||||
|
"OMS",
|
||||||
"OBSE",
|
"OBSE",
|
||||||
"IT solutions South Africa",
|
"IT solutions South Africa",
|
||||||
"resource augmentation",
|
"resource augmentation",
|
||||||
@ -28,6 +29,7 @@ export const metadata: Metadata = {
|
|||||||
"OBSE",
|
"OBSE",
|
||||||
"financial data analysis",
|
"financial data analysis",
|
||||||
"IT services Centurion",
|
"IT services Centurion",
|
||||||
|
"digital transformation",
|
||||||
], // Add relevant keywords
|
], // Add relevant keywords
|
||||||
alternates: {
|
alternates: {
|
||||||
canonical: "/", // Assuming this is the root URL
|
canonical: "/", // Assuming this is the root URL
|
||||||
@ -95,8 +97,15 @@ export default function RootLayout({
|
|||||||
<Header />
|
<Header />
|
||||||
<main>{children}</main>
|
<main>{children}</main>
|
||||||
<Footer />
|
<Footer />
|
||||||
<ChatbotWidget />
|
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
|
<Script
|
||||||
|
src="https://umami.obse.africa/script.js"
|
||||||
|
data-website-id={
|
||||||
|
process.env.NEXT_PUBLIC_UMAMI_WEB_ID ||
|
||||||
|
"d9f0e4d7-0f0a-45e4-91bf-62e0e65e25d2"
|
||||||
|
}
|
||||||
|
strategy="afterInteractive"
|
||||||
|
/>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,22 +0,0 @@
|
|||||||
// components/ChatbotWidget.tsx
|
|
||||||
import React from "react";
|
|
||||||
import { FaComments } from "react-icons/fa";
|
|
||||||
|
|
||||||
const ChatbotWidget = () => {
|
|
||||||
// TODO: Implement actual chat functionality (e.g., integrate a service)
|
|
||||||
// const handleChatOpen = () => {
|
|
||||||
// alert("Chatbot functionality to be implemented!");
|
|
||||||
// };
|
|
||||||
|
|
||||||
return (
|
|
||||||
<button
|
|
||||||
// onClick={handleChatOpen}
|
|
||||||
className="fixed bottom-6 right-6 bg-primary text-dark p-4 rounded-full shadow-lg hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 transition-all duration-300 z-50"
|
|
||||||
aria-label="Open Chat"
|
|
||||||
>
|
|
||||||
<FaComments size={24} />
|
|
||||||
</button>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default ChatbotWidget;
|
|
||||||
@ -1,9 +1,10 @@
|
|||||||
// components/Footer.tsx
|
// components/Footer.tsx
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { FaLinkedin, FaInstagram } from "react-icons/fa";
|
import { FaLinkedin, FaInstagram, FaYoutube } from "react-icons/fa";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
|
||||||
|
|
||||||
const omsLogoUrl = "/oms-logo.svg"; // Ensure this exists in /public
|
const omsLogoUrl = "/oms-logo.svg"; // Ensure this exists in /public
|
||||||
// const omsLogoDarkUrl = "/oms-logo-dark.svg"; // Optional dark mode logo
|
// const omsLogoDarkUrl = "/oms-logo-dark.svg"; // Optional dark mode logo
|
||||||
|
|
||||||
@ -69,7 +70,7 @@ const Footer = () => {
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<Link
|
<Link
|
||||||
href="/services"
|
href="/services/resource-augmentation"
|
||||||
className="text-sm text-[var(--oms-white)]/80 hover:text-primary transition-colors"
|
className="text-sm text-[var(--oms-white)]/80 hover:text-primary transition-colors"
|
||||||
>
|
>
|
||||||
Services
|
Services
|
||||||
@ -77,20 +78,20 @@ const Footer = () => {
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<Link
|
<Link
|
||||||
href="/products"
|
href="/obse"
|
||||||
className="text-sm text-[var(--oms-white)]/80 hover:text-primary transition-colors"
|
className="text-sm text-[var(--oms-white)]/80 hover:text-primary transition-colors"
|
||||||
>
|
>
|
||||||
Products
|
Products
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
{/* <li>
|
||||||
<Link
|
<Link
|
||||||
href="/join-us"
|
href="/join-us"
|
||||||
className="text-sm text-[var(--oms-white)]/80 hover:text-primary transition-colors"
|
className="text-sm text-[var(--oms-white)]/80 hover:text-primary transition-colors"
|
||||||
>
|
>
|
||||||
Join Our Team
|
Join Our Team
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li> */}
|
||||||
<li>
|
<li>
|
||||||
<Link
|
<Link
|
||||||
href="/contact"
|
href="/contact"
|
||||||
@ -106,16 +107,16 @@ const Footer = () => {
|
|||||||
<div>
|
<div>
|
||||||
<h5 className="text-lg font-semibold mb-4 text-primary">Contact</h5>
|
<h5 className="text-lg font-semibold mb-4 text-primary">Contact</h5>
|
||||||
<address className="text-sm text-[var(--oms-white)]/80 mb-2 not-italic">
|
<address className="text-sm text-[var(--oms-white)]/80 mb-2 not-italic">
|
||||||
Unit 10 B Centuria Park
|
265 Von Willich Avenue
|
||||||
<br />
|
<br />
|
||||||
265 Von Willich Avenue
|
Die Hoewes, Centurion, 0159
|
||||||
<br />
|
<br />
|
||||||
Die Hoewes, Centurion, 0159
|
(Unit 10 B Centuria Park)
|
||||||
</address>
|
</address>
|
||||||
<p className="text-sm text-[var(--oms-white)]/80 mb-2">
|
<p className="text-sm text-[var(--oms-white)]/80 mb-2">
|
||||||
Phone:{" "}
|
Phone:{" "}
|
||||||
<a href="tel:+27120513282" className="hover:text-primary">
|
<a href="tel:+27684855721" className="hover:text-primary">
|
||||||
(012) 051 3282
|
+27 68 485 5721
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
<p className="text-sm text-[var(--oms-white)]/80 mb-2">
|
<p className="text-sm text-[var(--oms-white)]/80 mb-2">
|
||||||
@ -127,7 +128,7 @@ const Footer = () => {
|
|||||||
{/* Social Icons - Use muted bright color, primary on hover */}
|
{/* Social Icons - Use muted bright color, primary on hover */}
|
||||||
<div className="flex space-x-4 mt-4">
|
<div className="flex space-x-4 mt-4">
|
||||||
<a
|
<a
|
||||||
href="https://linkedin.com"
|
href="https://www.linkedin.com/company/owethu-managed-services-oms"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-[var(--oms-white)]/70 hover:text-primary transition-colors"
|
className="text-[var(--oms-white)]/70 hover:text-primary transition-colors"
|
||||||
@ -135,8 +136,9 @@ const Footer = () => {
|
|||||||
>
|
>
|
||||||
<FaLinkedin size={24} />
|
<FaLinkedin size={24} />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
href="https://instagram.com"
|
href="https://www.instagram.com/owethumanagedservices_oms"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-[var(--oms-white)]/70 hover:text-primary transition-colors"
|
className="text-[var(--oms-white)]/70 hover:text-primary transition-colors"
|
||||||
@ -144,6 +146,17 @@ const Footer = () => {
|
|||||||
>
|
>
|
||||||
<FaInstagram size={24} />
|
<FaInstagram size={24} />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="https://www.youtube.com/@OwethuManagedServices-africa"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-[var(--oms-white)]/70 hover:text-primary transition-colors"
|
||||||
|
aria-label="YouTube"
|
||||||
|
>
|
||||||
|
<FaYoutube size={24} />
|
||||||
|
</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -157,40 +170,39 @@ const Footer = () => {
|
|||||||
</p>
|
</p>
|
||||||
<form className="flex flex-col sm:flex-row gap-2">
|
<form className="flex flex-col sm:flex-row gap-2">
|
||||||
{/* Input needs dark background styles */}
|
{/* Input needs dark background styles */}
|
||||||
<div className="relative">
|
<div className="relative max-w-md mx-auto w-full">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
placeholder="Enter your email"
|
placeholder="Enter your email"
|
||||||
aria-label="Email for newsletter"
|
aria-label="Email for newsletter"
|
||||||
className="
|
className="
|
||||||
w-full
|
w-full
|
||||||
pr-24
|
pr-24
|
||||||
|
px-4 py-2
|
||||||
px-4 py-2
|
rounded-lg
|
||||||
rounded-lg
|
bg-[var(--dark-input)]
|
||||||
bg-[var(--dark-input)]
|
border border-[var(--dark-border)]
|
||||||
border border-[var(--dark-border)]
|
text-[var(--dark-foreground)]
|
||||||
text-[var(--dark-foreground)]
|
placeholder:text-[var(--dark-muted-foreground)]
|
||||||
placeholder:text-[var(--dark-muted-foreground)]
|
focus:outline-none focus:ring-2 focus:ring-ring
|
||||||
focus:outline-none focus:ring-2 focus:ring-ring
|
focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]
|
||||||
focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]
|
"
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="
|
className="
|
||||||
absolute top-0 right-0
|
absolute top-0 right-0
|
||||||
h-full
|
h-full
|
||||||
px-4
|
px-4
|
||||||
rounded-r-lg
|
rounded-r-lg
|
||||||
bg-primary
|
bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)]
|
||||||
text-primary-foreground
|
text-primary-foreground
|
||||||
font-semibold
|
font-semibold
|
||||||
hover:bg-opacity-90
|
hover:bg-opacity-90
|
||||||
transition-colors
|
transition-colors
|
||||||
focus:outline-none focus:ring-2 focus:ring-ring
|
focus:outline-none focus:ring-2 focus:ring-ring
|
||||||
focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]
|
focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
Subscribe
|
Subscribe
|
||||||
</button>
|
</button>
|
||||||
@ -217,19 +229,29 @@ const Footer = () => {
|
|||||||
</p>
|
</p>
|
||||||
<div className="flex space-x-4">
|
<div className="flex space-x-4">
|
||||||
{/* Links still hover to primary */}
|
{/* Links still hover to primary */}
|
||||||
<Link
|
|
||||||
|
{/* <Link
|
||||||
href="/privacy-policy"
|
href="/privacy-policy"
|
||||||
className="hover:text-primary transition-colors"
|
className="hover:text-primary transition-colors"
|
||||||
>
|
>
|
||||||
Privacy Policy
|
Privacy Policy
|
||||||
</Link>
|
</Link> */}
|
||||||
<Link
|
|
||||||
href="/paia-popia"
|
|
||||||
|
<a
|
||||||
|
href="/Privacy-Policy/Recruitment-Privacy-Policy.pdf"
|
||||||
|
className="hover:text-primary transition-colors"
|
||||||
|
>
|
||||||
|
Privacy Policy
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/Privacy-Policy/Data-Privacy-Statement-for-Candidates.pdf"
|
||||||
className="hover:text-primary transition-colors"
|
className="hover:text-primary transition-colors"
|
||||||
>
|
>
|
||||||
PAIA & POPIA
|
PAIA & POPIA
|
||||||
</Link>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
@ -237,3 +259,4 @@ const Footer = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default Footer;
|
export default Footer;
|
||||||
|
//Data-Privacy-Statement-for-Candidates
|
||||||
|
|||||||
@ -8,15 +8,12 @@ import { usePathname } from "next/navigation"; // Import usePathname
|
|||||||
import {
|
import {
|
||||||
FiChevronDown,
|
FiChevronDown,
|
||||||
FiClipboard,
|
FiClipboard,
|
||||||
FiArrowRight,
|
|
||||||
FiMenu,
|
FiMenu,
|
||||||
FiX,
|
FiX,
|
||||||
FiUsers,
|
FiUsers,
|
||||||
FiBriefcase,
|
|
||||||
FiCpu,
|
FiCpu,
|
||||||
FiBox,
|
FiBox,
|
||||||
FiFileText,
|
FiLayers
|
||||||
FiUserCheck,
|
|
||||||
} from "react-icons/fi";
|
} from "react-icons/fi";
|
||||||
import ThemeToggle from "./ThemeToggle";
|
import ThemeToggle from "./ThemeToggle";
|
||||||
|
|
||||||
@ -44,7 +41,7 @@ const HeaderClient = () => {
|
|||||||
|
|
||||||
const [servicesDropdownOpen, setServicesDropdownOpen] = useState(false);
|
const [servicesDropdownOpen, setServicesDropdownOpen] = useState(false);
|
||||||
const [productsDropdownOpen, setProductsDropdownOpen] = useState(false);
|
const [productsDropdownOpen, setProductsDropdownOpen] = useState(false);
|
||||||
const [joinUsDropdownOpen, setJoinUsDropdownOpen] = useState(false);
|
//const [joinUsDropdownOpen, setJoinUsDropdownOpen] = useState(false);
|
||||||
|
|
||||||
const handleServicesMouseEnter = () => setServicesDropdownOpen(true);
|
const handleServicesMouseEnter = () => setServicesDropdownOpen(true);
|
||||||
const handleServicesMouseLeave = () => setServicesDropdownOpen(false);
|
const handleServicesMouseLeave = () => setServicesDropdownOpen(false);
|
||||||
@ -52,8 +49,8 @@ const HeaderClient = () => {
|
|||||||
const handleProductsMouseEnter = () => setProductsDropdownOpen(true);
|
const handleProductsMouseEnter = () => setProductsDropdownOpen(true);
|
||||||
const handleProductsMouseLeave = () => setProductsDropdownOpen(false);
|
const handleProductsMouseLeave = () => setProductsDropdownOpen(false);
|
||||||
|
|
||||||
const handleJoinUsMouseEnter = () => setJoinUsDropdownOpen(true);
|
// const handleJoinUsMouseEnter = () => setJoinUsDropdownOpen(true);
|
||||||
const handleJoinUsMouseLeave = () => setJoinUsDropdownOpen(false);
|
// const handleJoinUsMouseLeave = () => setJoinUsDropdownOpen(false);
|
||||||
|
|
||||||
const pathname = usePathname(); // Get current path
|
const pathname = usePathname(); // Get current path
|
||||||
|
|
||||||
@ -152,8 +149,8 @@ const HeaderClient = () => {
|
|||||||
<div className="hidden md:flex items-center space-x-4">
|
<div className="hidden md:flex items-center space-x-4">
|
||||||
<ThemeToggle />
|
<ThemeToggle />
|
||||||
<Link
|
<Link
|
||||||
href="/request-demo"
|
href="/contact"
|
||||||
className="flex items-center text-sm font-medium bg-primary text-primary-foreground px-3 py-1.5 rounded-lg hover:bg-opacity-90 transition-colors"
|
className="flex items-center text-sm font-medium bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-primary-foreground px-3 py-1.5 rounded-lg hover:bg-opacity-90 transition-colors"
|
||||||
title="Request a Demo"
|
title="Request a Demo"
|
||||||
>
|
>
|
||||||
<FiClipboard className="w-4 h-4 mr-1.5" />
|
<FiClipboard className="w-4 h-4 mr-1.5" />
|
||||||
@ -181,7 +178,7 @@ const HeaderClient = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Secondary Row w/ Mega Menus */}
|
{/* Secondary Row w/ Mega Menus */}
|
||||||
<div className="bg-primary relative">
|
<div className="bg-[linear-gradient(to_right,#dec750,#f0de7e,#e1c44a)] relative">
|
||||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
<div className="hidden md:flex justify-between items-center h-12">
|
<div className="hidden md:flex justify-between items-center h-12">
|
||||||
{/* Wrap nav and link in a flex container */}
|
{/* Wrap nav and link in a flex container */}
|
||||||
@ -217,7 +214,7 @@ const HeaderClient = () => {
|
|||||||
`}
|
`}
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
||||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-6">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 max-w-xl">
|
||||||
<Link
|
<Link
|
||||||
href="/services/resource-augmentation"
|
href="/services/resource-augmentation"
|
||||||
className={`${megaMenuItemClasses} ${
|
className={`${megaMenuItemClasses} ${
|
||||||
@ -233,6 +230,7 @@ const HeaderClient = () => {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
{/* Add more service links here
|
||||||
<Link
|
<Link
|
||||||
href="/services/project-management"
|
href="/services/project-management"
|
||||||
className={`${megaMenuItemClasses} ${
|
className={`${megaMenuItemClasses} ${
|
||||||
@ -248,6 +246,7 @@ const HeaderClient = () => {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
*/}
|
||||||
<Link
|
<Link
|
||||||
href="/services/product-development"
|
href="/services/product-development"
|
||||||
className={`${megaMenuItemClasses} ${
|
className={`${megaMenuItemClasses} ${
|
||||||
@ -267,15 +266,16 @@ const HeaderClient = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Products */}
|
{/* Products */}
|
||||||
<div
|
<div
|
||||||
className={`group ${isActive("/obse") ? "active" : ""}`} // Add active class to group
|
className={`group ${isActive("/products") ? "active" : ""}`} // Add active class to group
|
||||||
onMouseEnter={handleProductsMouseEnter}
|
onMouseEnter={handleProductsMouseEnter}
|
||||||
onMouseLeave={handleProductsMouseLeave}
|
onMouseLeave={handleProductsMouseLeave}
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
className={`${megaMenuTriggerClasses} ${
|
className={`${megaMenuTriggerClasses} ${
|
||||||
isActive("/obse") ? "after:w-full" : ""
|
isActive("/products") ? "after:w-full" : ""
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{" "}
|
{" "}
|
||||||
@ -285,7 +285,7 @@ const HeaderClient = () => {
|
|||||||
</button>
|
</button>
|
||||||
<div
|
<div
|
||||||
className={`
|
className={`
|
||||||
absolute left-0 top-full w-full shadow-lg z-1000
|
absolute left-0 top-full w-full shadow-lg z-40
|
||||||
bg-card border-x border-b border-border rounded-b-lg
|
bg-card border-x border-b border-border rounded-b-lg
|
||||||
opacity-0 invisible translate-y-[-10px]
|
opacity-0 invisible translate-y-[-10px]
|
||||||
${
|
${
|
||||||
@ -297,7 +297,7 @@ const HeaderClient = () => {
|
|||||||
`}
|
`}
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
||||||
<div className="max-w-md">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 max-w-xl">
|
||||||
<Link
|
<Link
|
||||||
href="/obse"
|
href="/obse"
|
||||||
className={`${megaMenuItemClasses} ${
|
className={`${megaMenuItemClasses} ${
|
||||||
@ -309,7 +309,44 @@ const HeaderClient = () => {
|
|||||||
<FiBox className={megaMenuIconClasses} />
|
<FiBox className={megaMenuIconClasses} />
|
||||||
<div className={megaMenuTextWrapperClasses}>
|
<div className={megaMenuTextWrapperClasses}>
|
||||||
<p className={megaMenuTitleClasses}>
|
<p className={megaMenuTitleClasses}>
|
||||||
|
|
||||||
OBSE Platform
|
OBSE Platform
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
{/* Add more service links here
|
||||||
|
<Link
|
||||||
|
href="/services/project-management"
|
||||||
|
className={`${megaMenuItemClasses} ${
|
||||||
|
isActive("/services/project-management")
|
||||||
|
? "text-primary"
|
||||||
|
: ""
|
||||||
|
}`} // Apply active class
|
||||||
|
>
|
||||||
|
<FiBriefcase className={megaMenuIconClasses} />
|
||||||
|
<div className={megaMenuTextWrapperClasses}>
|
||||||
|
<p className={megaMenuTitleClasses}>
|
||||||
|
Project Management
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
*/}
|
||||||
|
<Link
|
||||||
|
href="https://cvevolve.com/"
|
||||||
|
target="_blank"
|
||||||
|
className={`${megaMenuItemClasses} ${
|
||||||
|
isActive("/obse") ? "text-primary" : ""
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{" "}
|
||||||
|
{/* Apply active class */}
|
||||||
|
<FiLayers className={megaMenuIconClasses} />
|
||||||
|
<div className={megaMenuTextWrapperClasses}>
|
||||||
|
<p className={megaMenuTitleClasses}>
|
||||||
|
|
||||||
|
CVEvolve
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
@ -317,84 +354,55 @@ const HeaderClient = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{/* Join Our Team */}
|
{/* Join Our Team */}
|
||||||
<div
|
|
||||||
className={`group ${
|
|
||||||
isActive("/join-us") ||
|
{/* <div
|
||||||
isActive("/vacancies") ||
|
className={`group ${isActive("/offerings") ? "active" : ""}`}
|
||||||
isActive("/portal")
|
onMouseEnter={handleOfferingsMouseEnter}
|
||||||
? "active"
|
onMouseLeave={handleOfferingsMouseLeave}
|
||||||
: ""
|
|
||||||
}`} // Add active class to group (check all related paths)
|
|
||||||
onMouseEnter={handleJoinUsMouseEnter}
|
|
||||||
onMouseLeave={handleJoinUsMouseLeave}
|
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
className={`${megaMenuTriggerClasses} ${
|
className={`${megaMenuTriggerClasses} ${
|
||||||
isActive("/join-us") ||
|
isActive("/offerings") ? "after:w-full" : ""
|
||||||
isActive("/vacancies") ||
|
|
||||||
isActive("/portal")
|
|
||||||
? "after:w-full"
|
|
||||||
: ""
|
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{" "}
|
Explore Our Offerings
|
||||||
{/* Apply underline based on active state */}
|
|
||||||
Join Our Team
|
|
||||||
<FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
|
<FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
|
||||||
</button>
|
</button>
|
||||||
<div
|
<div
|
||||||
className={`
|
className={`
|
||||||
absolute left-0 top-full w-full shadow-lg z-1000
|
absolute left-0 top-full w-full shadow-lg z-1000
|
||||||
bg-card border-x border-b border-border rounded-b-lg
|
bg-card border-x border-b border-border rounded-b-lg
|
||||||
opacity-0 invisible translate-y-[-10px]
|
opacity-0 invisible translate-y-[-10px]
|
||||||
${
|
${offeringsDropdownOpen ? "opacity-100 visible translate-y-0" : ""}
|
||||||
joinUsDropdownOpen
|
transition-all duration-300 ease-out transform
|
||||||
? "opacity-100 visible translate-y-0"
|
`}
|
||||||
: ""
|
|
||||||
}
|
|
||||||
transition-all duration-300 ease-out transform
|
|
||||||
`}
|
|
||||||
>
|
>
|
||||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 max-w-xl">
|
<div className="max-w-md">
|
||||||
<Link
|
<Link
|
||||||
href="/vacancies"
|
href="/offerings"
|
||||||
className={`${megaMenuItemClasses} ${
|
className={`${megaMenuItemClasses} ${
|
||||||
isActive("/vacancies") ? "text-primary" : ""
|
isActive("/offerings") ? "text-primary" : ""
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{" "}
|
<FiBox className={megaMenuIconClasses} />
|
||||||
{/* Apply active class */}
|
|
||||||
<FiFileText className={megaMenuIconClasses} />
|
|
||||||
<div className={megaMenuTextWrapperClasses}>
|
<div className={megaMenuTextWrapperClasses}>
|
||||||
<p className={megaMenuTitleClasses}>
|
<p className={megaMenuTitleClasses}>
|
||||||
Current Vacancies
|
Our Offerings
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</Link>
|
|
||||||
<Link
|
|
||||||
href="/portal"
|
|
||||||
className={`${megaMenuItemClasses} ${
|
|
||||||
isActive("/portal") ? "text-primary" : ""
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{" "}
|
|
||||||
{/* Apply active class */}
|
|
||||||
<FiUserCheck className={megaMenuIconClasses} />
|
|
||||||
<div className={megaMenuTextWrapperClasses}>
|
|
||||||
<p className={megaMenuTitleClasses}>
|
|
||||||
Recruitment Portal
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> */}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
{/* ← Here’s the Explore Our Offerings link, back in its original spot */}
|
{/* ← Here’s the Explore Our Offerings link, back in its original spot
|
||||||
<Link
|
<Link
|
||||||
href="/services" // Assuming this link goes to the main services page
|
href="/services" // Assuming this link goes to the main services page
|
||||||
className={`flex items-center text-sm font-medium hover:opacity-80 transition-opacity group ${
|
className={`flex items-center text-sm font-medium hover:opacity-80 transition-opacity group ${
|
||||||
@ -406,6 +414,7 @@ const HeaderClient = () => {
|
|||||||
Explore Our Offerings
|
Explore Our Offerings
|
||||||
<FiArrowRight className="w-4 h-4 ml-1.5 transition-transform duration-200 group-hover:translate-x-1" />
|
<FiArrowRight className="w-4 h-4 ml-1.5 transition-transform duration-200 group-hover:translate-x-1" />
|
||||||
</Link>
|
</Link>
|
||||||
|
*/}
|
||||||
</div>{" "}
|
</div>{" "}
|
||||||
{/* Close the new flex container */}
|
{/* Close the new flex container */}
|
||||||
</div>
|
</div>
|
||||||
@ -424,10 +433,16 @@ const HeaderClient = () => {
|
|||||||
<nav className="container mx-auto px-4 sm:px-6 lg:px-8 flex flex-col space-y-1 text-foreground">
|
<nav className="container mx-auto px-4 sm:px-6 lg:px-8 flex flex-col space-y-1 text-foreground">
|
||||||
<DropdownLink href="/" onClick={handleMobileLinkClick}>
|
<DropdownLink href="/" onClick={handleMobileLinkClick}>
|
||||||
Home
|
Home
|
||||||
|
</DropdownLink>
|
||||||
|
<DropdownLink href="/tech-talk" onClick={handleMobileLinkClick}>
|
||||||
|
Tech Talk
|
||||||
</DropdownLink>
|
</DropdownLink>
|
||||||
<DropdownLink href="/about" onClick={handleMobileLinkClick}>
|
<DropdownLink href="/about" onClick={handleMobileLinkClick}>
|
||||||
About Us
|
About Us
|
||||||
</DropdownLink>
|
</DropdownLink>
|
||||||
|
<DropdownLink href="/contact" onClick={handleMobileLinkClick}>
|
||||||
|
Contact Us
|
||||||
|
</DropdownLink>
|
||||||
<span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
<span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
||||||
Services
|
Services
|
||||||
</span>
|
</span>
|
||||||
@ -437,25 +452,26 @@ const HeaderClient = () => {
|
|||||||
>
|
>
|
||||||
Resource Augmentation
|
Resource Augmentation
|
||||||
</DropdownLink>
|
</DropdownLink>
|
||||||
<DropdownLink
|
|
||||||
href="/services/project-management"
|
|
||||||
onClick={handleMobileLinkClick}
|
|
||||||
>
|
|
||||||
Project Management
|
|
||||||
</DropdownLink>
|
|
||||||
<DropdownLink
|
<DropdownLink
|
||||||
href="/services/product-development"
|
href="/services/product-development"
|
||||||
onClick={handleMobileLinkClick}
|
onClick={handleMobileLinkClick}
|
||||||
>
|
>
|
||||||
Product Development
|
Product Development
|
||||||
</DropdownLink>
|
</DropdownLink>
|
||||||
|
|
||||||
<span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
<span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
||||||
Products
|
Products
|
||||||
</span>
|
</span>
|
||||||
<DropdownLink href="/obse" onClick={handleMobileLinkClick}>
|
<DropdownLink href="/obse" onClick={handleMobileLinkClick}>
|
||||||
OBSE
|
OBSE
|
||||||
</DropdownLink>
|
</DropdownLink>
|
||||||
<span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
|
||||||
|
{/* small screen investigation */}
|
||||||
|
<DropdownLink href="https://cvevolve.com" onClick={handleMobileLinkClick}>
|
||||||
|
CVEvolve
|
||||||
|
</DropdownLink>
|
||||||
|
|
||||||
|
{/* <span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
||||||
Join Us
|
Join Us
|
||||||
</span>
|
</span>
|
||||||
<DropdownLink href="/vacancies" onClick={handleMobileLinkClick}>
|
<DropdownLink href="/vacancies" onClick={handleMobileLinkClick}>
|
||||||
@ -463,20 +479,27 @@ const HeaderClient = () => {
|
|||||||
</DropdownLink>
|
</DropdownLink>
|
||||||
<DropdownLink href="/portal" onClick={handleMobileLinkClick}>
|
<DropdownLink href="/portal" onClick={handleMobileLinkClick}>
|
||||||
Recruitment Portal
|
Recruitment Portal
|
||||||
</DropdownLink>
|
</DropdownLink> */}
|
||||||
<DropdownLink href="/contact" onClick={handleMobileLinkClick}>
|
|
||||||
Contact Us
|
{/*
|
||||||
</DropdownLink>
|
<span className="pt-3 pb-1 text-xs uppercase text-muted-foreground">
|
||||||
|
Explore Our Offerings
|
||||||
|
</span>
|
||||||
|
<DropdownLink href="/offerings" onClick={handleMobileLinkClick}>
|
||||||
|
Our Offerings
|
||||||
|
</DropdownLink> */}
|
||||||
|
|
||||||
<div className="pt-4">
|
<div className="pt-4">
|
||||||
<Link
|
<Link
|
||||||
href="/request-demo"
|
href="/contact"
|
||||||
onClick={handleMobileLinkClick}
|
onClick={handleMobileLinkClick}
|
||||||
className="flex w-full justify-center items-center text-sm font-medium bg-primary text-primary-foreground px-4 py-2 rounded-lg hover:bg-opacity-90 transition-colors"
|
className="flex w-full justify-center items-center text-sm font-medium bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-primary-foreground px-4 py-2 rounded-lg hover:bg-opacity-90 transition-colors"
|
||||||
title="Request a Demo"
|
title="Request a Demo"
|
||||||
>
|
>
|
||||||
<FiClipboard className="w-4 h-4 mr-1.5" /> Request OBSE Demo
|
<FiClipboard className="w-4 h-4 mr-1.5" /> Request OBSE Demo
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="pt-4 border-t border-border mt-4"></div>
|
<div className="pt-4 border-t border-border mt-4"></div>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
@ -485,3 +508,77 @@ const HeaderClient = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default HeaderClient;
|
export default HeaderClient;
|
||||||
|
// <div
|
||||||
|
// className={`group ${
|
||||||
|
// isActive("/join-us") ||
|
||||||
|
// isActive("/vacancies") ||
|
||||||
|
// isActive("/portal")
|
||||||
|
// ? "active"
|
||||||
|
// : ""
|
||||||
|
// }`} // Add active class to group (check all related paths)
|
||||||
|
// onMouseEnter={handleJoinUsMouseEnter}
|
||||||
|
// onMouseLeave={handleJoinUsMouseLeave}
|
||||||
|
// >
|
||||||
|
// <button
|
||||||
|
// className={`${megaMenuTriggerClasses} ${
|
||||||
|
// isActive("/join-us") ||
|
||||||
|
// isActive("/vacancies") ||
|
||||||
|
// isActive("/portal")
|
||||||
|
// ? "after:w-full"
|
||||||
|
// : ""
|
||||||
|
// }`}
|
||||||
|
// >
|
||||||
|
// {" "}
|
||||||
|
// {/* Apply underline based on active state */}
|
||||||
|
// Join Our Team
|
||||||
|
// <FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
|
||||||
|
// </button>
|
||||||
|
// <div
|
||||||
|
// className={`
|
||||||
|
// absolute left-0 top-full w-full shadow-lg z-1000
|
||||||
|
// bg-card border-x border-b border-border rounded-b-lg
|
||||||
|
// opacity-0 invisible translate-y-[-10px]
|
||||||
|
// ${
|
||||||
|
// joinUsDropdownOpen
|
||||||
|
// ? "opacity-100 visible translate-y-0"
|
||||||
|
// : ""
|
||||||
|
// }
|
||||||
|
// transition-all duration-300 ease-out transform
|
||||||
|
// `}
|
||||||
|
// >
|
||||||
|
// <div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
|
||||||
|
// <div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 max-w-xl">
|
||||||
|
// <Link
|
||||||
|
// href="/vacancies"
|
||||||
|
// className={`${megaMenuItemClasses} ${
|
||||||
|
// isActive("/vacancies") ? "text-primary" : ""
|
||||||
|
// }`}
|
||||||
|
// >
|
||||||
|
// {" "}
|
||||||
|
// {/* Apply active class */}
|
||||||
|
// <FiFileText className={megaMenuIconClasses} />
|
||||||
|
// <div className={megaMenuTextWrapperClasses}>
|
||||||
|
// <p className={megaMenuTitleClasses}>
|
||||||
|
// Current Vacancies
|
||||||
|
// </p>
|
||||||
|
// </div>
|
||||||
|
// </Link>
|
||||||
|
// <Link
|
||||||
|
// href="/portal"
|
||||||
|
// className={`${megaMenuItemClasses} ${
|
||||||
|
// isActive("/portal") ? "text-primary" : ""
|
||||||
|
// }`}
|
||||||
|
// >
|
||||||
|
// {" "}
|
||||||
|
// {/* Apply active class */}
|
||||||
|
// <FiUserCheck className={megaMenuIconClasses} />
|
||||||
|
// <div className={megaMenuTextWrapperClasses}>
|
||||||
|
// <p className={megaMenuTitleClasses}>
|
||||||
|
// Recruitment Portal
|
||||||
|
// </p>
|
||||||
|
// </div>
|
||||||
|
// </Link>
|
||||||
|
// </div>
|
||||||
|
// </div>
|
||||||
|
// </div>
|
||||||
|
// </div>
|
||||||
@ -4,7 +4,7 @@ import Link from "next/link";
|
|||||||
|
|
||||||
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||||
href?: string;
|
href?: string;
|
||||||
variant?: "primary" | "secondary" | "outline" | "ghost" | "destructive"; // Added more variants
|
variant?: "primary" | "secondary" | "outline" | "ghost" | "destructive" | "black";
|
||||||
size?: "sm" | "md" | "lg";
|
size?: "sm" | "md" | "lg";
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
className?: string;
|
className?: string;
|
||||||
@ -24,13 +24,17 @@ const Button: React.FC<ButtonProps> = ({
|
|||||||
|
|
||||||
// Variant styles using semantic vars (Tailwind classes generated via @theme)
|
// Variant styles using semantic vars (Tailwind classes generated via @theme)
|
||||||
const variantStyles = {
|
const variantStyles = {
|
||||||
primary: "bg-primary text-primary-foreground hover:bg-primary/90", // bg-primary generated from --primary
|
//primary: "bg-primary text-primary-foreground hover:bg-primary/90", // bg-primary generated from --primary
|
||||||
|
primary: "bg-[linear-gradient(to_right,#e6cd4b,#fff8b3,#e0b843)] text-primary-foreground hover:bg-primary/90",
|
||||||
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
||||||
outline:
|
outline:
|
||||||
"border border-border bg-transparent hover:bg-accent hover:text-accent-foreground",
|
"border border-border bg-transparent hover:bg-accent hover:text-accent-foreground",
|
||||||
ghost: "hover:bg-accent hover:text-accent-foreground",
|
ghost: "hover:bg-accent hover:text-accent-foreground",
|
||||||
destructive:
|
destructive:
|
||||||
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
||||||
|
//linear-gradient(to right, #ead566, #e0be45) created using Tailwind's gradient utilities
|
||||||
|
//i want that variant
|
||||||
|
black:"inline-block bg-gray-800 text-white font-bold py-3 px-8 rounded-md hover:bg-gray-900 dark:bg-gray-900 dark:hover:bg-black transition-colors duration-300 font-poppins",
|
||||||
};
|
};
|
||||||
|
|
||||||
const sizeStyles = {
|
const sizeStyles = {
|
||||||
|
|||||||
BIN
public/About us-min.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
public/Privacy-Policy/Data-Privacy-Statement-for-Candidates.pdf
Normal file
BIN
public/Privacy-Policy/Recruitment-Privacy-Policy.pdf
Normal file
BIN
public/about-2.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
public/banner-1.jpeg
Normal file
|
After Width: | Height: | Size: 241 KiB |
BIN
public/custom-software.jpg
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
public/custome-software-2.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
public/custome-software-3.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
2979
public/custome-software-3.svg
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
public/hero-2.jpg
Normal file
|
After Width: | Height: | Size: 3.2 MiB |
BIN
public/images/team-collaborative-2.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
7684
public/images/team-collaborative-2.svg
Normal file
|
After Width: | Height: | Size: 5.5 MiB |