LandingPage-Fnet/src/pages/Portfolio.jsx

275 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Navbar from "../components/Navbar";
import Footer from "../components/Footer";
import { motion } from "framer-motion";
import { useState } from "react";
export default function Portfolio() {
const [selectedPortfolio, setSelectedPortfolio] = useState(null);
const portfolioData = [
{
id: 1,
image: "/sdm2.jpg",
title: "Didukung Tenaga Kerja Profesional & Bersertifikasi BNSP",
shortDesc:
"PT. Jaringan Citra Mandiri memiliki tenaga kerja bersertifikasi BNSP dan tenaga ahli berpengalaman.",
detail: (
<>
<h2 className="text-xl font-bold mb-2">
Didukung Tenaga Kerja Profesional & Bersertifikasi BNSP Untuk Layanan Terbaik
</h2>
<p className="text-sm leading-relaxed mb-2">
PT. Jaringan Citra Mandiri memiliki tenaga kerja dengan kualifikasi tinggi dan telah
mendapatkan sertifikasi dari BNSP. Tenaga kerja kami memiliki pengetahuan, keterampilan,
dan pemahaman yang mendalam dalam berbagai bidang pekerjaan.
</p>
<p className="text-sm leading-relaxed">
Lebih dari 200 tenaga kerja siap mendukung semua layanan dengan standar terbaik,
termasuk tenaga ahli di dalamnya yang siap memaksimalkan layanan yang kami sediakan.
</p>
</>
),
},
{
id: 2,
image: "/alat2.jpg",
title: "Peralatan Fiber Optik",
shortDesc:
"PT. Jaringan Citra Mandiri memiliki alat kerja yang lengkap dan tersertifikasi.",
detail: (
<>
<h2 className="text-xl font-bold mb-2">Peralatan Fiber Optik</h2>
<p className="text-sm leading-relaxed mb-2">
Kami menggunakan peralatan fiber optik seperti Fujikura, Yokogawa, dan Exfo untuk
memastikan hasil kerja berkualitas tinggi.
</p>
<p className="text-sm leading-relaxed">
Semua alat kerja sudah sesuai standar industri jaringan serat optik.
</p>
</>
),
extraImages: ["/fujikura.jpg", "/yokogwa.jpg", "/exfo.jpg"],
},
{
id: 3,
image: "/tiang.jpg",
title: "Produksi / Pabrikasi Tiang",
shortDesc: "Pabrikasi tiang telco berkualitas dengan standar industri terbaik.",
detail: (
<div className="space-y-10">
<div className="grid md:grid-cols-2 gap-6 items-center">
<img
src="/tiang1.jpg"
alt="Pabrikasi Berkualitas"
className="w-full h-56 object-cover rounded-lg border shadow"
/>
<div>
<h3 className="font-semibold text-gray-800 mb-2">
Pabrikasi Berkualitas dengan Standar Industri Terbaik
</h3>
<p className="text-sm leading-relaxed">
Selain dari pekerjaan jaringan, PT. Jaringan Citra Mandiri mempunyai Pabrikasi Tiang Telco,
guna menunjang kebutuhan perusahaan maupun kebutuhan dari luar perusahaan.
</p>
</div>
</div>
<div className="grid md:grid-cols-2 gap-6 items-center">
<div className="order-2 md:order-1">
<h3 className="font-semibold text-gray-800 mb-2">
Efisiensi Tinggi untuk Memenuhi Permintaan Pelanggan
</h3>
<p className="text-sm leading-relaxed">
Kami dapat memproduksi tiang sebanyak 50 batang per hari. Dengan peralatan dan fasilitas
yang mumpuni, tenaga kerja yang berkualitas serta sistem manajemen yang efisien, membuat
kami dapat memenuhi permintaan pelanggan dengan baik.
</p>
</div>
<img
src="/tiang2.jpg"
alt="Efisiensi Tinggi"
className="w-full h-56 object-cover rounded-lg border shadow order-1 md:order-2"
/>
</div>
</div>
),
},
{
id: 4,
image: "/map1.jpg",
title: "Pembangunan & Pemeliharaan Jaringan Serat Optik Antar Kota",
shortDesc:
"Pembangunan dan pemeliharaan jaringan serat optik skala besar di berbagai wilayah Jawa Barat.",
detail: (
<div className="space-y-4">
<h2 className="text-xl font-bold mb-2">
Pembangunan & Pemeliharaan Jaringan Serat Optik Antar Kota
</h2>
<p className="text-sm leading-relaxed mb-2">
PT. Jaringan Citra Mandiri telah menyelesaikan berbagai proyek pembangunan
dan pemeliharaan jaringan serat optik antar kota.
Beberapa proyek utama mencakup wilayah strategis di Jawa Barat.
</p>
<div className="grid grid-cols-2 gap-4 mt-4">
<div>
<img src="/subang.jpg" alt="Subang" className="w-full h-36 object-cover rounded-lg border" />
<p className="text-xs mt-1 text-center font-semibold">Subang 50 Km</p>
</div>
<div>
<img src="/pangandaran.jpg" alt="Pangandaran" className="w-full h-36 object-cover rounded-lg border" />
<p className="text-xs mt-1 text-center font-semibold">Pangandaran 225 Km</p>
</div>
<div>
<img src="/bandungraya.jpg" alt="Bandung Raya" className="w-full h-36 object-cover rounded-lg border" />
<p className="text-xs mt-1 text-center font-semibold">Bandung Raya 800 Km</p>
</div>
<div>
<img src="/garut.jpg" alt="Garut" className="w-full h-36 object-cover rounded-lg border" />
<p className="text-xs mt-1 text-center font-semibold">Garut 1000 Km</p>
</div>
<div>
<img src="/ciamis.jpg" alt="Ciamis" className="w-full h-36 object-cover rounded-lg border" />
<p className="text-xs mt-1 text-center font-semibold">Ciamis 100 Km</p>
</div>
<div>
<img src="/tasik.jpg" alt="Tasik" className="w-full h-36 object-cover rounded-lg border" />
<p className="text-xs mt-1 text-center font-semibold">Tasik 100 Km</p>
</div>
</div>
</div>
),
},
];
return (
<div className="font-sans">
<Navbar />
<section className="relative w-full h-[400px] flex items-center justify-center text-center text-white overflow-hidden">
<video
className="absolute inset-0 w-full h-full object-cover"
src="/port2.mp4"
autoPlay
loop
muted
playsInline
/>
<div className="absolute inset-0 bg-black/50"></div>
<div className="relative z-10 px-4">
<h1 className="text-4xl font-bold mb-8">Portofolio Kami</h1>
<p className="text-lg opacity-90">
Lihat karya dan layanan terbaik yang sudah kami bangun
</p>
</div>
</section>
<section className="relative py-20 bg-gradient-to-br from-indigo-50 via-white to-pink-50 min-h-screen overflow-hidden">
<div className="relative max-w-6xl mx-auto px-6 lg:px-20">
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 relative z-10">
{portfolioData.map((item) => (
<PortfolioCard
key={item.id}
image={item.image}
title={item.title}
shortDesc={item.shortDesc}
onClick={() => setSelectedPortfolio(item)}
/>
))}
</div>
</div>
</section>
{selectedPortfolio && (
<div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 px-4">
<motion.div
initial={{ opacity: 0, y: 50, scale: 0.95 }}
animate={{ opacity: 1, y: 0, scale: 1 }}
exit={{ opacity: 0, y: 50, scale: 0.95 }}
transition={{ duration: 0.4, ease: "easeOut" }}
className="relative bg-white/90 backdrop-blur-xl rounded-3xl max-w-5xl w-full h-[85vh] flex flex-col shadow-2xl overflow-hidden"
>
<button
onClick={() => setSelectedPortfolio(null)}
className="absolute top-4 right-4 z-50 bg-white/80 hover:bg-red-500 hover:text-white rounded-full shadow-md p-2 transition"
>
</button>
<div className="relative">
<img
src={selectedPortfolio.image}
alt={selectedPortfolio.title}
className="w-full h-72 object-cover rounded-t-3xl"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/20 to-transparent rounded-t-3xl"></div>
<div className="absolute bottom-6 left-6">
<h2 className="text-2xl md:text-3xl font-bold text-white drop-shadow-lg">
{selectedPortfolio.title}
</h2>
</div>
</div>
<div className="p-6 overflow-y-auto flex-1 text-gray-800 space-y-4 text-sm leading-relaxed custom-scrollbar">
{selectedPortfolio.detail}
{selectedPortfolio.extraImages && (
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 mt-6">
{selectedPortfolio.extraImages.map((img, idx) => (
<motion.img
key={idx}
src={img}
alt={`extra-${idx}`}
whileHover={{ scale: 1.05 }}
className="w-full h-40 object-cover rounded-xl border shadow-sm transition"
/>
))}
</div>
)}
</div>
</motion.div>
</div>
)}
<Footer />
</div>
);
}
/* Komponen Card */
function PortfolioCard({ image, title, shortDesc, onClick }) {
return (
<motion.div
whileHover={{ scale: 1.02 }}
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
viewport={{ once: true }}
className="rounded-2xl overflow-hidden bg-white/90 backdrop-blur-md shadow-md hover:shadow-xl hover:-translate-y-1 transition-all duration-300 flex flex-col"
>
<div className="relative">
<img src={image} alt={title} className="w-full h-48 object-cover" />
<div className="absolute inset-0 bg-gradient-to-t from-black/30 via-transparent to-transparent"></div>
</div>
<div className="p-6 flex flex-col flex-grow">
{/* ==== WARNA JUDUL DIBUAT BIRU NAVBAR ==== */}
<h3 className="text-lg font-bold bg-gradient-to-r from-blue-700 to-blue-500 bg-clip-text text-transparent">
{title}
</h3>
<p className="mt-2 text-gray-700 text-sm leading-relaxed flex-grow">
{shortDesc}
</p>
<button
onClick={onClick}
className="mt-4 inline-block text-blue-600 font-semibold hover:underline text-sm text-left"
>
Lihat Selengkapnya
</button>
</div>
</motion.div>
);
}