Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4bc59072b6 | ||
|
|
e8e44e4d5d |
24
src/App.jsx
24
src/App.jsx
@@ -5,17 +5,27 @@ import FormSection from "./components/contact/FormSection"
|
|||||||
import SolusiPersonal from "./pages/SolusiPersonal"
|
import SolusiPersonal from "./pages/SolusiPersonal"
|
||||||
import SolusiStartup from "./pages/SolusiStartup"
|
import SolusiStartup from "./pages/SolusiStartup"
|
||||||
import SolusiCorporate from "./pages/SolusiCorporate"
|
import SolusiCorporate from "./pages/SolusiCorporate"
|
||||||
|
import NotFound from "./components/NotFound/NotFound"
|
||||||
|
import Header from './components/beranda/Header';
|
||||||
|
import WhatsAppButton from './components/beranda/WhatsAppButon';
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<Router>
|
<Router>
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path='/' element={<Home/>}/>
|
<Route path='/' element={<Home />} />
|
||||||
<Route path='/Contact' element={<Contact/>}/>
|
<Route path='/Contact' element={<Contact />} />
|
||||||
<Route path='/FormSection' element={<FormSection/>}/>
|
<Route path='/FormSection' element={<FormSection />} />
|
||||||
<Route path='/SolusiPersonal' element={<SolusiPersonal/>}/>
|
<Route path='/SolusiPersonal' element={<SolusiPersonal />} />
|
||||||
<Route path='/SolusiStartup' element={<SolusiStartup/>}/>
|
<Route path='/SolusiStartup' element={<SolusiStartup />} />
|
||||||
<Route path='/SolusiCorporate' element={<SolusiCorporate/>}/>
|
<Route path='/SolusiCorporate' element={<SolusiCorporate />} />
|
||||||
|
<Route path='/004' element={
|
||||||
|
<>
|
||||||
|
<Header />
|
||||||
|
<NotFound />
|
||||||
|
<WhatsAppButton/>
|
||||||
|
</>
|
||||||
|
|
||||||
|
} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</Router>
|
</Router>
|
||||||
|
|
||||||
|
|||||||
14
src/components/NotFound/NotFound.jsx
Normal file
14
src/components/NotFound/NotFound.jsx
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { logonf } from "./asset";
|
||||||
|
|
||||||
|
|
||||||
|
const NotFound = () => {
|
||||||
|
return (
|
||||||
|
<div className="justify-center text-center items-center flex flex-col mt-32 gap-4">
|
||||||
|
<img src={logonf} alt="404" />
|
||||||
|
<h1 className="font-bold text-[1.5rem]">Halaman Dalam Proses Pengembangan</h1>
|
||||||
|
<p className="text-[1rem] font-medium w-[50rem]">Terima kasih atas kunjungan Anda! Halaman ini sedang dalam tahap pengembangan untuk memberikan pengalaman terbaik. Nantikan segera pembaruan dari kami! </p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NotFound;
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
4
src/components/NotFound/asset/index.js
Normal file
4
src/components/NotFound/asset/index.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import logonf from './Black Blue and Pink Modern Twibbon Instagram Post 1.png';
|
||||||
|
|
||||||
|
|
||||||
|
export { logonf, }
|
||||||
@@ -95,13 +95,13 @@ const Header = () => {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
{isProdukOpen && (
|
{isProdukOpen && (
|
||||||
<div className="absolute left-[448px] -translate-x-1/2 top-full md:top-11 mt-2 w-[1450px]">
|
<div className="absolute md:left-[350px] 2xl:left-[448px] -translate-x-1/2 top-full md:top-11 mt-2 w-[1450px]">
|
||||||
<div className="bg-customRed bg-opacity-80 rounded-xl p-8">
|
<div className="bg-customRed bg-opacity-80 rounded-xl p-8">
|
||||||
<div className="flex justify-center gap-8">
|
<div className="flex justify-center gap-8">
|
||||||
{/* HR */}
|
{/* HR */}
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigate("/SolusiPersonal");
|
navigate("/004");
|
||||||
window.scrollTo({ top: 0, behavior: "smooth" });
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
}}
|
}}
|
||||||
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
||||||
@@ -118,7 +118,7 @@ const Header = () => {
|
|||||||
{/* DOKU */}
|
{/* DOKU */}
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigate("/SolusiStartup");
|
navigate("/004");
|
||||||
window.scrollTo({ top: 0, behavior: "smooth" });
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
}}
|
}}
|
||||||
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
||||||
@@ -135,7 +135,7 @@ const Header = () => {
|
|||||||
{/* LLM */}
|
{/* LLM */}
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigate("/SolusiCorporate");
|
navigate("/004");
|
||||||
window.scrollTo({ top: 0, behavior: "smooth" });
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
}}
|
}}
|
||||||
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
||||||
@@ -149,7 +149,7 @@ const Header = () => {
|
|||||||
{/* VERI */}
|
{/* VERI */}
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigate("/SolusiCorporate");
|
navigate("/004");
|
||||||
window.scrollTo({ top: 0, behavior: "smooth" });
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
}}
|
}}
|
||||||
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
className="bg-white rounded-xl w-[282px] p-4 flex items-start gap-4 hover:bg-gray-100"
|
||||||
@@ -188,8 +188,8 @@ const Header = () => {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
{isSolusiOpen && (
|
{isSolusiOpen && (
|
||||||
<div className="absolute left-[340px] -translate-x-1/2 top-full md:top-11 mt-2 w-[1450px]">
|
<div className="absolute md:left-[235px] 2xl:left-[340px] -translate-x-1/2 top-full md:top-11 mt-2 w-[1450px] ">
|
||||||
<div className="bg-customRed bg-opacity-80 rounded-xl p-8">
|
<div className="bg-customRed bg-opacity-80 rounded-xl p-8 md:h-[168px]">
|
||||||
<div className="flex justify-center gap-8">
|
<div className="flex justify-center gap-8">
|
||||||
{/* Personal */}
|
{/* Personal */}
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ function Hero() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full overflow-hidden" id="Home">
|
<div className="translate-y-24 md:translate-y-0 w-full overflow-hidden" id="Home">
|
||||||
<div className="container mx-auto px-4 lg:px-12">
|
<div className="container mx-auto px-4 lg:px-12">
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-12 items-center py-12 lg:py-16" id="hero-section">
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-12 items-center py-12 lg:py-16" id="hero-section">
|
||||||
{/* Left Section */}
|
{/* Left Section */}
|
||||||
@@ -42,7 +42,7 @@ function Hero() {
|
|||||||
initial={{ opacity: 0, x: -50 }}
|
initial={{ opacity: 0, x: -50 }}
|
||||||
animate={{ opacity: inView ? 1 : 0, x: inView ? 0 : -50 }}
|
animate={{ opacity: inView ? 1 : 0, x: inView ? 0 : -50 }}
|
||||||
transition={{ duration: 0.8 }}
|
transition={{ duration: 0.8 }}
|
||||||
className="space-y-6 md:-mt-32 mt-10 text-center lg:text-left order-1 lg:order-none"
|
className="space-y-6 md:-mt-40 -mt-28 text-center lg:text-left order-1 md:-ml-4 2xl:-ml-4 lg:order-none"
|
||||||
>
|
>
|
||||||
<img src={homeLogo} alt="Rekan AI Logo" className="h-12 w-auto lg:mx-0" />
|
<img src={homeLogo} alt="Rekan AI Logo" className="h-12 w-auto lg:mx-0" />
|
||||||
<h1 className="text-[24px] lg:text-[30px] font-semibold text-customBlack leading-tight">
|
<h1 className="text-[24px] lg:text-[30px] font-semibold text-customBlack leading-tight">
|
||||||
@@ -72,12 +72,12 @@ function Hero() {
|
|||||||
className="flex flex-col sm:flex-row gap-4 md:-mt-96 order-3 lg:order-none"
|
className="flex flex-col sm:flex-row gap-4 md:-mt-96 order-3 lg:order-none"
|
||||||
id="button-section"
|
id="button-section"
|
||||||
>
|
>
|
||||||
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[55px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[62px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
||||||
<img src={waIcon} alt="WhatsApp Icon" className="mr-2 h-7 w-7" />
|
<img src={waIcon} alt="WhatsApp Icon" className="mr-2 h-7 w-7" />
|
||||||
Konsultasi Gratis
|
Konsultasi Gratis
|
||||||
</button>
|
</button>
|
||||||
<Link to={"/Contact#form"}>
|
<Link to={"/Contact#form"}>
|
||||||
<button className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[55px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity">
|
<button className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[62px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity">
|
||||||
Coba Sekarang
|
Coba Sekarang
|
||||||
</button>
|
</button>
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -87,8 +87,9 @@ function Kenapa() {
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div ref={buttonRef} className="flex flex-col md:flex-row mt-8 md:mt-20 space-y-4 md:space-y-0 md:space-x-10 w-full">
|
<div ref={buttonRef} className="flex flex-col md:flex-row mt-8 md:mt-20 space-y-4 md:space-y-0 md:space-x-10 w-full">
|
||||||
|
<Link to={""} className="w-full md:w-[245px]">
|
||||||
<motion.button
|
<motion.button
|
||||||
className="flex items-center justify-center w-full md:w-[270px] h-[50px] md:h-[70px] border-2 border-customRed text-customRed md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
className="flex items-center justify-center w-full md:w-[245px] md:h-[62px] h-[50px] border-2 border-customRed text-customRed md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
||||||
initial={{ opacity: 0, scale: 0.8 }}
|
initial={{ opacity: 0, scale: 0.8 }}
|
||||||
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
||||||
transition={{ duration: 0.5, delay: 0.8 }}
|
transition={{ duration: 0.5, delay: 0.8 }}
|
||||||
@@ -96,9 +97,10 @@ function Kenapa() {
|
|||||||
<img src={waIcon} alt="WhatsApp Icon" className="mr-2 w-4 h-4 md:w-[30px] md:h-[30px]" />
|
<img src={waIcon} alt="WhatsApp Icon" className="mr-2 w-4 h-4 md:w-[30px] md:h-[30px]" />
|
||||||
Konsultasi Gratis
|
Konsultasi Gratis
|
||||||
</motion.button>
|
</motion.button>
|
||||||
<Link to={"/Contact#form"}>
|
</Link>
|
||||||
|
<Link to={"/Contact#form"} className="w-full md:w-[245px]">
|
||||||
<motion.button
|
<motion.button
|
||||||
className="w-full md:w-[276px] h-[50px] md:h-[70px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
className="flex items-center justify-center w-full h-[50px] md:w-[245px] md:h-[62px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
||||||
initial={{ opacity: 0, scale: 0.8 }}
|
initial={{ opacity: 0, scale: 0.8 }}
|
||||||
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
||||||
transition={{ duration: 0.5, delay: 1 }}
|
transition={{ duration: 0.5, delay: 1 }}
|
||||||
@@ -107,6 +109,7 @@ function Kenapa() {
|
|||||||
</motion.button>
|
</motion.button>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -78,9 +78,9 @@ function Mitra() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const interval = setInterval(() => {
|
const interval = setInterval(() => {
|
||||||
handleNext();
|
handleNext();
|
||||||
}, 8900); // Slider bergerak setiap 4 detik
|
}, 8900);
|
||||||
|
|
||||||
return () => clearInterval(interval); // Membersihkan interval saat komponen unmount
|
return () => clearInterval(interval);
|
||||||
}, [currentIndex]);
|
}, [currentIndex]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -23,23 +23,21 @@ const BottomCTA = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="text-[20px] font-normal leading-[30px] tracking-[0.005em] text-center text-[#212121] mb-5 mx-auto">
|
<p className="text-[20px] font-normal leading-[30px] tracking-[0.005em] text-center text-[#212121] mb-5 mx-auto">
|
||||||
Jika pertanyaan Anda belum terjawab di atas, jangan ragu untuk
|
Jika pertanyaan Anda belum terjawab di atas, jangan ragu untuk menghubungi kami melalui formulir<br />
|
||||||
menghubungi kami melalui formulir
|
|
||||||
<br />
|
|
||||||
kontak atau email. Kami dengan senang hati akan membantu!
|
kontak atau email. Kami dengan senang hati akan membantu!
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="flex flex-col justify-center md:mt-12 sm:flex-row gap-6 sm:gap-12 sm:mt-1 px-4 sm:px-0">
|
<div className="flex flex-col justify-center md:mt-12 sm:flex-row gap-6 sm:gap-12 sm:mt-1 px-4 sm:px-0">
|
||||||
<motion.button className="w-full lg:w-[270px] h-[70px] btn2 flex items-center justify-center py-3 border-2 border-[#DC0168] rounded-[14px] text-[#DC0168] font-semibold text-[18px] lg:text-[20px] cursor-pointer transition-all ease-in-out hover:bg-[#ffffff1a]">
|
<motion.button
|
||||||
<img
|
className="w-full lg:w-[270px] h-[70px] btn2 flex items-center justify-center py-3 border-2 border-[#DC0168] rounded-[14px] text-[#DC0168] font-semibold text-[18px] lg:text-[20px] cursor-pointer transition-all ease-in-out hover:bg-[#ffffff1a]"
|
||||||
src={wagreen}
|
>
|
||||||
alt="WhatsApp Icon"
|
<img src={wagreen} alt="WhatsApp Icon" className="mr-4 w-5 h-5 md:w-[30px] md:h-[30px]" />
|
||||||
className="mr-4 w-5 h-5 md:w-[30px] md:h-[30px]"
|
|
||||||
/>
|
|
||||||
Konsultasi Gratis
|
Konsultasi Gratis
|
||||||
</motion.button>
|
</motion.button>
|
||||||
|
|
||||||
<motion.button className="w-full lg:w-[276px] h-[70px] btn2 flex items-center justify-center py-3 px-8 rounded-[14px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-semibold text-[18px] lg:text-[20px] cursor-pointer transition-all ease-in-out hover:opacity-90">
|
<motion.button
|
||||||
|
className="w-full lg:w-[276px] h-[70px] btn2 flex items-center justify-center py-3 px-8 rounded-[14px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-semibold text-[18px] lg:text-[20px] cursor-pointer transition-all ease-in-out hover:opacity-90"
|
||||||
|
>
|
||||||
Coba Sekarang
|
Coba Sekarang
|
||||||
</motion.button>
|
</motion.button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { email, phone, customer } from "./asset";
|
import { email, phone, customer } from "./asset";
|
||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
|
import { useEffect } from "react";
|
||||||
import { useInView } from "react-intersection-observer";
|
import { useInView } from "react-intersection-observer";
|
||||||
|
|
||||||
const CustomerService = () => {
|
const CustomerService = () => {
|
||||||
@@ -17,23 +18,24 @@ const CustomerService = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="main-container mt-[180px] mb-16 md:mt-20 flex flex-col md:flex-row items-center px-5 py-10 max-w-7xl mx-auto md:mb-[100px] md:gap-12 xl:gap-20 2xl:px-20">
|
<section className="main-container mt-[180px] mb-16 md:mt-20 flex flex-col md:flex-row items-center px-5 py-10 max-w-7xl mx-auto md:mb-[100px] 2xl:px-20 2xl:gap-20">
|
||||||
{/* LEFT SECTION - Informasi */}
|
{/* LEFT SECTION - Informasi */}
|
||||||
<motion.div
|
<motion.div
|
||||||
ref={leftRef}
|
ref={leftRef}
|
||||||
className="w-full md:w-[650px] 2xl:w-[750px] h-auto gap-[29px] text-left md:mt-0 lg: 2xl:ml-[-90px]"
|
className="w-full md:w-[650px] 2xl:w-[750px] h-auto gap-[29px] text-left md:mt-0 lg: 2xl:ml-[-165px]"
|
||||||
initial="hidden"
|
initial="hidden"
|
||||||
animate={leftInView ? "visible" : "hidden"}
|
animate={leftInView ? "visible" : "hidden"}
|
||||||
variants={fadeInLeft}
|
variants={fadeInLeft}
|
||||||
key="left-content"
|
key="left-content"
|
||||||
>
|
>
|
||||||
|
|
||||||
<div className="mb-5">
|
<div className="mb-5">
|
||||||
<h2 className="text-[#212121] text-[28px] md:text-[32px] font-[550] leading-[36px] md:leading-[48px]">
|
<h2 className="text-[#212121] text-[28px] md:text-[32px] font-[550] leading-[36px] md:leading-[48px] 2xl:leading-[52px]">
|
||||||
Kami Siap Membantu Bisnis Anda <br />
|
Kami Siap Membantu Bisnis Anda <br />
|
||||||
Lebih Maju!
|
Lebih Maju!
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-[#212121] leading-relaxed mb-6 text-[16px] md:text-[18px]">
|
<p className="text-[#212121] leading-relaxed mb-6 text-[16px] md:text-[20px] md:max-w-[90%]">
|
||||||
Butuh informasi lebih lanjut tentang produk atau solusi kami? Tim Rekan AI siap menjawab pertanyaan Anda dengan cepat dan profesional.
|
Butuh informasi lebih lanjut tentang produk atau solusi kami? Tim Rekan AI siap menjawab pertanyaan Anda dengan cepat dan profesional.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col gap-6">
|
<div className="flex flex-col gap-6">
|
||||||
@@ -46,7 +48,7 @@ const CustomerService = () => {
|
|||||||
<div className="text-left">
|
<div className="text-left">
|
||||||
<p className="text-sm text-[#212121] md:text-[18px]">
|
<p className="text-sm text-[#212121] md:text-[18px]">
|
||||||
Kirim pertanyaan Anda ke{" "}
|
Kirim pertanyaan Anda ke{" "}
|
||||||
<strong className="text-[#5B59E8]">
|
<strong className="text-[#5B59E8] md:text-[18px]">
|
||||||
support@rekanai.com
|
support@rekanai.com
|
||||||
</strong>{" "}
|
</strong>{" "}
|
||||||
dan tim kami akan segera merespons.
|
dan tim kami akan segera merespons.
|
||||||
@@ -77,7 +79,7 @@ const CustomerService = () => {
|
|||||||
{/* RIGHT SECTION - Gambar */}
|
{/* RIGHT SECTION - Gambar */}
|
||||||
<motion.div
|
<motion.div
|
||||||
ref={rightRef}
|
ref={rightRef}
|
||||||
className="w-full md:w-[45%] flex justify-center items-center"
|
className="flex justify-center md:justify-end items-center md:mr-[-70px]"
|
||||||
initial="hidden"
|
initial="hidden"
|
||||||
animate={rightInView ? "visible" : "hidden"}
|
animate={rightInView ? "visible" : "hidden"}
|
||||||
variants={fadeInRight}
|
variants={fadeInRight}
|
||||||
@@ -86,7 +88,7 @@ const CustomerService = () => {
|
|||||||
<img
|
<img
|
||||||
src={customer}
|
src={customer}
|
||||||
alt="Customer Service"
|
alt="Customer Service"
|
||||||
className="w-[80%] md:w-full max-w-[450px] h-auto"
|
className="w-full h-auto md:w-auto md:h-auto"
|
||||||
/>
|
/>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { useEffect } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import { useLocation } from "react-router-dom"
|
import { useLocation } from "react-router-dom"
|
||||||
import ReCAPTCHA from "react-google-recaptcha"
|
import ReCAPTCHA from "react-google-recaptcha"
|
||||||
import { motion, useAnimation } from "framer-motion"
|
import { motion, useAnimation } from "framer-motion"
|
||||||
@@ -15,6 +15,9 @@ const ContactForm = () => {
|
|||||||
const [ref, inView] = useInView({
|
const [ref, inView] = useInView({
|
||||||
threshold: 0.1, // Trigger when 10% of the element is in view
|
threshold: 0.1, // Trigger when 10% of the element is in view
|
||||||
})
|
})
|
||||||
|
const [email, setEmail] = useState("");
|
||||||
|
const [error, setError] = useState("");
|
||||||
|
const [isValid, setIsValid] = useState(false); // Untuk validasi tombol submit
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (inView) {
|
if (inView) {
|
||||||
@@ -43,6 +46,32 @@ const ContactForm = () => {
|
|||||||
visible: { opacity: 1, y: 0, transition: { duration: 0.8, ease: "easeOut" } },
|
visible: { opacity: 1, y: 0, transition: { duration: 0.8, ease: "easeOut" } },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleChange = (e) => {
|
||||||
|
const value = e.target.value;
|
||||||
|
setEmail(value);
|
||||||
|
|
||||||
|
// Regex untuk memastikan hanya 3 huruf setelah titik
|
||||||
|
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{3}$/;
|
||||||
|
|
||||||
|
if (!emailPattern.test(value) && value !== "") {
|
||||||
|
setError("Domain email harus memiliki 3 huruf setelah titik.");
|
||||||
|
setIsValid(false); // Tidak valid, tombol submit dinonaktifkan
|
||||||
|
} else {
|
||||||
|
setError("");
|
||||||
|
setIsValid(true); // Valid, tombol submit bisa digunakan
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSubmit = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (!isValid) {
|
||||||
|
alert("Silakan perbaiki email Anda sebelum mengirim formulir.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
alert("Formulir berhasil dikirim!");
|
||||||
|
// Tambahkan logika pengiriman data di sini
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="relative flex min-h-screen w-full items-center justify-center p-5 text-white rounded-tl-[80px] rounded-tr-[80px]"
|
className="relative flex min-h-screen w-full items-center justify-center p-5 text-white rounded-tl-[80px] rounded-tr-[80px]"
|
||||||
@@ -109,10 +138,13 @@ const ContactForm = () => {
|
|||||||
<label className="text-[#6B5CEA]">Email*</label>
|
<label className="text-[#6B5CEA]">Email*</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
|
value={email}
|
||||||
|
onChange={handleChange}
|
||||||
placeholder="Masukkan email Anda"
|
placeholder="Masukkan email Anda"
|
||||||
required
|
required
|
||||||
className="w-full mt-1 p-4 border border-[#5B59E8] rounded-lg focus:ring-2 focus:ring-[#5B59E8] 2xl:p-5"
|
className="w-full mt-1 p-4 border border-[#5B59E8] rounded-lg focus:ring-2 focus:ring-[#5B59E8] 2xl:p-5"
|
||||||
/>
|
/>
|
||||||
|
{error && <p className="text-red-500 mt-1">{error}</p>}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="text-[#6B5CEA]">Nama Organisasi/Perusahaan</label>
|
<label className="text-[#6B5CEA]">Nama Organisasi/Perusahaan</label>
|
||||||
@@ -153,8 +185,8 @@ const ContactForm = () => {
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="bg-[#5B59E0] hover:bg-indigo-700 text-white py-3 px-6 rounded-lg shadow-md transition-all w-[173px] 2xl:w-[200px] 2xl:py-4"
|
className={`bg-[#5B59E0] hover:bg-indigo-700 text-white py-3 px-6 rounded-lg shadow-md transition-all w-[173px] 2xl:w-[200px] 2xl:py-4 ${!isValid ? "opacity-50 cursor-not-allowed" : ""}`}
|
||||||
disabled={!capchaToken}
|
disabled={!isValid || !capchaToken} // Tombol akan dinonaktifkan jika email tidak valid atau captcha belum diisi
|
||||||
>
|
>
|
||||||
Kirim Pesan
|
Kirim Pesan
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,43 +1,25 @@
|
|||||||
import row from "./arrow.png";
|
import row from './arrow.png';
|
||||||
import component11 from "./Component 11.png";
|
import component11 from './Component 11.png';
|
||||||
import customer from "./customer.png";
|
import customer from './customer.png';
|
||||||
import email from "./email.png";
|
import email from './email.png';
|
||||||
import facebook from "./facebook.png";
|
import facebook from './facebook.png';
|
||||||
import frame from "./Frame.png";
|
import frame from './Frame.png';
|
||||||
import frame27 from "./Frame27.png";
|
import frame27 from './Frame27.png';
|
||||||
import img10 from "./image 10.png";
|
import img10 from './image 10.png';
|
||||||
import instagram from "./instagram.png";
|
import instagram from './instagram.png';
|
||||||
import kmn from "./Dukcapil PNG Pic.png";
|
import kmn from './Dukcapil PNG Pic.png';
|
||||||
import kominfo from "./Kominfo PNG Pic.png";
|
import kominfo from './Kominfo PNG Pic.png';
|
||||||
import Logo1 from "./logo.png";
|
import Logo1 from './logo.png';
|
||||||
import nvidia from "./NVIDIA PNG Pic.png";
|
import nvidia from './NVIDIA PNG Pic.png';
|
||||||
import ojk from "./OJK-Rilis-Roadmap-Pasar-Modal-Indonesia-2023-2027.webp";
|
import ojk from './OJK-Rilis-Roadmap-Pasar-Modal-Indonesia-2023-2027.webp';
|
||||||
import phone from "./phone.png";
|
import phone from './phone.png';
|
||||||
import search from "./search.png";
|
import search from './search.png';
|
||||||
import telephone from "./telephone.png";
|
import telephone from './telephone.png';
|
||||||
import wagreen from "./whatsapp-color_svgrepo.com.png";
|
import wagreen from './whatsapp-color_svgrepo.com.png';
|
||||||
import wabutton from "./Whatsapp22.png";
|
import wabutton from './Whatsapp22.png';
|
||||||
import x from "./x.png";
|
import x from './x.png';
|
||||||
|
|
||||||
export {
|
|
||||||
row,
|
export{
|
||||||
component11,
|
row,component11,customer,email,facebook,frame,frame27,img10,instagram,kmn,kominfo,Logo1,nvidia,ojk,phone,search,telephone,wagreen,wabutton,x
|
||||||
customer,
|
}
|
||||||
email,
|
|
||||||
facebook,
|
|
||||||
frame,
|
|
||||||
frame27,
|
|
||||||
img10,
|
|
||||||
instagram,
|
|
||||||
kmn,
|
|
||||||
kominfo,
|
|
||||||
Logo1,
|
|
||||||
nvidia,
|
|
||||||
ojk,
|
|
||||||
phone,
|
|
||||||
search,
|
|
||||||
telephone,
|
|
||||||
wagreen,
|
|
||||||
wabutton,
|
|
||||||
x,
|
|
||||||
};
|
|
||||||
@@ -65,13 +65,13 @@ export default function HeadCorporate() {
|
|||||||
animate={buttonInView ? { opacity: 1, y: 0 } : {}}
|
animate={buttonInView ? { opacity: 1, y: 0 } : {}}
|
||||||
transition={{ duration: 0.8 }}
|
transition={{ duration: 0.8 }}
|
||||||
>
|
>
|
||||||
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[55px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[62px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
||||||
<img src={wagreen} alt="WhatsApp Icon" width={30} height={30} className="mr-2" />
|
<img src={wagreen} alt="WhatsApp Icon" width={30} height={30} className="mr-2" />
|
||||||
Konsultasi Gratis
|
Konsultasi Gratis
|
||||||
</button>
|
</button>
|
||||||
<Link to={"/Contact#form"}>
|
<Link to={"/Contact#form"}>
|
||||||
<motion.button
|
<motion.button
|
||||||
className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[55px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity"
|
className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[62px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity"
|
||||||
initial={{ opacity: 0, scale: 0.8 }}
|
initial={{ opacity: 0, scale: 0.8 }}
|
||||||
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
||||||
transition={{ duration: 0.5 }}
|
transition={{ duration: 0.5 }}
|
||||||
|
|||||||
@@ -67,13 +67,13 @@ export default function HeadPersonal() {
|
|||||||
animate={buttonInView ? { opacity: 1, y: 0 } : {}}
|
animate={buttonInView ? { opacity: 1, y: 0 } : {}}
|
||||||
transition={{ duration: 0.8 }}
|
transition={{ duration: 0.8 }}
|
||||||
>
|
>
|
||||||
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[55px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[62px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
||||||
<img src={wagreen} alt="WhatsApp Icon" width={30} height={30} className="mr-2" />
|
<img src={wagreen} alt="WhatsApp Icon" width={30} height={30} className="mr-2" />
|
||||||
Konsultasi Gratis
|
Konsultasi Gratis
|
||||||
</button>
|
</button>
|
||||||
<Link to={"/Contact#form"}>
|
<Link to={"/Contact#form"}>
|
||||||
<motion.button
|
<motion.button
|
||||||
className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[55px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity"
|
className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[62px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity"
|
||||||
initial={{ opacity: 0, scale: 0.8 }}
|
initial={{ opacity: 0, scale: 0.8 }}
|
||||||
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
||||||
transition={{ duration: 0.5 }}
|
transition={{ duration: 0.5 }}
|
||||||
|
|||||||
@@ -65,13 +65,13 @@ export default function HeadPersonal() {
|
|||||||
animate={buttonInView ? { opacity: 1, y: 0 } : {}}
|
animate={buttonInView ? { opacity: 1, y: 0 } : {}}
|
||||||
transition={{ duration: 0.8 }}
|
transition={{ duration: 0.8 }}
|
||||||
>
|
>
|
||||||
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[55px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
<button className="flex items-center justify-center px-6 py-3 border-2 md:w-[245px] md:h-[62px] border-customRed rounded-[14px] text-customRed font-medium text-base lg:text-lg hover:bg-pink-50 transition-colors">
|
||||||
<img src={wagreen} alt="WhatsApp Icon" width={30} height={30} className="mr-2" />
|
<img src={wagreen} alt="WhatsApp Icon" width={30} height={30} className="mr-2" />
|
||||||
Konsultasi Gratis
|
Konsultasi Gratis
|
||||||
</button>
|
</button>
|
||||||
<Link to={"/Contact#form"}>
|
<Link to={"/Contact#form"}>
|
||||||
<motion.button
|
<motion.button
|
||||||
className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[55px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity"
|
className="flex items-center justify-center px-6 py-3 rounded-[14px] w-[358px] h-[55px] md:w-[245px] md:h-[62px] bg-gradient-to-r from-[#DC0168] to-[#5B59E8] text-white font-medium text-base lg:text-lg hover:opacity-90 transition-opacity"
|
||||||
initial={{ opacity: 0, scale: 0.8 }}
|
initial={{ opacity: 0, scale: 0.8 }}
|
||||||
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
animate={buttonInView ? { opacity: 1, scale: 1 } : {}}
|
||||||
transition={{ duration: 0.5 }}
|
transition={{ duration: 0.5 }}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ function Kenapa() {
|
|||||||
<motion.button
|
<motion.button
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
whileTap={{ scale: 0.95 }}
|
whileTap={{ scale: 0.95 }}
|
||||||
className="flex items-center justify-center w-full md:w-[270px] h-[50px] md:h-[70px] border-2 border-[#CA2B68] text-[#CA2B68] md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
className="flex items-center justify-center w-full md:w-[245px] h-[50px] md:h-[62px] border-2 border-[#CA2B68] text-[#CA2B68] md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={wagreen || "/placeholder.svg"}
|
src={wagreen || "/placeholder.svg"}
|
||||||
@@ -79,7 +79,7 @@ function Kenapa() {
|
|||||||
<motion.button
|
<motion.button
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
whileTap={{ scale: 0.95 }}
|
whileTap={{ scale: 0.95 }}
|
||||||
className="w-full md:w-[276px] h-[50px] md:h-[70px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
className="w-full md:w-[245px] h-[50px] md:h-[62px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
||||||
>
|
>
|
||||||
Coba Sekarang
|
Coba Sekarang
|
||||||
</motion.button>
|
</motion.button>
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ function Kenapa() {
|
|||||||
<motion.button
|
<motion.button
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
whileTap={{ scale: 0.95 }}
|
whileTap={{ scale: 0.95 }}
|
||||||
className="flex items-center justify-center w-full md:w-[270px] h-[50px] md:h-[70px] border-2 border-[#CA2B68] text-[#CA2B68] md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
className="flex items-center justify-center w-full md:w-[245px] h-[50px] md:h-[62px] border-2 border-[#CA2B68] text-[#CA2B68] md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={wagreen || "/placeholder.svg"}
|
src={wagreen || "/placeholder.svg"}
|
||||||
@@ -79,7 +79,7 @@ function Kenapa() {
|
|||||||
<motion.button
|
<motion.button
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
whileTap={{ scale: 0.95 }}
|
whileTap={{ scale: 0.95 }}
|
||||||
className="w-full md:w-[276px] h-[50px] md:h-[70px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
className="w-full md:w-[245px] h-[50px] md:h-[62px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
||||||
>
|
>
|
||||||
Coba Sekarang
|
Coba Sekarang
|
||||||
</motion.button>
|
</motion.button>
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ function Kenapa() {
|
|||||||
<motion.button
|
<motion.button
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
whileTap={{ scale: 0.95 }}
|
whileTap={{ scale: 0.95 }}
|
||||||
className="flex items-center justify-center w-full md:w-[270px] h-[50px] md:h-[70px] border-2 border-[#CA2B68] text-[#CA2B68] md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
className="flex items-center justify-center w-full md:w-[245px] h-[50px] md:h-[62px] border-2 border-[#CA2B68] text-[#CA2B68] md:text-xl font-medium rounded-[14px] hover:bg-white hover:bg-opacity-10 transition"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={wagreen || "/placeholder.svg"}
|
src={wagreen || "/placeholder.svg"}
|
||||||
@@ -82,7 +82,7 @@ function Kenapa() {
|
|||||||
<motion.button
|
<motion.button
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
whileTap={{ scale: 0.95 }}
|
whileTap={{ scale: 0.95 }}
|
||||||
className="w-full md:w-[276px] h-[50px] md:h-[70px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
className="w-full md:w-[245px] h-[50px] md:h-[62px] bg-gradient-to-r from-pink-700 to-indigo-600 text-white md:text-xl font-medium rounded-[14px] hover:opacity-90 transition"
|
||||||
>
|
>
|
||||||
Coba Sekarang
|
Coba Sekarang
|
||||||
</motion.button>
|
</motion.button>
|
||||||
|
|||||||
Reference in New Issue
Block a user