new section and conatct inetegration and testimonial integration are updated

This commit is contained in:
akash 2026-03-04 10:20:51 +05:30
parent 74fa05edeb
commit dd1f13f9b4
39 changed files with 2753 additions and 1859 deletions

View File

@ -12,7 +12,7 @@ import ServiceSection from "@/components/careers/ServiceSection";
import WorkProcessSection from "@/components/careers/WorkProcessSection"; import WorkProcessSection from "@/components/careers/WorkProcessSection";
import FeaturesSection from "@/components/home/home-1/FeaturesSection"; import FeaturesSection from "@/components/home/home-1/FeaturesSection";
import PageHeader from "@/components/common/PageHeader"; import PageHeader from "@/components/common/PageHeader";
import AboutService from "@/components/services/AboutService"; import AboutService from "@/components/services-digital-solutions/AboutService";
import AboutThree from "@/components/home/AboutThree"; import AboutThree from "@/components/home/AboutThree";
import FaqFour from "@/components/home/FaqFour"; import FaqFour from "@/components/home/FaqFour";

View File

@ -7,6 +7,7 @@ import InnerBanner from "@/components/common/InnerBanner";
import FaqPageSection from "@/components/faq/FaqPageSection"; import FaqPageSection from "@/components/faq/FaqPageSection";
import FaqVideoSection from "@/components/careers/FaqVideoSection"; import FaqVideoSection from "@/components/careers/FaqVideoSection";
import PageHeader from "@/components/common/PageHeader"; import PageHeader from "@/components/common/PageHeader";
import FaqSection from "@/components/home/home-3/FaqSection";
export default function FaqPage() { export default function FaqPage() {
useEffect(() => { useEffect(() => {
@ -27,6 +28,7 @@ export default function FaqPage() {
<PageHeader title="FAQ" /> <PageHeader title="FAQ" />
<FaqPageSection /> <FaqPageSection />
<FaqVideoSection /> <FaqVideoSection />
<FaqSection/>
</main> </main>
<Footer1 /> <Footer1 />
</> </>

File diff suppressed because it is too large Load Diff

View File

@ -46,9 +46,9 @@ export default function MainPage() {
<main> <main>
<BannerSection /> <BannerSection />
<AboutSection /> <AboutSection />
<MedicalServices />
<CounsellingSolutions />
<ChooseSection /> <ChooseSection />
<CounsellingSolutions />
<MedicalServices />
<BrandSection /> <BrandSection />
<CallAreaThree /> <CallAreaThree />
<CounterAreaTwo /> <CounterAreaTwo />

View File

@ -2,7 +2,7 @@ import React from "react";
import Header1 from "@/components/layout/Header1"; import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1"; import Footer1 from "@/components/layout/Footer1";
import PageHeader from "@/components/common/PageHeader"; import PageHeader from "@/components/common/PageHeader";
import ServiceDetails from "@/components/services/ServiceDetails"; import ServiceDetails from "@/components/services-digital-solutions/ServiceDetails";
import { psychologyServices } from "@/utils/data"; import { psychologyServices } from "@/utils/data";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";

View File

@ -21,7 +21,7 @@ import Header1 from "@/components/layout/Header1";
import WorkProcessSection from "@/components/home/home-2/WorkProcessSection"; import WorkProcessSection from "@/components/home/home-2/WorkProcessSection";
import ServiceSection2 from "@/components/careers/ServiceSection"; import ServiceSection2 from "@/components/careers/ServiceSection";
import WorkProcessSection2 from "@/components/careers/WorkProcessSection"; import WorkProcessSection2 from "@/components/careers/WorkProcessSection";
import AboutService from "@/components/services/AboutService"; import AboutService from "@/components/services-digital-solutions/AboutService";
import PageHeader from "@/components/common/PageHeader"; import PageHeader from "@/components/common/PageHeader";
import AboutTwo from "@/components/home/AboutTwo"; import AboutTwo from "@/components/home/AboutTwo";

View File

@ -65,167 +65,6 @@ const WhyChooseUs = () => {
</div> </div>
</div> </div>
<style jsx>{`
.why-choose-us {
padding: 80px 0;
background: #eaf0f9;
}
@media (max-width: 767px) {
.why-choose-us {
padding: 60px 0;
}
}
.section-subtitle {
color: #3779b9;
font-weight: 700;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 12px;
font-size: 15px;
text-transform: uppercase;
letter-spacing: 1px;
}
.rotate-triangle {
font-size: 14px;
transform: rotate(-30deg);
margin-top: -2px;
}
.section-title {
font-size: 44px;
font-weight: 800;
color: #1a1a1a;
line-height: 1.2;
margin-bottom: 25px;
}
.section-desc {
font-size: 16px;
color: #666;
line-height: 1.7;
margin-bottom: 35px;
}
.feature-item {
padding: 25px 0;
}
.border-top-line {
border-top: 1px solid #eee;
}
.feature-icon {
width: 70px;
height: 70px;
background: #3779b9;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 25px;
flex-shrink: 0;
color: #fff;
font-size: 28px;
}
.feature-content h4 {
font-size: 22px;
font-weight: 700;
margin-bottom: 8px;
color: #1a1a1a;
}
.feature-content p {
font-size: 15px;
color: #666;
margin: 0;
}
.bottom-note {
padding-top: 30px;
border-top: 1px solid #eee;
}
.note-item {
display: flex;
align-items: flex-start;
gap: 15px;
}
.note-item i {
color: #1a1a1a;
font-size: 18px;
margin-top: 3px;
}
.note-item span {
font-size: 16px;
color: #444;
font-weight: 500;
line-height: 1.5;
}
.image-area-wrapper {
padding-left: 20px;
}
.main-image {
width: 100%;
border-radius: 4px;
overflow: hidden;
box-shadow: 0 30px 60px rgba(0,0,0,0.1);
}
.main-image img {
width: 100%;
display: block;
}
.circular-image {
position: absolute;
top: 50%;
left: -80px;
transform: translateY(-50%);
width: 280px;
height: 280px;
background: #fff;
padding: 10px;
border-radius: 50%;
box-shadow: 0 10px 40px rgba(0,0,0,0.15);
z-index: 2;
}
.inner-circle {
width: 100%;
height: 100%;
border-radius: 50%;
overflow: hidden;
border: 2px solid #fff;
}
.inner-circle img {
width: 100%;
height: 100%;
object-fit: cover;
}
@media (max-width: 1199px) {
.circular-image {
width: 220px;
height: 220px;
left: -50px;
}
.section-title {
font-size: 36px;
}
}
@media (max-width: 991px) {
.content-area {
padding-right: 0;
margin-bottom: 60px;
}
.image-area-wrapper {
padding-left: 0;
}
.circular-image {
width: 200px;
height: 200px;
left: -30px;
}
}
@media (max-width: 575px) {
.circular-image {
position: relative;
top: 0;
left: 0;
transform: none;
margin: -60px auto 0;
}
}
`}</style>
</section> </section>
); );
}; };

View File

@ -1,9 +1,31 @@
"use client"; "use client";
import React, { useEffect, useRef } from "react"; import React, { useState, useEffect, useRef } from "react";
import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios";
const ContactSection = () => { const ContactSection = () => {
const sectionRef = useRef<HTMLDivElement>(null); const sectionRef = useRef<HTMLDivElement>(null);
const [formData, setFormData] = useState({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
const [formErrors, setFormErrors] = useState<any>({});
const [captchaToken, setCaptchaToken] = useState<string | null>(null);
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setFormData((prev) => ({ ...prev, [name]: value }));
};
const handleCaptchaChange = (token: string | null) => {
setCaptchaToken(token);
};
useEffect(() => { useEffect(() => {
const observer = new IntersectionObserver( const observer = new IntersectionObserver(
@ -42,15 +64,71 @@ const ContactSection = () => {
return () => observer.disconnect(); return () => observer.disconnect();
}, []); }, []);
const handleSubmit = (e: React.FormEvent) => { const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();
// Handle form submission logic here
const errors: any = {};
if (!formData.name.trim()) errors.name = "Name is required.";
if (!formData.phone.trim()) errors.phone = "Phone is required.";
if (!formData.email.trim()) errors.email = "Email is required.";
if (!formData.service.trim()) errors.service = "Please select a service.";
if (!formData.message.trim()) errors.message = "Message is required.";
if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
setFormErrors(errors);
if (Object.keys(errors).length > 0) return;
const emailData = {
...formData,
message: `Service: ${formData.service}<br /><br />Message: ${formData.message}`,
to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Careers Contact",
recaptchaToken: captchaToken,
}; };
try {
const res = await axios.post("https://mailserver.metatronnest.com/send", emailData, {
headers: { "Content-Type": "application/json" },
});
setAlert({
show: true,
type: "success",
message: res?.data?.message || "Message sent successfully!",
});
setFormData({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
setCaptchaToken(null);
setFormErrors({});
} catch (error) {
console.error("❌ Error sending email:", error);
setAlert({
show: true,
type: "danger",
message: "Failed to send message. Please try again later.",
});
}
};
useEffect(() => {
if (alert.show) {
const timer = setTimeout(() => {
setAlert((prev) => ({ ...prev, show: false }));
}, 5000);
return () => clearTimeout(timer);
}
}, [alert.show]);
return ( return (
<section ref={sectionRef} className="contact-one"> <section ref={sectionRef} className="contact-one">
<div className="container"> <div className="container">
<div className="row"> <div className="row align-items-center">
<div className="col-lg-8"> <div className="col-lg-8">
<div className="contact-one__info wow fadeInLeft" data-wow-delay="100ms" style={{ visibility: "hidden" }}> <div className="contact-one__info wow fadeInLeft" data-wow-delay="100ms" style={{ visibility: "hidden" }}>
<div className="contact-one__info__icon"> <div className="contact-one__info__icon">
@ -60,8 +138,9 @@ const ContactSection = () => {
Let&apos;s call together just <span>contact</span> line Let&apos;s call together just <span>contact</span> line
</h3> </h3>
<p className="contact-one__info__text"> <p className="contact-one__info__text">
<a href="tel:255225551">++255225551</a>, <a href="tel:6544144444">+6544144444</a> <a href="tel:+16476797651">+1-647-679-7651</a>
</p> </p>
</div> </div>
</div> </div>
<div className="col-lg-4"> <div className="col-lg-4">
@ -95,23 +174,93 @@ const ContactSection = () => {
Get free Business touch Customers me. Get free Business touch Customers me.
</h3> </h3>
</div> </div>
<p className="contact-one__content__text">
Business tailored it design, management &amp; support services <br />business agency elit, sed do eiusmod tempor. {alert.show && (
</p> <div className={`alert alert-${alert.type === 'danger' ? 'danger' : 'success'} mb-4`} style={{ padding: '15px', color: '#fff', backgroundColor: alert.type === 'danger' ? 'rgba(255, 107, 107, 0.2)' : 'rgba(76, 175, 80, 0.2)', border: alert.type === 'danger' ? '1px solid #ff6b6b' : '1px solid #4CAF50', borderRadius: '8px' }}>
{alert.message}
</div>
)}
<form className="contact-one__form form-one" onSubmit={handleSubmit}> <form className="contact-one__form form-one" onSubmit={handleSubmit}>
<div className="form-one__group"> <div className="form-one__group">
<div className="form-one__control"> <div className="mb-20">
<input type="text" name="name" placeholder="Your Name" required /> <label className="form-label">Full Name</label>
<input
type="text"
name="name"
placeholder="Full Name"
value={formData.name}
onChange={handleChange}
className="form-input"
/>
{formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div> </div>
<div className="form-one__control"> <div className="mb-20">
<input type="email" name="email" placeholder="Email address" required /> <label className="form-label">Email Address</label>
<input
type="email"
name="email"
placeholder="Email Address"
value={formData.email}
onChange={handleChange}
className="form-input"
/>
{formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div> </div>
<div className="form-one__control form-one__control--full"> <div className="mb-20">
<textarea name="message" placeholder="Message" rows={6} required></textarea> <label className="form-label">Phone Number</label>
<input
type="text"
name="phone"
placeholder="Phone Number"
value={formData.phone}
onChange={handleChange}
className="form-input"
/>
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div> </div>
<div className="form-one__control form-one__control--full"> <div className="mb-20">
<button type="submit" className="tolak-btn"> <label className="form-label">Select Service</label>
<b>Send Request</b> <select
name="service"
value={formData.service}
onChange={handleChange}
className="form-select-custom"
>
<option value="">Select Service</option>
<option value="Website Development">Website Development</option>
<option value="Mobile Application Development">Mobile Application Development</option>
<option value="Graphic Designing">Graphic Designing</option>
<option value="UI / UX Designing">UI / UX Designing</option>
<option value="SEO & Content Writing">SEO & Content Writing</option>
<option value="Digital Marketing">Digital Marketing</option>
</select>
{formErrors.service && <small className="text-danger">{formErrors.service}</small>}
</div>
<div className="form-one__control--full mb-20">
<label className="form-label">Write Message</label>
<textarea
name="message"
placeholder="Write Message"
rows={4}
value={formData.message}
onChange={handleChange}
className="form-textarea"
></textarea>
{formErrors.message && <small className="text-danger">{formErrors.message}</small>}
</div>
<div className="form-one__control--full mb-3 mt-3">
<ReCAPTCHA
sitekey="6LekfpwrAAAAAOTwuP1d2gg-Fv9UEsAjE2gjOQJl"
onChange={handleCaptchaChange}
/>
{formErrors.captcha && <small className="text-danger">{formErrors.captcha}</small>}
</div>
<div className="form-one__control--full">
<button type="submit" className="submit-btn tolak-btn w-100">
<b>SEND A Message</b>
<span></span> <span></span>
</button> </button>
</div> </div>

View File

@ -1,10 +1,88 @@
"use client"; "use client";
import React from "react"; import React, { useState, useEffect } from "react";
import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios";
const FaqVideoSection = () => { const FaqVideoSection = () => {
const [formData, setFormData] = useState({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
const [formErrors, setFormErrors] = useState<any>({});
const [captchaToken, setCaptchaToken] = useState<string | null>(null);
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setFormData((prev) => ({ ...prev, [name]: value }));
};
const handleCaptchaChange = (token: string | null) => {
setCaptchaToken(token);
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
const errors: any = {};
if (!formData.name.trim()) errors.name = "Name is required.";
if (!formData.phone.trim()) errors.phone = "Phone is required.";
if (!formData.email.trim()) errors.email = "Email is required.";
if (!formData.service.trim()) errors.service = "Please select a service.";
if (!formData.message.trim()) errors.message = "Message is required.";
if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
setFormErrors(errors);
if (Object.keys(errors).length > 0) return;
const emailData = {
...formData,
message: `Service: ${formData.service}<br /><br />Message: ${formData.message}`,
to: "info@metatroncubesolutions.com",
senderName: "Metatroncube FAQ Section Contact",
recaptchaToken: captchaToken,
};
try {
const res = await axios.post("https://mailserver.metatronnest.com/send", emailData, {
headers: { "Content-Type": "application/json" },
});
setAlert({
show: true,
type: "success",
message: res?.data?.message || "Message sent successfully!",
});
setFormData({ name: "", phone: "", email: "", service: "", message: "" });
setCaptchaToken(null);
setFormErrors({});
} catch (error) {
console.error("Error sending email:", error);
setAlert({
show: true,
type: "danger",
message: "Failed to send message. Please try again later.",
});
}
};
useEffect(() => {
if (alert.show) {
const timer = setTimeout(() => {
setAlert((prev) => ({ ...prev, show: false }));
}, 5000);
return () => clearTimeout(timer);
}
}, [alert.show]);
return ( return (
<> <React.Fragment>
<section className="faq-two"> <section className="faq-two">
<div <div
className="faq-two__bg jarallax" className="faq-two__bg jarallax"
@ -18,22 +96,84 @@ const FaqVideoSection = () => {
<span className="section-subtitle">Get In Touch</span> <span className="section-subtitle">Get In Touch</span>
<h2 className="section-heading text-white">Have a Project in Mind?</h2> <h2 className="section-heading text-white">Have a Project in Mind?</h2>
</div> </div>
<form className="faq-contact-form">
{alert.show && (
<div className={`faq-alert alert-${alert.type}`}>
{alert.message}
</div>
)}
<form className="faq-contact-form" onSubmit={handleSubmit}>
<div className="row"> <div className="row">
<div className="col-md-6 mb-20"> <div className="col-md-6 mb-20">
<input type="text" placeholder="Your Name" required /> <label className="faq-form-label">Full Name</label>
<input
type="text"
name="name"
placeholder="Full Name"
value={formData.name}
onChange={handleChange}
/>
{formErrors.name && <small className="faq-error">{formErrors.name}</small>}
</div> </div>
<div className="col-md-6 mb-20"> <div className="col-md-6 mb-20">
<input type="email" placeholder="Email Address" required /> <label className="faq-form-label">Email Address</label>
<input
type="email"
name="email"
placeholder="Email Address"
value={formData.email}
onChange={handleChange}
/>
{formErrors.email && <small className="faq-error">{formErrors.email}</small>}
</div> </div>
<div className="col-md-6 mb-20"> <div className="col-md-6 mb-20">
<input type="tel" placeholder="Phone Number" required /> <label className="faq-form-label">Phone Number</label>
<input
type="tel"
name="phone"
placeholder="Phone Number"
value={formData.phone}
onChange={handleChange}
/>
{formErrors.phone && <small className="faq-error">{formErrors.phone}</small>}
</div> </div>
<div className="col-md-6 mb-20"> <div className="col-md-6 mb-20">
<input type="text" placeholder="Subject" required /> <label className="faq-form-label">Select Service</label>
<select
name="service"
value={formData.service}
onChange={handleChange}
className="faq-select"
>
<option value="">Select Service</option>
<option value="Website Development">Website Development</option>
<option value="Mobile Application Development">Mobile Application Development</option>
<option value="Graphic Designing">Graphic Designing</option>
<option value="UI / UX Designing">UI / UX Designing</option>
<option value="SEO & Content Writing">SEO & Content Writing</option>
<option value="Digital Marketing">Digital Marketing</option>
</select>
{formErrors.service && <small className="faq-error">{formErrors.service}</small>}
</div> </div>
<div className="col-md-12 mb-20"> <div className="col-md-12 mb-20">
<textarea placeholder="Write a Message" rows={7} required></textarea> <label className="faq-form-label">Write Message</label>
<textarea
name="message"
placeholder="Write a Message"
rows={5}
value={formData.message}
onChange={handleChange}
></textarea>
{formErrors.message && <small className="faq-error">{formErrors.message}</small>}
</div>
<div className="col-md-12 mb-20">
<ReCAPTCHA
sitekey="6LekfpwrAAAAAOTwuP1d2gg-Fv9UEsAjE2gjOQJl"
onChange={handleCaptchaChange}
theme="dark"
/>
{formErrors.captcha && <small className="faq-error">{formErrors.captcha}</small>}
</div> </div>
<div className="col-md-12 text-center"> <div className="col-md-12 text-center">
<button type="submit" className="primary-btn-1"> <button type="submit" className="primary-btn-1">
@ -68,142 +208,7 @@ const FaqVideoSection = () => {
</div> </div>
</div> </div>
</section> </section>
</React.Fragment>
<style jsx>{`
.faq-two {
padding: 120px 0 200px;
position: relative;
background-color: #0f172a;
clip-path: none !important;
}
.faq-two__bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-attachment: fixed;
background-size: cover;
opacity: 0.15;
}
.contact-form-card {
background: rgba(26, 31, 43, 0.8);
backdrop-filter: blur(10px);
padding: 60px;
border-radius: 30px;
border: 1px solid rgba(255, 255, 255, 0.05);
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.3);
margin-bottom: 20px;
}
.section-subtitle {
color: #3779b9;
text-transform: uppercase;
letter-spacing: 2px;
font-weight: 700;
font-size: 14px;
display: block;
margin-bottom: 15px;
}
.section-heading {
font-size: 42px;
font-weight: 800;
margin-bottom: 0;
}
.faq-contact-form input,
.faq-contact-form textarea {
width: 100%;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 18px 25px;
border-radius: 12px;
color: #fff;
outline: none;
transition: all 0.3s ease;
}
.faq-contact-form textarea {
min-height: 220px;
resize: vertical;
}
.faq-contact-form input:focus,
.faq-contact-form textarea:focus {
background: rgba(255, 255, 255, 0.05);
border-color: #3779b9;
box-shadow: 0 0 15px rgba(55, 121, 185, 0.2);
}
.primary-btn-1, .primary-btn-1-link {
background: #3779b9;
color: #fff;
padding: 18px 45px;
border-radius: 50px;
font-weight: 700;
border: none;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 10px;
transition: all 0.3s ease;
text-transform: uppercase;
font-size: 14px;
letter-spacing: 1px;
margin-top: 25px;
}
.primary-btn-1:hover, .primary-btn-1-link:hover {
transform: translateY(-3px);
box-shadow: 0 15px 30px rgba(55, 121, 185, 0.4);
color: #fff;
}
.video-three__inner {
border-radius: 30px;
overflow: hidden;
min-height: 500px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.video-three__inner::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(15, 23, 42, 0.6);
}
.video-content-overlay {
position: relative;
z-index: 1;
text-align: center;
max-width: 800px;
padding: 0 20px;
}
.consultation-title {
font-size: 48px;
color: #fff;
font-weight: 800;
line-height: 1.2;
margin-bottom: 20px;
}
.consultation-text {
font-size: 20px;
color: rgba(255, 255, 255, 0.8);
margin-bottom: 0;
}
@media (max-width: 991px) {
.consultation-title {
font-size: 36px;
}
.contact-form-card {
padding: 40px 30px;
}
}
@media (max-width: 767px) {
.consultation-title {
font-size: 30px;
}
}
`}</style>
</>
); );
}; };

View File

@ -80,7 +80,7 @@ const ServiceSection2 = () => {
<span className={service.icon}></span> <span className={service.icon}></span>
</div> </div>
<h3 className="service-three__item__title"> <h3 className="service-three__item__title">
<Link href={`/services/${service.slug}`}>{service.title}</Link> <Link href={`/services-digital-solutions/${service.slug}`}>{service.title}</Link>
</h3> </h3>
<p className="service-three__item__text">{service.description}</p> <p className="service-three__item__text">{service.description}</p>
</div> </div>

View File

@ -3,12 +3,6 @@ import React, { useEffect, useState } from 'react';
import { createPortal } from 'react-dom'; import { createPortal } from 'react-dom';
import ReCAPTCHA from "react-google-recaptcha"; import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios"; import axios from "axios";
interface ContactPopupProps {
isOpen: boolean;
onClose: () => void;
}
import ContactStatus from '../../contact/ContactStatus'; import ContactStatus from '../../contact/ContactStatus';
interface ContactPopupProps { interface ContactPopupProps {
@ -35,7 +29,6 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
setMounted(true); setMounted(true);
}, []); }, []);
// Close on ESC key
useEffect(() => { useEffect(() => {
const handleEsc = (e: KeyboardEvent) => { const handleEsc = (e: KeyboardEvent) => {
if (e.key === 'Escape') onClose(); if (e.key === 'Escape') onClose();
@ -63,7 +56,7 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
if (!formData.businessName.trim()) errors.businessName = "Business name requested."; if (!formData.businessName.trim()) errors.businessName = "Business name requested.";
if (!formData.projectRequirement.trim()) errors.projectRequirement = "Requirement details needed."; if (!formData.projectRequirement.trim()) errors.projectRequirement = "Requirement details needed.";
if (!formData.budgetRange) errors.budgetRange = "Please select a budget range."; if (!formData.budgetRange) errors.budgetRange = "Please select a budget range.";
// if (!captchaToken) errors.captcha = "Please verify the CAPTCHA."; if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
setFormErrors(errors); setFormErrors(errors);
if (Object.keys(errors).length > 0) return; if (Object.keys(errors).length > 0) return;
@ -73,7 +66,7 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
const emailData = { const emailData = {
...formData, ...formData,
message: `Business: ${formData.businessName}<br />Budget: ${formData.budgetRange}<br /><br />Requirement: ${formData.projectRequirement}`, message: `Business: ${formData.businessName}<br />Budget: ${formData.budgetRange}<br /><br />Requirement: ${formData.projectRequirement}`,
to: "akashlucaas@gmail.com", to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Contact Popup", senderName: "Metatroncube Contact Popup",
recaptchaToken: captchaToken, recaptchaToken: captchaToken,
}; };
@ -149,7 +142,6 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
</div> </div>
</div> </div>
{/* Right Side: Form */}
<div className="col-lg-7 form-panel"> <div className="col-lg-7 form-panel">
<button onClick={onClose} className="close-btn"> <button onClick={onClose} className="close-btn">
<i className="fa-solid fa-xmark"></i> <i className="fa-solid fa-xmark"></i>
@ -160,19 +152,19 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
<h3 className="form-title">Start Your Project</h3> <h3 className="form-title">Start Your Project</h3>
<form className="contact-form" onSubmit={handleSubmit}> <form className="contact-form" onSubmit={handleSubmit}>
<div className="row g-3"> <div className="row g-3">
<div className="col-md-6"> <div className="col-sm-6">
<input type="text" name="name" placeholder="Full Name" value={formData.name} onChange={handleChange} className="form-input" disabled={status === 'submitting'} /> <input type="text" name="name" placeholder="Full Name" value={formData.name} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.name && <small className="text-danger">{formErrors.name}</small>} {formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div> </div>
<div className="col-md-6"> <div className="col-sm-6">
<input type="email" name="email" placeholder="Email Address" value={formData.email} onChange={handleChange} className="form-input" disabled={status === 'submitting'} /> <input type="email" name="email" placeholder="Email Address" value={formData.email} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.email && <small className="text-danger">{formErrors.email}</small>} {formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div> </div>
<div className="col-md-6"> <div className="col-sm-6">
<input type="text" name="phone" placeholder="Phone Number" value={formData.phone} onChange={handleChange} className="form-input" disabled={status === 'submitting'} /> <input type="text" name="phone" placeholder="Phone Number" value={formData.phone} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>} {formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div> </div>
<div className="col-md-6"> <div className="col-sm-6">
<input type="text" name="businessName" placeholder="Business Name" value={formData.businessName} onChange={handleChange} className="form-input" disabled={status === 'submitting'} /> <input type="text" name="businessName" placeholder="Business Name" value={formData.businessName} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.businessName && <small className="text-danger">{formErrors.businessName}</small>} {formErrors.businessName && <small className="text-danger">{formErrors.businessName}</small>}
</div> </div>
@ -222,239 +214,6 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
</div> </div>
</div> </div>
</div> </div>
<style jsx>{`
.status-wrapper {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.contact-popup-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(2, 6, 11, 0.85);
backdrop-filter: blur(8px);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
opacity: 0;
visibility: hidden;
transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
}
.contact-popup-overlay.active {
opacity: 1;
visibility: visible;
}
.contact-popup-content {
background: #fff;
width: 100%;
max-width: 1000px;
max-height: 95vh;
border-radius: 20px;
overflow: hidden;
box-shadow: 0 40px 100px rgba(0,0,0,0.4);
position: relative;
display: flex;
flex-direction: column;
}
.info-panel {
padding: 50px;
display: flex;
flex-direction: column;
justify-content: center;
}
.info-inner {
position: relative;
z-index: 1;
}
.title {
font-size: 28px;
font-weight: 800;
margin-bottom: 15px;
line-height: 1.2;
color: #ffffff !important;
}
.desc {
font-size: 15px;
color: #ffffff !important;
line-height: 1.5;
}
.contact-details {
margin-top: 30px;
margin-bottom: 25px;
}
.detail-item {
display: flex;
align-items: center;
margin-bottom: 15px;
gap: 12px;
}
.icon {
width: 40px;
height: 40px;
border-radius: 50%;
background: rgba(255,255,255,0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.text p {
margin: 0;
color: #ffffff !important;
font-size: 12px;
}
.text h5 {
margin: 0;
font-size: 15px;
color: #ffffff !important;
}
.social-links {
display: flex;
gap: 10px;
}
.social-icon {
width: 32px;
height: 32px;
border-radius: 50%;
background: rgba(255,255,255,0.1);
display: flex;
align-items: center;
justify-content: center;
color: #fff;
transition: 0.3s;
font-size: 13px;
}
.social-icon:hover {
background: #fff;
color: #3779b9;
}
.form-panel {
padding: 40px 50px;
position: relative;
background: #fff;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: #3779b9 #f1f1f1;
}
.form-panel::-webkit-scrollbar { width: 6px; }
.form-panel::-webkit-scrollbar-track { background: #f1f1f1; }
.form-panel::-webkit-scrollbar-thumb { background: #3779b9; border-radius: 10px; }
.close-btn {
position: absolute;
top: 20px;
right: 20px;
background: #f3f4f6;
border: none;
width: 35px;
height: 35px;
border-radius: 50%;
font-size: 18px;
cursor: pointer;
color: #1a1f2b;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
z-index: 100;
}
.close-btn:hover {
background: #3779b9;
color: #fff;
transform: rotate(90deg);
}
.form-title {
font-size: 24px;
font-weight: 700;
margin-bottom: 20px;
color: #1a1f2b;
}
.form-input, .form-textarea, .form-select {
width: 100%;
padding: 10px 15px;
border-radius: 8px;
border: 1px solid #e2e8f0;
outline: none;
background: #f8fafc;
transition: 0.2s;
font-size: 13.5px;
}
.form-input:focus, .form-textarea:focus, .form-select:focus {
border-color: #3779b9;
background: #fff;
box-shadow: 0 0 0 3px rgba(55,121,185,0.1);
}
.form-textarea { resize: none; }
.submit-btn {
width: 100%;
border: none;
padding: 14px;
border-radius: 8px;
margin-top: 15px;
background: #3779b9;
color: #fff;
font-weight: 700;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
}
.submit-btn:hover:not(:disabled) {
background: #1a1f2b;
transform: translateY(-1px);
}
/* Mobile Optimizations */
@media (max-width: 991px) {
.info-panel { display: none; }
.form-panel { padding: 40px 30px; }
.contact-popup-content { max-width: 550px; }
}
@media (max-width: 575px) {
.contact-popup-overlay { padding: 10px; }
.contact-popup-content { border-radius: 15px; }
.form-panel { padding: 30px 20px; }
.form-title { font-size: 20px; margin-bottom: 15px; }
.form-input, .form-textarea, .form-select { font-size: 13px; padding: 8px 12px; }
/* Scale ReCAPTCHA for small screens */
.g-recaptcha {
transform: scale(0.85);
-webkit-transform: scale(0.85);
transform-origin: 0 0;
-webkit-transform-origin: 0 0;
}
}
@media (max-width: 375px) {
.form-panel { padding: 25px 15px; }
.g-recaptcha {
transform: scale(0.77);
-webkit-transform: scale(0.77);
}
}
@media (max-width: 320px) {
.form-panel { padding: 15px 10px; }
.form-title { font-size: 16px; margin-bottom: 8px; }
.form-input, .form-textarea, .form-select { font-size: 12px; padding: 6px 10px; }
.submit-btn { padding: 10px; font-size: 12px; margin-top: 10px; }
.row.g-3 { --bs-gutter-y: 0.5rem; --bs-gutter-x: 0.5rem; }
.mt-3 { margin-top: 0.5rem !important; }
.g-recaptcha {
transform: scale(0.68);
-webkit-transform: scale(0.68);
}
}
`}</style>
</div> </div>
); );

View File

@ -2,22 +2,10 @@ import React from 'react';
const GoogleReviewsBranding = ({ centered = false }) => { const GoogleReviewsBranding = ({ centered = false }) => {
return ( return (
<div className="google-reviews-branding" style={{ <div className="google-reviews-branding-global" style={{
marginTop: '15px', alignItems: centered ? 'center' : 'flex-start'
display: 'flex',
flexDirection: 'column',
alignItems: centered ? 'center' : 'flex-start',
gap: '0px'
}}>
<div style={{
fontSize: '28px',
fontWeight: '700',
lineHeight: '1.2',
letterSpacing: '3px',
fontFamily: '"Product Sans", "Google Sans", Roboto, Arial, sans-serif',
display: 'flex',
alignItems: 'center'
}}> }}>
<div className="google-logo">
<span style={{ color: '#4285F4' }}>G</span> <span style={{ color: '#4285F4' }}>G</span>
<span style={{ color: '#EA4335' }}>o</span> <span style={{ color: '#EA4335' }}>o</span>
<span style={{ color: '#FBBC04' }}>o</span> <span style={{ color: '#FBBC04' }}>o</span>
@ -25,23 +13,9 @@ const GoogleReviewsBranding = ({ centered = false }) => {
<span style={{ color: '#34A853' }}>l</span> <span style={{ color: '#34A853' }}>l</span>
<span style={{ color: '#EA4335' }}>e</span> <span style={{ color: '#EA4335' }}>e</span>
</div> </div>
<div style={{ <div className="reviews-text-stars">
fontSize: '13px',
fontWeight: '700',
lineHeight: '1.2',
fontFamily: '"Product Sans", "Google Sans", Roboto, Arial, sans-serif',
display: 'flex',
alignItems: 'center',
gap: '5px',
marginTop: '-2px'
}}>
<span style={{ color: '#fff' }}>Reviews</span> <span style={{ color: '#fff' }}>Reviews</span>
<div style={{ <div className="stars-container">
display: 'flex',
gap: '1px',
fontSize: '13px',
lineHeight: '1'
}}>
<span style={{ color: '#FBBC04' }}></span> <span style={{ color: '#FBBC04' }}></span>
<span style={{ color: '#FBBC04' }}></span> <span style={{ color: '#FBBC04' }}></span>
<span style={{ color: '#FBBC04' }}></span> <span style={{ color: '#FBBC04' }}></span>

View File

@ -1,19 +1,106 @@
import React from "react"; "use client";
import React, { useState, useEffect } from "react";
import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios";
const ContactSection = () => { const ContactSection = () => {
const [formData, setFormData] = useState({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
const [formErrors, setFormErrors] = useState<any>({});
const [captchaToken, setCaptchaToken] = useState<string | null>(null);
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setFormData((prev) => ({ ...prev, [name]: value }));
};
const handleCaptchaChange = (token: string | null) => {
setCaptchaToken(token);
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
const errors: any = {};
if (!formData.name.trim()) errors.name = "Name is required.";
if (!formData.phone.trim()) errors.phone = "Phone is required.";
if (!formData.email.trim()) errors.email = "Email is required.";
if (!formData.service.trim()) errors.service = "Please select a service.";
if (!formData.message.trim()) errors.message = "Message is required.";
if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
setFormErrors(errors);
if (Object.keys(errors).length > 0) return;
const emailData = {
...formData,
message: `Service: ${formData.service}<br /><br />Message: ${formData.message}`,
to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Contact Page",
recaptchaToken: captchaToken,
};
try {
const res = await axios.post("https://mailserver.metatronnest.com/send", emailData, {
headers: { "Content-Type": "application/json" },
});
setAlert({
show: true,
type: "success",
message: res?.data?.message || "Message sent successfully!",
});
setFormData({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
setCaptchaToken(null);
setFormErrors({});
} catch (error) {
console.error("❌ Error sending email:", error);
setAlert({
show: true,
type: "danger",
message: "Failed to send message. Please try again later.",
});
}
};
useEffect(() => {
if (alert.show) {
const timer = setTimeout(() => {
setAlert((prev) => ({ ...prev, show: false }));
}, 5000);
return () => clearTimeout(timer);
}
}, [alert.show]);
return ( return (
<>
<section className="contact-area section-space"> <section className="contact-area section-space">
<div className="container"> <div className="container">
<div className="row"> <div className="row">
<div className="col-lg-5 col-md-12"> <div className="col-lg-5 col-md-12">
<div className="contact-info-wrapper"> <div className="contact-info-wrapper">
<div className="sec-title-wrapper mb-40"> <div className="sec-title-wrapper">
<div className="sec-title"> <div className="sec-title">
<div className="sec-title__shape"></div> <div className="sec-title__shape"></div>
<h6 className="sec-title__tagline">CONTACT WITH US</h6> <h6 className="sec-title__tagline">CONTACT WITH US</h6>
<h3 className="sec-title__title">Feel Free to Get in Touch</h3> <h3 className="sec-title__title">Feel Free to Get in Touch</h3>
</div> </div>
{/* <img src="https://bracketweb.com/pelocishtml/assets/images/shapes/text-shape-2.png" alt="" className="sec-title__text-shape" /> */} <img src="https://bracketweb.com/pelocishtml/assets/images/shapes/text-shape-2.png" alt="" className="sec-title__text-shape" />
</div> </div>
<div className="contact-info-list"> <div className="contact-info-list">
<div className="contact-info-item d-flex align-items-center mb-30"> <div className="contact-info-item d-flex align-items-center mb-30">
@ -22,7 +109,7 @@ const ContactSection = () => {
</div> </div>
<div className="content"> <div className="content">
<span>Call Anytime</span> <span>Call Anytime</span>
<h6><a href="tel:+8898006802">+ 88 ( 9800 ) 6802</a></h6> <h6><a href="tel:+16476797651">+1-647-679-7651</a></h6>
</div> </div>
</div> </div>
<div className="contact-info-item d-flex align-items-center mb-30"> <div className="contact-info-item d-flex align-items-center mb-30">
@ -31,7 +118,7 @@ const ContactSection = () => {
</div> </div>
<div className="content"> <div className="content">
<span>Send Email</span> <span>Send Email</span>
<h6><a href="mailto:needhelp@company.com">needhelp@company.com</a></h6> <h6><a href="mailto:info@metatroncubesolutions.com">info@metatroncubesolutions.com</a></h6>
</div> </div>
</div> </div>
<div className="contact-info-item d-flex align-items-center"> <div className="contact-info-item d-flex align-items-center">
@ -40,7 +127,7 @@ const ContactSection = () => {
</div> </div>
<div className="content"> <div className="content">
<span>Visit Now</span> <span>Visit Now</span>
<h6>88 Broklyn Golden Street. New York, USA</h6> <h6>Canada</h6>
</div> </div>
</div> </div>
</div> </div>
@ -48,24 +135,94 @@ const ContactSection = () => {
</div> </div>
<div className="col-lg-7 col-md-12"> <div className="col-lg-7 col-md-12">
<div className="contact-form-wrapper bg-color-light p-relative"> <div className="contact-form-wrapper bg-color-light p-relative">
<form action="#" className="contact-form"> <form className="contact-form" onSubmit={handleSubmit}>
<div className="row"> {alert.show && (
<div className="col-md-6 mb-20"> <div className={`alert alert-${alert.type === 'danger' ? 'danger' : 'success'} mb-4`} style={{ padding: '15px', borderRadius: '12px' }}>
<input type="text" placeholder="Your Name" required /> {alert.message}
</div> </div>
<div className="col-md-6 mb-20"> )}
<input type="email" placeholder="Email Address" required /> <div className="form-one__group">
<div className="mb-20">
<label className="form-label">Full Name</label>
<input
type="text"
name="name"
placeholder="Full Name"
value={formData.name}
onChange={handleChange}
/>
{formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div> </div>
<div className="col-md-6 mb-20"> <div className="mb-20">
<input type="tel" placeholder="Phone Number" required /> <label className="form-label">Email Address</label>
<input
type="email"
name="email"
placeholder="Email Address"
value={formData.email}
onChange={handleChange}
/>
{formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div> </div>
<div className="col-md-6 mb-20"> <div className="mb-20">
<input type="text" placeholder="Subject" required /> <label className="form-label">Phone Number</label>
<input
type="tel"
name="phone"
placeholder="Phone Number"
value={formData.phone}
onChange={handleChange}
/>
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div> </div>
<div className="col-md-12 mb-20"> <div className="mb-20">
<textarea placeholder="Write a Message" rows={7} required></textarea> <label className="form-label">Select Service</label>
<select
name="service"
value={formData.service}
onChange={handleChange}
style={{
width: '100%',
padding: '18px 25px',
border: '1px solid #e2e8f0',
backgroundColor: '#fff',
borderRadius: '12px',
outline: 'none',
fontSize: '15px',
color: '#1e293b'
}}
>
<option value="">Select Service</option>
<option value="Website Development">Website Development</option>
<option value="Mobile Application Development">Mobile Application Development</option>
<option value="Graphic Designing">Graphic Designing</option>
<option value="UI / UX Designing">UI / UX Designing</option>
<option value="SEO & Content Writing">SEO & Content Writing</option>
<option value="Digital Marketing">Digital Marketing</option>
</select>
{formErrors.service && <small className="text-danger">{formErrors.service}</small>}
</div> </div>
<div className="col-md-12"> <div className="form-one__control--full mb-20">
<label className="form-label">Write Message</label>
<textarea
name="message"
placeholder="Write a Message"
rows={5}
value={formData.message}
onChange={handleChange}
></textarea>
{formErrors.message && <small className="text-danger">{formErrors.message}</small>}
</div>
<div className="form-one__control--full mb-4">
<ReCAPTCHA
sitekey="6LekfpwrAAAAAOTwuP1d2gg-Fv9UEsAjE2gjOQJl"
onChange={handleCaptchaChange}
/>
{formErrors.captcha && <small className="text-danger">{formErrors.captcha}</small>}
</div>
<div className="form-one__control--full">
<button type="submit" className="primary-btn-1 w-100"> <button type="submit" className="primary-btn-1 w-100">
SEND A MESSAGE SEND A MESSAGE
</button> </button>
@ -76,147 +233,8 @@ const ContactSection = () => {
</div> </div>
</div> </div>
</div> </div>
<style jsx>{`
.contact-area {
padding: 80px 0;
background: #fff;
}
@media (max-width: 767px) {
.contact-area {
padding: 60px 0;
}
}
.section-subtitle {
color: #3779b9;
font-weight: 600;
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 12px;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;
}
.section-subtitle .dash {
width: 25px;
height: 2px;
background: #3779b9;
display: inline-block;
}
.section-title {
font-size: 52px;
font-weight: 800;
color: #0f172a;
line-height: 1.1;
margin-bottom: 45px;
}
.contact-info-item .icon {
width: 75px;
height: 75px;
background: #fff;
border: 1px solid rgba(99, 102, 241, 0.2);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 25px;
color: #3779b9;
font-size: 28px;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 10px 25px rgba(99, 102, 241, 0.1);
}
.contact-info-item:hover .icon {
background: #3779b9;
color: #fff;
transform: scale(1.1) rotate(10deg);
box-shadow: 0 15px 30px rgba(99, 102, 241, 0.3);
}
.contact-info-item .content span {
display: block;
font-size: 13px;
color: #64748b;
margin-bottom: 6px;
text-transform: uppercase;
letter-spacing: 1px;
font-weight: 600;
}
.contact-info-item .content h6 {
font-size: 22px;
font-weight: 700;
margin: 0;
color: #1e293b;
}
.contact-info-item .content h6 a {
color: inherit;
text-decoration: none;
transition: color 0.3s ease;
}
.contact-info-item .content h6 a:hover {
color: #3779b9;
}
.contact-form-wrapper {
background: #1a1f2b;
padding: 60px;
border-radius: 24px;
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.03);
}
.contact-form input,
.contact-form textarea {
width: 100%;
padding: 18px 25px;
border: 1px solid #e2e8f0;
background: #fff;
border-radius: 12px;
outline: none;
transition: all 0.3s ease;
font-size: 15px;
color: #1e293b;
}
.contact-form textarea {
min-height: 180px;
resize: vertical;
}
.contact-form input:focus,
.contact-form textarea:focus {
border-color: #3779b9;
box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);
}
.primary-btn-1 {
background: #3779b9;
color: #fff;
padding: 20px 30px;
border: none;
border-radius: 12px;
font-weight: 700;
cursor: pointer;
transition: all 0.3s ease;
text-transform: uppercase;
letter-spacing: 1.5px;
font-size: 15px;
margin-top: 10px;
box-shadow: 0 10px 20px rgba(99, 102, 241, 0.2);
}
.primary-btn-1:hover {
background: #3779b9;
transform: translateY(-3px);
box-shadow: 0 15px 30px rgba(55, 121, 185, 0.5);
}
@media (max-width: 991px) {
.contact-form-wrapper {
margin-top: 60px;
padding: 40px;
}
.section-title {
font-size: 36px;
}
}
@media (max-width: 575px) {
.contact-form-wrapper {
padding: 25px;
}
}
`}</style>
</section> </section>
</>
); );
}; };

View File

@ -41,170 +41,6 @@ const ContactStatus: React.FC<ContactStatusProps> = ({ type, message, onClose })
</button> </button>
</div> </div>
<style jsx>{`
.status-container {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 400px;
padding: 20px;
animation: fadeIn 0.5s ease-out;
}
.status-card {
background: #fff;
width: 100%;
max-width: 400px;
padding: 60px 40px;
border-radius: 24px;
text-align: center;
position: relative;
overflow: hidden;
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.05);
animation: slideUp 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.bubbles {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.bubble {
position: absolute;
border-radius: 50%;
opacity: 0.6;
}
/* Success Bubbles */
.success .bubble { background: #87b031; }
/* Error Bubbles */
.error .bubble { background: #f1595d; }
.bubble-1 { width: 12px; height: 12px; top: 15%; left: 10%; animation: float 3s infinite ease-in-out; }
.bubble-2 { width: 8px; height: 8px; top: 25%; right: 15%; animation: float 4s infinite ease-in-out; }
.bubble-3 { width: 15px; height: 15px; bottom: 20%; left: 15%; animation: float 5s infinite ease-in-out; }
.bubble-4 { width: 10px; height: 10px; bottom: 15%; right: 10%; animation: float 3.5s infinite ease-in-out; }
.bubble-5 { width: 6px; height: 6px; top: 40%; left: 5%; animation: float 6s infinite ease-in-out; }
.bubble-6 { width: 14px; height: 14px; top: 60%; right: 5%; animation: float 4.5s infinite ease-in-out; }
.bubble-7 { width: 9px; height: 9px; top: 10%; right: 30%; animation: float 3.2s infinite ease-in-out; }
.bubble-8 { width: 11px; height: 11px; bottom: 10%; left: 40%; animation: float 4.8s infinite ease-in-out; }
.bubble-9 { width: 7px; height: 7px; top: 50%; left: 20%; animation: float 5.5s infinite ease-in-out; }
.bubble-10 { width: 13px; height: 13px; bottom: 40%; right: 25%; animation: float 3.8s infinite ease-in-out; }
.bubble-11 { width: 8px; height: 8px; top: 70%; left: 35%; animation: float 4.2s infinite ease-in-out; }
.bubble-12 { width: 10px; height: 10px; top: 5%; left: 50%; animation: float 3.6s infinite ease-in-out; }
@keyframes float {
0%, 100% { transform: translateY(0) scale(1); }
50% { transform: translateY(-15px) scale(1.1); }
}
.icon-wrapper {
margin-bottom: 30px;
display: flex;
justify-content: center;
animation: bounce 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) 0.3s both;
}
.icon-circle {
width: 100px;
height: 100px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 40px;
position: relative;
}
.success .icon-circle {
background: rgba(135, 176, 49, 0.15);
color: #87b031;
border: 4px solid #87b031;
}
.error .icon-circle {
background: rgba(241, 89, 93, 0.15);
color: #f1595d;
border: 4px solid #f1595d;
}
.status-title {
font-size: 32px;
font-weight: 800;
margin-bottom: 12px;
animation: fadeIn 0.5s ease-out 0.5s both;
}
.success .status-title { color: #87b031; }
.error .status-title { color: #f1595d; }
.status-message {
font-size: 16px;
color: #64748b;
margin-bottom: 40px;
line-height: 1.6;
animation: fadeIn 0.5s ease-out 0.6s both;
}
.status-btn {
padding: 16px 40px;
border: none;
border-radius: 14px;
font-weight: 700;
font-size: 16px;
cursor: pointer;
transition: all 0.3s ease;
width: 100%;
max-width: 200px;
animation: fadeIn 0.5s ease-out 0.7s both;
}
.success .status-btn {
background: #87b031;
color: #fff;
box-shadow: 0 10px 20px rgba(135, 176, 49, 0.3);
}
.success .status-btn:hover {
background: #769a2b;
transform: translateY(-3px);
box-shadow: 0 15px 30px rgba(135, 176, 49, 0.4);
}
.error .status-btn {
background: #f1595d;
color: #fff;
box-shadow: 0 10px 20px rgba(241, 89, 93, 0.3);
}
.error .status-btn:hover {
background: #e04a4e;
transform: translateY(-3px);
box-shadow: 0 15px 30px rgba(241, 89, 93, 0.4);
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(40px) scale(0.9); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes bounce {
0% { transform: scale(0); }
60% { transform: scale(1.1); }
80% { transform: scale(0.95); }
100% { transform: scale(1); }
}
`}</style>
</div> </div>
); );
}; };

View File

@ -17,25 +17,6 @@ const MapSection = () => {
></iframe> ></iframe>
</div> </div>
</div> </div>
<style jsx>{`
.map-area {
margin-bottom: -10px; /* Adjust as needed to align with footer */
}
.map-wrapper {
height: 500px;
width: 100%;
overflow: hidden;
border: none;
}
iframe {
display: block;
width: 100%;
height: 100%;
border: none;
background: transparent;
filter: grayscale(1); /* Optional: Adjust to match the design */
}
`}</style>
</section> </section>
); );
}; };

View File

@ -229,143 +229,6 @@ const FaqPageSection = () => {
</div> </div>
</div> </div>
<style jsx>{`
.faq-page-section {
background: #f8fbff;
padding: 80px 0;
}
.section-subtitle {
color: #3779b9;
font-weight: 700;
margin-bottom: 15px;
display: inline-flex;
align-items: center;
gap: 10px;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 14px;
}
.subtitle-icon {
width: 20px;
height: 20px;
object-fit: contain;
}
.section-title {
font-size: 48px;
font-weight: 800;
color: #1a1f2b;
margin-bottom: 20px;
}
.section-desc {
color: #64748b;
font-size: 16px;
}
@media (max-width: 991px) {
.section-desc {
margin-top: 20px !important;
padding-left: 0 !important;
border-left: none !important;
}
}
.faq-item {
background: #fff;
border-radius: 12px;
border: 1px solid #e2e8f0;
margin-bottom: 15px;
overflow: hidden;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0,0,0,0.02);
}
.faq-item.active {
border-color: #3779b9;
box-shadow: 0 10px 30px rgba(55, 121, 185, 0.1);
}
.faq-question {
width: 100%;
padding: 18px 25px;
display: flex;
justify-content: space-between;
align-items: center;
background: none;
border: none;
text-align: left;
cursor: pointer;
outline: none;
}
.question-text {
font-size: 15px;
font-weight: 700;
color: #1a1f2b;
line-height: 1.4;
}
.faq-item.active .question-text {
color: #3779b9;
}
.faq-icon {
width: 28px;
height: 28px;
min-width: 28px;
background: #f1f5f9;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
color: #64748b;
transition: all 0.3s ease;
}
.faq-item.active .faq-icon {
background: #3779b9;
color: #fff;
transform: rotate(180deg);
}
.faq-answer {
max-height: 0;
overflow: hidden;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.faq-answer.show {
max-height: 300px;
}
.answer-inner {
padding: 0 25px 20px;
color: #64748b;
line-height: 1.6;
font-size: 14px;
}
.faq-center-image-wrap {
padding: 0 15px;
}
.main-faq-img {
width: 100%;
max-width: 400px;
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
@media (max-width: 991px) {
.col-lg-4 {
margin-bottom: 30px;
}
.faq-center-image-wrap {
order: -1;
margin-bottom: 40px;
}
.section-title {
font-size: 36px;
}
}
.cta-box h3 {
font-size: 32px;
font-weight: 800;
color: #1a1f2b;
margin-bottom: 15px;
}
.cta-box p {
color: #64748b;
font-size: 18px;
margin-bottom: 30px;
}
`}</style>
</section> </section>
); );
}; };

View File

@ -6,6 +6,27 @@ const CounsellingSolutions: React.FC = () => {
<section className="counselling-solutions"> <section className="counselling-solutions">
<div className="container"> <div className="container">
<div className="row"> <div className="row">
<div className="col-lg-6">
<div className="counselling-solutions__image">
<img
src="https://bracketweb.com/pelocishtml/assets/images/resources/counselling-solutions-1-1.png"
alt="pelocis"
className="counselling-solutions__image__one"
/>
<img
src="https://bracketweb.com/pelocishtml/assets/images/resources/counselling-solutions-1-2.png"
alt="pelocis"
className="counselling-solutions__image__two"
/>
<div className="counselling-solutions__image__watch-btn">
<Link href="https://www.youtube.com/watch?v=h9MbznbxlLc" className="video-popup">
<i className="icon-play"></i>
</Link>
<span>WATCH VIDEO</span>
</div>
</div>
</div>
<div className="col-lg-6"> <div className="col-lg-6">
<div className="counselling-solutions__title"> <div className="counselling-solutions__title">
<div className="sec-title"> <div className="sec-title">
@ -34,32 +55,13 @@ const CounsellingSolutions: React.FC = () => {
The right therapist can help you develop the skills to manage The right therapist can help you develop the skills to manage
</li> </li>
</ul> </ul>
<Link href="#" className="pelocis-btn"> <div className="about-btn-box mt-4">
<span> <Link className="primary-btn-1 btn-hover" href="/about">
Discover More <i className="icon-right-arrow-white"></i> Discover More &nbsp; | <i className="fa-solid fa-arrow-right"></i>
</span> <span className="btn-hover-span"></span>
</Link> </Link>
</div> </div>
</div> </div>
<div className="col-lg-6">
<div className="counselling-solutions__image">
<img
src="https://bracketweb.com/pelocishtml/assets/images/resources/counselling-solutions-1-1.png"
alt="pelocis"
className="counselling-solutions__image__one"
/>
<img
src="https://bracketweb.com/pelocishtml/assets/images/resources/counselling-solutions-1-2.png"
alt="pelocis"
className="counselling-solutions__image__two"
/>
<div className="counselling-solutions__image__watch-btn">
<Link href="https://www.youtube.com/watch?v=h9MbznbxlLc" className="video-popup">
<i className="icon-play"></i>
</Link>
<span>WATCH VIDEO</span>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,14 +1,92 @@
"use client"; "use client";
import React, { useState } from 'react'; import React, { useState, useEffect } from 'react';
import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios";
const HomeContactOne = () => { const HomeContactOne = () => {
const [distance, setDistance] = useState(7000); const [formData, setFormData] = useState({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
const handleRangeChange = (e: React.ChangeEvent<HTMLInputElement>) => { const [formErrors, setFormErrors] = useState<any>({});
setDistance(parseInt(e.target.value)); const [captchaToken, setCaptchaToken] = useState<string | null>(null);
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setFormData((prev) => ({ ...prev, [name]: value }));
}; };
const handleCaptchaChange = (token: string | null) => {
setCaptchaToken(token);
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
const errors: any = {};
if (!formData.name.trim()) errors.name = "Name is required.";
if (!formData.phone.trim()) errors.phone = "Phone is required.";
if (!formData.email.trim()) errors.email = "Email is required.";
if (!formData.service.trim()) errors.service = "Please select a service.";
if (!formData.message.trim()) errors.message = "Message is required.";
if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
setFormErrors(errors);
if (Object.keys(errors).length > 0) return;
const emailData = {
...formData,
message: `Service: ${formData.service}<br /><br />Message: ${formData.message}`,
to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Home Contact",
recaptchaToken: captchaToken,
};
try {
const res = await axios.post("https://mailserver.metatronnest.com/send", emailData, {
headers: { "Content-Type": "application/json" },
});
setAlert({
show: true,
type: "success",
message: res?.data?.message || "Message sent successfully!",
});
setFormData({
name: "",
phone: "",
email: "",
service: "",
message: "",
});
setCaptchaToken(null);
setFormErrors({});
} catch (error) {
console.error("❌ Error sending email:", error);
setAlert({
show: true,
type: "danger",
message: "Failed to send message. Please try again later.",
});
}
};
useEffect(() => {
if (alert.show) {
const timer = setTimeout(() => {
setAlert((prev) => ({ ...prev, show: false }));
}, 5000);
return () => clearTimeout(timer);
}
}, [alert.show]);
return ( return (
<section className="home-contact-one"> <section className="home-contact-one">
<div <div
@ -17,8 +95,8 @@ const HomeContactOne = () => {
></div> ></div>
<div className="container"> <div className="container">
<div className="row"> <div className="row">
<div className="col-xl-6"> <div className="col-xl-6 d-flex align-items-center justify-content-center">
<div className="home-contact__card "> <div className="home-contact__card" style={{ margin: '0 auto' }}>
<div className="home-contact__card__content"> <div className="home-contact__card__content">
<ul className="home-contact__card__list"> <ul className="home-contact__card__list">
<li> <li>
@ -26,7 +104,7 @@ const HomeContactOne = () => {
<div className="pl-5"> <div className="pl-5">
<h3 className="home-contact__card__list__title">Get Contact Now</h3> <h3 className="home-contact__card__list__title">Get Contact Now</h3>
<p className="home-contact__card__list__text"> <p className="home-contact__card__list__text">
<a href="tel:+11234751328">+11234 751 328</a> <a href="tel:+16476797651">+1-647-679-7651</a>
</p> </p>
</div> </div>
<div className="home-contact__card__list__shape"></div> <div className="home-contact__card__list__shape"></div>
@ -36,7 +114,7 @@ const HomeContactOne = () => {
<div className="pl-5"> <div className="pl-5">
<h3 className="home-contact__card__list__title">Sent Email</h3> <h3 className="home-contact__card__list__title">Sent Email</h3>
<p className="home-contact__card__list__text"> <p className="home-contact__card__list__text">
<a href="mailto:pelocis@envato.com">pelocis@envato.com</a> <a href="mailto:info@metatroncubesolutions.com">info@metatroncubesolutions.com</a>
</p> </p>
</div> </div>
<div className="home-contact__card__list__shape"></div> <div className="home-contact__card__list__shape"></div>
@ -45,7 +123,7 @@ const HomeContactOne = () => {
<span className="fa-solid fa-location-dot"></span> <span className="fa-solid fa-location-dot"></span>
<div className="pl-5"> <div className="pl-5">
<h3 className="home-contact__card__list__title">Location</h3> <h3 className="home-contact__card__list__title">Location</h3>
<p className="home-contact__card__list__text">8/05 Mozilla Golden</p> <p className="home-contact__card__list__text">Canada</p>
</div> </div>
<div className="home-contact__card__list__shape"></div> <div className="home-contact__card__list__shape"></div>
</li> </li>
@ -66,9 +144,10 @@ const HomeContactOne = () => {
</div> </div>
</div> </div>
<div className="col-xl-6"> <div className="col-xl-6">
<div className="home-contact-form-container-global">
<form <form
className="appointment__form contact-form-validated form-one" className="appointment__form contact-form-validated form-one"
action="#" onSubmit={handleSubmit}
noValidate noValidate
> >
<div className="appointment__form__top"> <div className="appointment__form__top">
@ -84,54 +163,98 @@ const HomeContactOne = () => {
className="appointment__form__title__shape" className="appointment__form__title__shape"
/> />
</div> </div>
<p className="appointment__form__text">
Business tailored design, management &amp; support services Business
business agency elit, sed do eiusmod tempor majority have
in some we form, by injected humour solution.
</p>
</div> </div>
<div className="form-one__group row">
<div className="form-one__control col-md-6"> {alert.show && (
<label htmlFor="name" className="appointment__form__lable">Name</label> <div className={`alert alert-${alert.type === 'danger' ? 'danger' : 'success'} mb-4`} style={{ padding: '15px', borderRadius: '12px' }}>
<input id="name" type="text" name="name" placeholder="Select Name *" /> {alert.message}
</div> </div>
<div className="form-one__control col-md-6"> )}
<label htmlFor="email" className="appointment__form__lable">Email</label>
<input id="email" type="email" name="email" placeholder="Select Email *" /> <div className="form-one__group">
<div className="mb-20">
<label htmlFor="name" className="form-label-custom-global">Full Name</label>
<input
id="name"
type="text"
name="name"
placeholder="Full Name"
value={formData.name}
onChange={handleChange}
className="form-input-custom-global"
/>
{formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div> </div>
<div className="form-one__control col-md-6"> <div className="mb-20">
<label htmlFor="phone" className="appointment__form__lable">Phone</label> <label htmlFor="email" className="form-label-custom-global">Email Address</label>
<input id="phone" type="text" name="phone" placeholder="Select a Phone" /> <input
id="email"
type="email"
name="email"
placeholder="Email Address"
value={formData.email}
onChange={handleChange}
className="form-input-custom-global"
/>
{formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div> </div>
<div className="form-one__control form-one__control--full col-md-6"> <div className="mb-20">
<label htmlFor="program-select" className="appointment__form__lable">Program</label> <label htmlFor="phone" className="form-label-custom-global">Phone Number</label>
<div className="form-one__control__select"> <input
id="phone"
type="text"
name="phone"
placeholder="Phone Number"
value={formData.phone}
onChange={handleChange}
className="form-input-custom-global"
/>
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div>
<div className="mb-20">
<label htmlFor="service" className="form-label-custom-global">Select Service</label>
<select <select
className="form-select selectpicker" name="service"
id="program-select" id="service"
defaultValue="Select program" value={formData.service}
style={{ onChange={handleChange}
width: '100%', className="form-select-custom-styled-global"
padding: '12px 20px',
borderRadius: '5px',
border: '1px solid #ddd',
fontSize: '14px'
}}
> >
<option value="Select program">Select a Program</option> <option value="">Select Service</option>
<option value="Web Development">Web Development</option> <option value="Website Development">Website Development</option>
<option value="Mobile App Development">Mobile App Development</option> <option value="Mobile Application Development">Mobile Application Development</option>
<option value="UI/UX Design">UI/UX Design</option> <option value="Graphic Designing">Graphic Designing</option>
<option value="UI / UX Designing">UI / UX Designing</option>
<option value="SEO & Content Writing">SEO & Content Writing</option>
<option value="Digital Marketing">Digital Marketing</option> <option value="Digital Marketing">Digital Marketing</option>
</select> </select>
{formErrors.service && <small className="text-danger">{formErrors.service}</small>}
</div> </div>
<div className="form-one__control--full mb-20">
<label htmlFor="message" className="form-label-custom-global">Write Message</label>
<textarea
id="message"
name="message"
placeholder="Write Message"
value={formData.message}
onChange={handleChange}
rows={4}
className="form-textarea-custom-global"
></textarea>
{formErrors.message && <small className="text-danger">{formErrors.message}</small>}
</div> </div>
<div className="form-one__control mt-30">
<button type="submit" className="pelocis-btn"> <div className="form-one__control--full mb-4">
<span> <ReCAPTCHA
SEND Request sitekey="6LekfpwrAAAAAOTwuP1d2gg-Fv9UEsAjE2gjOQJl"
<i className="fa-solid fa-arrow-right-long" style={{ marginLeft: '8px' }}></i> onChange={handleCaptchaChange}
</span> />
{formErrors.captcha && <small className="text-danger">{formErrors.captcha}</small>}
</div>
<div className="form-one__control--full">
<button type="submit" className="submit-btn-custom-global">
SEND A MESSAGE
</button> </button>
</div> </div>
</div> </div>
@ -139,6 +262,7 @@ const HomeContactOne = () => {
</div> </div>
</div> </div>
</div> </div>
</div>
</section > </section >
); );
}; };

View File

@ -5,45 +5,45 @@ import React, { useState, useEffect } from "react";
const services = [ const services = [
{ {
id: 0, id: 0,
title: "Excellent infection prevention", title: "Website Development",
text: "Lorem ipsum dolor sit amet, conse ctetur adipiscing eliteiusmod tempor incididunt", text: "Custom website development tailored to your business needs.",
icon: "/assets/imgs/icon/icon-6.png", icon: "/assets/imgs/icon/icon-6.png",
link: "service-details.html", link: "/services-digital-solutions/web-development",
}, },
{ {
id: 1, id: 1,
title: "Health patients comprehensive", title: "Mobile Application Development",
text: "From its medieval origins to the digital era , learn everything there is to know", text: "High-performance mobile apps for iOS and Android.",
icon: "/assets/imgs/icon/icon-2.png", icon: "/assets/imgs/icon/icon-2.png",
link: "service-details.html", link: "/services-digital-solutions/mobile-app-development",
}, },
{ {
id: 2, id: 2,
title: "Pediatric Hematology Oncology", title: "Graphic Designing",
text: "Creation timelines for the standard lorem ipsum passage vary, with some citing the", text: "Creative graphic design solutions for your brand.",
icon: "/assets/imgs/icon/icon-3.png", icon: "/assets/imgs/icon/icon-3.png",
link: "service-details.html", link: "/services-digital-solutions/graphic-designing",
}, },
{ {
id: 3, id: 3,
title: "Care Pediatric & Medicine", title: "UI / UX Designing",
text: "Letraset's dry-transfer sheets, and later entered the digital world via Aldus", text: "User-centric design experiences that engage and convert.",
icon: "/assets/imgs/icon/icon-4.png", icon: "/assets/imgs/icon/icon-4.png",
link: "service-details.html", link: "/services-digital-solutions/ui-ux-designing",
}, },
{ {
id: 4, id: 4,
title: "Labor & Delivery: The Birthplace", title: "SEO & Content Writing",
text: "Some claim lorem ipsum threatens to promote design over content, while others defend", text: "Optimization and content that drives organic growth.",
icon: "/assets/imgs/icon/icon-5.png", icon: "/assets/imgs/icon/icon-5.png",
link: "service-details.html", link: "/services-digital-solutions/seo-content-writing",
}, },
{ {
id: 5, id: 5,
title: "Urogynecology & Pelvic Health", title: "Digital Marketing",
text: "Generally, lorem ipsum is best suited to keeping templates from looking bare or", text: "Strategic digital marketing to grow your online presence.",
icon: "/assets/imgs/icon/icon-6.png", icon: "/assets/imgs/icon/icon-6.png",
link: "service-details.html", link: "/services-digital-solutions/digital-marketing",
}, },
]; ];
@ -91,7 +91,7 @@ const MedicalServices = () => {
<div className="container p-relative" style={{ zIndex: 5 }}> <div className="container p-relative" style={{ zIndex: 5 }}>
<div <div
className="sec-title-wrapper text-center wow fadeInUp animated mb-50" className="sec-title-wrapper text-center wow fadeInUp animated"
data-wow-delay="0.3s" data-wow-delay="0.3s"
> >
<div className="sec-title"> <div className="sec-title">

View File

@ -210,6 +210,13 @@ export default function PortfolioSection() {
return ( return (
<section className="pf-section"> <section className="pf-section">
<div className="pf-container"> <div className="pf-container">
<div className="sec-title-wrapper text-center wow fadeInUp animated" data-wow-delay="0.3s">
<div className="sec-title">
<div className="sec-title__shape"></div>
<h6 className="sec-title__tagline">PORTFOLIO</h6>
<h3 className="sec-title__title">Our Latest <span className="inner-text">Work </span></h3>
</div>
</div>
{/* ── Filter Tabs ── */} {/* ── Filter Tabs ── */}
<div className="pf-tabs"> <div className="pf-tabs">

View File

@ -65,7 +65,7 @@ const WhyChooseTwo: React.FC<WhyChooseTwoProps> = ({ reverse = false }) => {
</div> </div>
</div> </div>
<div className="col-xl-6"> <div className="col-xl-6">
<div className="pelocis-stretch-element-inside-column" style={reverse ? { marginLeft: '-227.812px', marginRight: '0px' } : { marginLeft: '0px', marginRight: '-367.812px' }}> <div className="pelocis-stretch-element-inside-column" style={reverse ? { marginLeft: '-227.812px', marginRight: '0px' } : { marginLeft: '0px', marginRight: '-267.812px' }}>
<div className="why-choose-two__shape-one"> <div className="why-choose-two__shape-one">
<img src="https://bracketweb.com/pelocishtml/assets/images/resources/why-choose-two-img-1.png" alt="pelocis" /> <img src="https://bracketweb.com/pelocishtml/assets/images/resources/why-choose-two-img-1.png" alt="pelocis" />
</div> </div>

View File

@ -48,59 +48,6 @@ const BlogSection = ({ hideHeader = false }: { hideHeader?: boolean }) => (
</div> </div>
</div> </div>
<style jsx>{`
.relative { position: relative; }
.blog-image { position: relative; display: block; overflow: hidden; border-radius: 20px 20px 0 0; }
.blog-image img { width: 100%; border-radius: 20px 20px 0 0; }
.blog-category-tag {
position: absolute;
bottom: 0px;
right: 0px;
background: #3779b9;
color: #fff;
padding: 10px 20px;
font-size: 13px;
font-weight: 700;
text-transform: uppercase;
z-index: 2;
border-radius: 12px 0 0 0;
letter-spacing: 0.5px;
}
.blog-style-one {
border-left: 1px solid #e2e8f0;
border-right: 1px solid #e2e8f0;
border-bottom: 1px solid #e2e8f0;
border-radius: 20px 20px 15px 15px;
background: #fff;
transition: all 0.3s ease;
}
.blog-style-one:hover {
border-color: #3779b9;
box-shadow: 0 10px 30px rgba(55, 121, 185, 0.1);
}
.blog-content {
padding: 30px 25px;
}
.blog-title {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
line-height: 1.5;
height: 3em;
}
.post-meta span {
display: inline-flex;
align-items: center;
gap: 8px;
margin-right: 15px;
font-size: 14px;
color: #64748b;
}
.post-meta i {
color: #3779b9;
}
`}</style>
</section> </section>
); );

View File

@ -9,7 +9,6 @@ const BrandSection = () => {
tagline="OUR PARTNERS" tagline="OUR PARTNERS"
title="Trusted by <span class='inner-text'>Leaders</span> Worldwide" title="Trusted by <span class='inner-text'>Leaders</span> Worldwide"
centered={true} centered={true}
className="mb-50"
/> />
<div className="small-container"> <div className="small-container">
<div className="swiper brand-active"> <div className="swiper brand-active">

View File

@ -7,7 +7,7 @@ const ProjectsSection = () => {
<div className="small-container"> <div className="small-container">
<div className="row"> <div className="row">
<div className="col-xxl-6"> <div className="col-xxl-6">
<div className="title-box mb-50 wow fadeInLeft" data-wow-delay=".5s"> <div className="title-box wow fadeInLeft" data-wow-delay=".5s">
<span className="section-sub-title">PROJECTS</span> <span className="section-sub-title">PROJECTS</span>
<h3 className="section-title mt-10">Our Latest Projects</h3> <h3 className="section-title mt-10">Our Latest Projects</h3>
</div> </div>

View File

@ -16,7 +16,7 @@ const ServiceSliderSection = () => {
<div className="small-container"> <div className="small-container">
<div className="row"> <div className="row">
<div className="col-xxl-6"> <div className="col-xxl-6">
<div className="title-box mb-50 wow fadeInLeft" data-wow-delay=".5s"> <div className="title-box wow fadeInLeft" data-wow-delay=".5s">
<span className="section-sub-title">SERVICES WERE OFFERING</span> <span className="section-sub-title">SERVICES WERE OFFERING</span>
<h3 className="section-title mt-10">Exclusive IT Services</h3> <h3 className="section-title mt-10">Exclusive IT Services</h3>
</div> </div>

View File

@ -27,7 +27,7 @@ const ServiceThreeSlider = () => {
</div> </div>
</div> </div>
<div className="col-xxl-6 col-xl-6"> <div className="col-xxl-6 col-xl-6">
<div className="service_1_navigation__wrapprer position-relative z-1 text-end mt-30 mb-50"> <div className="service_1_navigation__wrapprer position-relative z-1 text-end mt-30">
<div className="common-slider-navigation"> <div className="common-slider-navigation">
<button className="service-1-button-prev slider-nav-btn"><i className="fa-solid fa-chevron-left"></i></button> <button className="service-1-button-prev slider-nav-btn"><i className="fa-solid fa-chevron-left"></i></button>
<button className="service-1-button-next slider-nav-btn"><i className="fa-solid fa-chevron-right"></i></button> <button className="service-1-button-next slider-nav-btn"><i className="fa-solid fa-chevron-right"></i></button>
@ -46,7 +46,7 @@ const ServiceThreeSlider = () => {
<span className={service.icon}></span> <span className={service.icon}></span>
</div> </div>
<h3 className="service-three__item__title"> <h3 className="service-three__item__title">
<Link href={`/services/${service.slug}`}>{service.title}</Link> <Link href={`/services-digital-solutions/${service.slug}`}>{service.title}</Link>
</h3> </h3>
<p className="service-three__item__text text-white">{service.description}</p> <p className="service-three__item__text text-white">{service.description}</p>
</div> </div>

View File

@ -5,7 +5,7 @@ const TeamSection = () => (
<div className="shape-1" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-13.png)" }}></div> <div className="shape-1" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-13.png)" }}></div>
<div className="shape-2 float-bob-y" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-14.png)" }}></div> <div className="shape-2 float-bob-y" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-14.png)" }}></div>
<div className="small-container"> <div className="small-container">
<div className="title-box text-center mb-50 wow fadeInLeft" data-wow-delay=".5s"> <div className="title-box text-center wow fadeInLeft" data-wow-delay=".5s">
<span className="section-sub-title">OUR team</span> <span className="section-sub-title">OUR team</span>
<h3 className="section-title mt-10">Our Leadership Team</h3> <h3 className="section-title mt-10">Our Leadership Team</h3>
</div> </div>

View File

@ -1,7 +1,72 @@
import React from "react"; "use client";
import { testimonialSlides } from "@/utils/data"; import React, { useState, useEffect } from "react";
import Slider from "react-slick";
import GoogleReviewsBranding from "@/components/common/GoogleReviewsBranding";
const TestimonialsSection = () => ( const TestimonialsSection = () => {
const [reviews, setReviews] = useState<any[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function loadReviews() {
try {
const res = await fetch("/api/reviews");
const data = await res.json();
const cleaned = (data.reviews || []).filter((r: any) =>
(r.snippet || r.text || r.review_text || r.description || r.body || r.content)
);
setReviews(cleaned);
} catch (error) {
console.error("Failed to fetch reviews", error);
} finally {
setLoading(false);
}
}
loadReviews();
}, []);
const displayedReviews = reviews.length > 0 && reviews.length < 4
? [...reviews, ...reviews, ...reviews]
: reviews;
const settings = {
dots: true,
arrows: false,
infinite: displayedReviews.length > 2,
speed: 600,
slidesToShow: 2,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 5000,
dotsClass: "testimonial-dot-inner",
responsive: [
{
breakpoint: 1200,
settings: {
slidesToShow: 2,
}
},
{
breakpoint: 991,
settings: {
slidesToShow: 1,
}
}
]
};
function getReviewText(r: any) {
return r.text || r.description || r.snippet || r.review_text || r.body || r.content || "";
}
function getProfileImage(r: any, index: number) {
const url = r.user?.thumbnail || r.profile_photo_url || r.author_profile_photo_url || r.user?.profile_photo_url || r.thumbnail || r.profile_picture || r.avatar || r.author_image;
if (!url) return `/assets/imgs/resources/testimonials-${(index % 2) + 1}.png`;
if (typeof url === 'string' && url.startsWith("http")) return url;
return `https://lh3.googleusercontent.com/${url}`;
}
return (
<section className="testimonials-two-section fix section-space-bottom"> <section className="testimonials-two-section fix section-space-bottom">
<div className="container-fluid g-0"> <div className="container-fluid g-0">
<div className="row g-0"> <div className="row g-0">
@ -16,36 +81,69 @@ const TestimonialsSection = () => (
</div> </div>
</div> </div>
<div className="col-xxl-8 col-xl-8 col-lg-12"> <div className="col-xxl-8 col-xl-8 col-lg-12">
<div className="testimonials-two-area section-space-medium bg-color-1 p-relative"> <div className="testimonials-two-area section-space-medium p-relative parallax-bg" style={{
<div className="shape-1" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-36.png)" }}></div> backgroundImage: 'url(/assets/img/home/bg/bg-4.webp)',
<div className="sec-title-wrapper wow fadeInLeft" data-wow-delay=".5s"> backgroundSize: 'cover',
backgroundPosition: 'center'
}}>
<div className="section-overlay" style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', background: 'rgba(26, 31, 43, 0.82)', zIndex: 0 }}></div>
<div className="shape-1" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-36.png)", zIndex: 1 }}></div>
<div className="sec-title-wrapper" style={{ position: 'relative', zIndex: 2 }}>
<div className="sec-title"> <div className="sec-title">
<div className="sec-title__shape"></div> <div className="sec-title__shape"></div>
<h6 className="sec-title__tagline">TESTIMONIALS</h6> <h6 className="sec-title__tagline">TESTIMONIALS</h6>
<h3 className="sec-title__title text-white">Our Client Feedback</h3> <h3 className="sec-title__title text-white">Our Client Feedback</h3>
<div className="space20"></div>
<div className="d-flex justify-content-start">
<GoogleReviewsBranding />
</div>
</div> </div>
<img src="https://bracketweb.com/pelocishtml/assets/images/shapes/text-shape-2.png" alt="" className="sec-title__text-shape" /> <img src="https://bracketweb.com/pelocishtml/assets/images/shapes/text-shape-2.png" alt="" className="sec-title__text-shape" />
</div> </div>
<div className="swiper testimonial-active-2">
<div className="swiper-wrapper"> <div className="testi-slider-wrapper" style={{ position: 'relative', zIndex: 2, marginTop: '70px' }}>
{[1, 2, 1].map((num, i) => ( {loading ? (
<div key={i} className="swiper-slide"> <div className="text-center py-5">
<div className="testimonials-two-box"> <p className="text-white">Loading reviews from Google...</p>
<div className="author-image"><img src={`/assets/imgs/resources/testimonials-${num}.png`} alt="" /></div>
<div className="icon-1"><i className="fa-solid fa-quote-right"></i></div>
<h4>Kathryn Murphy</h4>
<span>Engineering</span>
<ul className="ratings">
{[1, 2, 3, 4, 5].map((r) => <li key={r}><i className="fa-solid fa-star"></i></li>)}
</ul>
<p> Consectetur adipiscing elit. Integer is nunc viverra laoreet est the is porta pretium metus aliquam eget maecenas porta is nunc viverra Aenean </p>
</div> </div>
) : displayedReviews.length > 0 ? (
<Slider {...settings}>
{displayedReviews.map((slide, index) => {
const profileImg = getProfileImage(slide, index);
const name = slide.user?.name || slide.author_name || "Valued Client";
const rating = slide.rating || 5;
return (
<div key={index} style={{ outline: 'none', padding: '10px 15px 40px 10px' }}>
<div className="testimonials-two-box-solid">
<div className="author-image-solid">
<img src={profileImg} alt={name} />
</div> </div>
<div className="icon-quote-testi">
<i className="fa-solid fa-quote-right"></i>
</div>
<div className="content-solid">
<h4>{name}</h4>
<span className="tag">Verified Google Review</span>
<ul className="ratings-solid">
{[...Array(rating)].map((_, i) => (
<li key={i}><i className="fa-solid fa-star"></i></li>
))} ))}
</ul>
<p>
&quot;{getReviewText(slide)}&quot;
</p>
</div> </div>
</div> </div>
<div className="testimonial-dot-inner text-center mt-60"> </div>
<div className="testimonial-swiper-dot"></div> );
})}
</Slider>
) : (
<div className="text-center py-5">
<p className="text-white">No reviews found.</p>
</div>
)}
</div> </div>
</div> </div>
</div> </div>
@ -53,5 +151,6 @@ const TestimonialsSection = () => (
</div> </div>
</section> </section>
); );
};
export default TestimonialsSection; export default TestimonialsSection;

View File

@ -64,48 +64,6 @@ const Blog2Section = () => (
</div> </div>
</div> </div>
<style jsx>{`
.relative { position: relative; }
.blog-image { position: relative; display: block; overflow: hidden; border-radius: 20px 20px 0 0; }
.blog-image img { width: 100%; border-radius: 20px 20px 0 0; }
.blog-category-tag {
position: absolute;
bottom: 0px;
right: 0px;
background: #3779b9;
color: #fff;
padding: 10px 20px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
z-index: 2;
border-radius: 12px 0 0 0;
}
.blog-style-two {
border-left: 1px solid #e2e8f0;
border-right: 1px solid #e2e8f0;
border-bottom: 1px solid #e2e8f0;
border-radius: 20px 20px 15px 15px;
background: #fff;
transition: all 0.3s ease;
height: 100%;
}
.blog-style-two:hover {
border-color: #3779b9;
box-shadow: 0 10px 30px rgba(55, 121, 185, 0.1);
}
.blog-content-area {
padding: 30px 25px;
}
.blog-title {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
line-height: 1.5;
height: 3em;
}
`}</style>
</section> </section>
); );

View File

@ -2,7 +2,7 @@ import { blogs } from "@/utils/data";
import Link from "next/link"; import Link from "next/link";
const BlogSection = () => ( const BlogSection = () => (
<section className="blog-section-one section-space"> <section className="blog-section-three section-space">
<div className="small-container"> <div className="small-container">
<div className="blog-title-box mb-40"> <div className="blog-title-box mb-40">
<div className="title-box wow fadeInLeft" data-wow-delay=".5s"> <div className="title-box wow fadeInLeft" data-wow-delay=".5s">
@ -47,48 +47,6 @@ const BlogSection = () => (
))} ))}
</div> </div>
</div> </div>
<style jsx>{`
.relative { position: relative; }
.blog-image { position: relative; display: block; overflow: hidden; border-radius: 20px 20px 0 0; }
.blog-image img { width: 100%; border-radius: 20px 20px 0 0; }
.blog-category-tag {
position: absolute;
bottom: 0px;
right: 0px;
background: #3779b9;
color: #fff;
padding: 10px 25px;
font-size: 14px;
font-weight: 700;
text-transform: uppercase;
z-index: 2;
border-radius: 12px 0 0 0;
}
.blog-style-one {
border-left: 1px solid #e2e8f0;
border-right: 1px solid #e2e8f0;
border-bottom: 1px solid #e2e8f0;
border-radius: 20px 20px 15px 15px;
background: #fff;
transition: all 0.3s ease;
}
.blog-style-one:hover {
border-color: #3779b9;
box-shadow: 0 10px 30px rgba(55, 121, 185, 0.1);
}
.blog-content {
padding: 30px 25px;
}
.blog-title {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
line-height: 1.5;
height: 3em;
}
`}</style>
</section> </section>
); );

View File

@ -7,7 +7,7 @@ const ProjectsSection = () => {
<div className="small-container"> <div className="small-container">
<div className="row"> <div className="row">
<div className="col-xxl-6"> <div className="col-xxl-6">
<div className="title-box mb-50 wow fadeInLeft" data-wow-delay=".5s"> <div className="title-box wow fadeInLeft" data-wow-delay=".5s">
<span className="section-sub-title no-border">PROJECTS</span> <span className="section-sub-title no-border">PROJECTS</span>
<h3 className="section-title mt-10">Explore Our Recent Projects</h3> <h3 className="section-title mt-10">Explore Our Recent Projects</h3>
</div> </div>

View File

@ -36,7 +36,7 @@ const ServiceSection = () => {
<div className="shape-2" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-47.png)" }}></div> <div className="shape-2" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-47.png)" }}></div>
<div className="shape-3" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-48.png)" }}></div> <div className="shape-3" style={{ backgroundImage: "url(/assets/imgs/shapes/shape-48.png)" }}></div>
<div className="small-container"> <div className="small-container">
<div className="service-3-title-box mb-50"> <div className="service-3-title-box">
<div className="title-box wow fadeInLeft" data-wow-delay=".5s"> <div className="title-box wow fadeInLeft" data-wow-delay=".5s">
<span className="section-sub-title no-border">SERVICES WERE OFFERING</span> <span className="section-sub-title no-border">SERVICES WERE OFFERING</span>
<h3 className="section-title mt-10 text-white">Exclusive IT Services</h3> <h3 className="section-title mt-10 text-white">Exclusive IT Services</h3>

View File

@ -3,24 +3,24 @@ import Link from "next/link";
const NavMenu = () => ( const NavMenu = () => (
<ul> <ul>
<li><Link href="/">Home</Link></li> <li><Link href="/">HOME</Link></li>
<li><Link href="/about-us">About</Link></li>
<li className="has-dropdown"> <li className="has-dropdown">
<Link href="/services">Services</Link> <Link href="/services-digital-solutions">SERVICE <i className="fa-solid fa-angle-down ms-1"></i></Link>
<ul className="submenu"> <ul className="submenu">
<li><Link href="/">Website Development</Link></li> <li><Link href="/services-digital-solutions/web-development">WEBSITE DEVELOPMENT</Link></li>
<li><Link href="/">Mobile Application Development</Link></li> <li><Link href="/services-digital-solutions/mobile-app-development">MOBILE APPLICATION DEVELOPMENT</Link></li>
<li><Link href="/">Graphic Designing</Link></li> <li><Link href="/services-digital-solutions/graphic-designing">GRAPHIC DESIGNING</Link></li>
<li><Link href="/">UI / UX Designing</Link></li> <li><Link href="/services-digital-solutions/ui-ux-designing">UI / UX DESIGNING</Link></li>
<li><Link href="/">SEO & Content Writing</Link></li> <li><Link href="/services-digital-solutions/seo-content-writing">SEO & CONTENT WRITING</Link></li>
<li><Link href="/">Digital Marketing</Link></li> <li><Link href="/services-digital-solutions/digital-marketing">DIGITAL MARKETING</Link></li>
</ul> </ul>
</li> </li>
<li><Link href="/careers">Careers</Link></li> <li><Link href="/portfolio">PORTFOLIO</Link></li>
<li><Link href="/portfolio">Portfolio</Link></li> <li><Link href="/about-us">ABOUT</Link></li>
<li><Link href="/careers">CAREERS</Link></li>
<li><Link href="/blog">BLOG</Link></li>
<li><Link href="/contact">CONTACT</Link></li>
<li><Link href="/faq">FAQ</Link></li> <li><Link href="/faq">FAQ</Link></li>
<li><Link href="/blog">Blog</Link></li>
<li><Link href="/contact">Contact</Link></li>
</ul> </ul>
); );

View File

@ -3,6 +3,7 @@ import React, { useEffect, useState } from 'react';
import { createPortal } from 'react-dom'; import { createPortal } from 'react-dom';
import ReCAPTCHA from "react-google-recaptcha"; import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios"; import axios from "axios";
import ContactStatus from '@/components/contact/ContactStatus';
interface ContactPopupProps { interface ContactPopupProps {
isOpen: boolean; isOpen: boolean;
@ -10,6 +11,7 @@ interface ContactPopupProps {
} }
const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => { const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle');
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
name: "", name: "",
phone: "", phone: "",
@ -17,12 +19,11 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
businessName: "", businessName: "",
projectRequirement: "", projectRequirement: "",
budgetRange: "", budgetRange: "",
appType: "",
}); });
const [formErrors, setFormErrors] = useState<any>({}); const [formErrors, setFormErrors] = useState<any>({});
const [captchaToken, setCaptchaToken] = useState<string | null>(null); const [captchaToken, setCaptchaToken] = useState<string | null>(null);
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
const [isSubmitting, setIsSubmitting] = useState(false);
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
useEffect(() => { useEffect(() => {
@ -57,32 +58,27 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
if (!formData.businessName.trim()) errors.businessName = "Business name requested."; if (!formData.businessName.trim()) errors.businessName = "Business name requested.";
if (!formData.projectRequirement.trim()) errors.projectRequirement = "Requirement details needed."; if (!formData.projectRequirement.trim()) errors.projectRequirement = "Requirement details needed.";
if (!formData.budgetRange) errors.budgetRange = "Please select a budget range."; if (!formData.budgetRange) errors.budgetRange = "Please select a budget range.";
// if (!captchaToken) errors.captcha = "Please verify the CAPTCHA."; if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
setFormErrors(errors); setFormErrors(errors);
if (Object.keys(errors).length > 0) return; if (Object.keys(errors).length > 0) return;
setIsSubmitting(true); setStatus('submitting');
const emailData = { const emailData = {
...formData, ...formData,
message: `Business: ${formData.businessName}<br />Budget: ${formData.budgetRange}<br /><br />Requirement: ${formData.projectRequirement}`, message: `Business: ${formData.businessName}<br />App Type: ${formData.appType}<br />Budget: ${formData.budgetRange}<br /><br />Requirement: ${formData.projectRequirement}`,
to: "selvipalanikumarn@gmail.com", to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Contact Popup", senderName: "Metatroncube Contact Popup",
recaptchaToken: captchaToken, recaptchaToken: captchaToken,
}; };
try { try {
const res = await axios.post("https://mailserver.metatronnest.com/send", emailData, { await axios.post("https://mailserver.metatronnest.com/send", emailData, {
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
}); });
setAlert({ setStatus('success');
show: true,
type: "success",
message: res?.data?.message || "Message sent successfully!",
});
setFormData({ setFormData({
name: "", name: "",
phone: "", phone: "",
@ -90,31 +86,24 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
businessName: "", businessName: "",
projectRequirement: "", projectRequirement: "",
budgetRange: "", budgetRange: "",
appType: "",
}); });
setCaptchaToken(null); setCaptchaToken(null);
setFormErrors({}); setFormErrors({});
// Close after delay
setTimeout(onClose, 2000);
} catch (error) { } catch (error) {
console.error("❌ Error sending email:", error); console.error("❌ Error sending email:", error);
setAlert({ setStatus('error');
show: true,
type: "danger",
message: "Failed to send message. Please try again later.",
});
} finally {
setIsSubmitting(false);
} }
}; };
useEffect(() => { const handleCloseStatus = () => {
if (alert.show) { if (status === 'success') {
const timer = setTimeout(() => { onClose();
setAlert((prev) => ({ ...prev, show: false })); setStatus('idle');
}, 5000); } else {
return () => clearTimeout(timer); setStatus('idle');
} }
}, [alert.show]); };
if (!mounted || !isOpen) return null; if (!mounted || !isOpen) return null;
@ -126,22 +115,22 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
<div className="col-lg-5 info-panel" style={{ color: '#fff', position: 'relative' }}> <div className="col-lg-5 info-panel" style={{ color: '#fff', position: 'relative' }}>
<div style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', background: 'linear-gradient(135deg, #1a1f2b 0%, #3779b9 100%)', zIndex: 0 }}></div> <div style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', background: 'linear-gradient(135deg, #1a1f2b 0%, #3779b9 100%)', zIndex: 0 }}></div>
<div className="info-inner" style={{ position: 'relative', zIndex: 1 }}> <div className="info-inner" style={{ position: 'relative', zIndex: 1 }}>
<h2 className="title text-white">Lets Discuss Your App Idea</h2> <h2 className="title">Let&apos;s Discuss Your App Idea</h2>
<p className="desc text-white">Fill out the form and our team will contact you within 24 hours.</p> <p className="desc">Fill out the form and our team will contact you within 24 hours.</p>
<div className="contact-details"> <div className="contact-details">
<div className="detail-item"> <div className="detail-item">
<div className="icon"><i className="fa-solid fa-envelope"></i></div> <div className="icon"><i className="fa-solid fa-envelope"></i></div>
<div className="text"> <div className="text">
<p className='text-white'>Email Us</p> <p>Email Us</p>
<h5 className='text-white'>info@metatroncubesolutions.com</h5> <h5>info@metatroncubesolutions.com</h5>
</div> </div>
</div> </div>
<div className="detail-item"> <div className="detail-item">
<div className="icon"><i className="fa-solid fa-phone"></i></div> <div className="icon"><i className="fa-solid fa-phone"></i></div>
<div className="text"> <div className="text">
<p className='text-white'>Call Us Free</p> <p>Call Us Free</p>
<h5 className='text-white'><a href="tel:+16476797651" style={{ color: 'inherit', textDecoration: 'none' }}>+1-647-679-7651</a></h5> <h5><a href="tel:+16476797651" style={{ color: 'inherit', textDecoration: 'none' }}>+1-647-679-7651</a></h5>
</div> </div>
</div> </div>
</div> </div>
@ -156,49 +145,43 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
</div> </div>
</div> </div>
{/* Right Side: Form */} {/* Right Side: Form or Status */}
<div className="col-lg-7 form-panel"> <div className="col-lg-7 form-panel">
<button onClick={onClose} className="close-btn"> <button onClick={onClose} className="close-btn">
<i className="fa-solid fa-xmark"></i> <i className="fa-solid fa-xmark"></i>
</button> </button>
{status === 'idle' || status === 'submitting' ? (
<>
<h3 className="form-title">Start Your Project</h3> <h3 className="form-title">Start Your Project</h3>
{alert.show && (
<div className={`alert alert-${alert.type === 'danger' ? 'danger' : 'success'} mb-4`}>
{alert.message}
</div>
)}
<form className="contact-form" onSubmit={handleSubmit}> <form className="contact-form" onSubmit={handleSubmit}>
<div className="row g-3"> <div className="row g-3">
<div className="col-md-6"> <div className="col-sm-6">
<input type="text" name="name" placeholder="Full Name" value={formData.name} onChange={handleChange} className="form-input" /> <input type="text" name="name" placeholder="Full Name" value={formData.name} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.name && <small className="text-danger">{formErrors.name}</small>} {formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div> </div>
<div className="col-md-6"> <div className="col-sm-6">
<input type="email" name="email" placeholder="Email Address" value={formData.email} onChange={handleChange} className="form-input" /> <input type="email" name="email" placeholder="Email Address" value={formData.email} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.email && <small className="text-danger">{formErrors.email}</small>} {formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div> </div>
<div className="col-md-6"> <div className="col-sm-6">
<input type="text" name="phone" placeholder="Phone Number" value={formData.phone} onChange={handleChange} className="form-input" /> <input type="text" name="phone" placeholder="Phone Number" value={formData.phone} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>} {formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div> </div>
<div className="col-md-6"> <div className="col-sm-6">
<input type="text" name="businessName" placeholder="Business Name" value={formData.businessName} onChange={handleChange} className="form-input" /> <input type="text" name="businessName" placeholder="Business Name" value={formData.businessName} onChange={handleChange} className="form-input" disabled={status === 'submitting'} />
{formErrors.businessName && <small className="text-danger">{formErrors.businessName}</small>} {formErrors.businessName && <small className="text-danger">{formErrors.businessName}</small>}
</div> </div>
<div className="col-12"> <div className="col-sm-6">
<select name="budgetRange" value={formData.budgetRange} onChange={handleChange} className="form-input form-select"> <select name="appType" value={formData.appType} onChange={handleChange} className="form-input form-select" disabled={status === 'submitting'}>
<option value="">App Type</option> <option value="">App Type</option>
<option value="Android">Android</option> <option value="Android">Android</option>
<option value="iOS">iOS</option> <option value="iOS">iOS</option>
<option value="Both">Both</option> <option value="Both">Both</option>
</select> </select>
{formErrors.budgetRange && <small className="text-danger">{formErrors.budgetRange}</small>}
</div> </div>
<div className="col-12"> <div className="col-sm-6">
<select name="budgetRange" value={formData.budgetRange} onChange={handleChange} className="form-input form-select"> <select name="budgetRange" value={formData.budgetRange} onChange={handleChange} className="form-input form-select" disabled={status === 'submitting'}>
<option value="">Select Budget Range</option> <option value="">Select Budget Range</option>
<option value="$1,000 - $5,000">$1,000 - $5,000</option> <option value="$1,000 - $5,000">$1,000 - $5,000</option>
<option value="$5,000 - $10,000">$5,000 - $10,000</option> <option value="$5,000 - $10,000">$5,000 - $10,000</option>
@ -216,6 +199,7 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
value={formData.projectRequirement} value={formData.projectRequirement}
onChange={handleChange} onChange={handleChange}
className="form-textarea mt-3" className="form-textarea mt-3"
disabled={status === 'submitting'}
></textarea> ></textarea>
{formErrors.projectRequirement && <small className="text-danger">{formErrors.projectRequirement}</small>} {formErrors.projectRequirement && <small className="text-danger">{formErrors.projectRequirement}</small>}
@ -229,10 +213,16 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
{formErrors.captcha && <small className="text-danger d-block mt-1">{formErrors.captcha}</small>} {formErrors.captcha && <small className="text-danger d-block mt-1">{formErrors.captcha}</small>}
</div> </div>
<button type="submit" className="vl-btn1 submit-btn" disabled={isSubmitting}> <button type="submit" className="vl-btn1 submit-btn" disabled={status === 'submitting'}>
{isSubmitting ? 'Sending...' : 'Submit & Get Free Proposal'} <i className="fa-solid fa-angle-right"></i> {status === 'submitting' ? 'Sending...' : 'Submit & Get Free Proposal'} <i className="fa-solid fa-arrow-right"></i>
</button> </button>
</form> </form>
</>
) : (
<div className="status-wrapper">
<ContactStatus type={status as 'success' | 'error'} onClose={handleCloseStatus} />
</div>
)}
</div> </div>
</div> </div>
</div> </div>
@ -417,6 +407,14 @@ const ContactPopup: React.FC<ContactPopupProps> = ({ isOpen, onClose }) => {
transform: translateY(-1px); transform: translateY(-1px);
} }
.status-wrapper {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
min-height: 400px;
}
/* Mobile Optimizations */ /* Mobile Optimizations */
@media (max-width: 991px) { @media (max-width: 991px) {
.info-panel { display: none; } .info-panel { display: none; }

View File

@ -0,0 +1,83 @@
import React from "react";
const AboutService = () => {
return (
<section className="about-service section-space">
<div className="container">
<div className="row align-items-center">
<div className="col-lg-6">
<div className="about-image-stack p-relative">
{/* Experience Box */}
{/* <div className="experience-box animate-bounce-y">
<h3>37+</h3>
<span>Years Experience</span>
</div> */}
{/* Background Image */}
<div className="main-img-wrap">
<img src="/assets/img/about/about-img1.png" alt="Office Meeting" />
</div>
{/* Foreground Curved Image */}
<div className="curved-img-wrap">
<img src="/assets/img/about/about-img13.png" alt="Collaborative Work" />
</div>
{/* Decorative Dots */}
<div className="dots-shape">
<img src="/assets/imgs/shapes/shape-6.png" alt="dots" />
</div>
</div>
</div>
<div className="col-lg-6">
<div className="content-area pl-60">
<div className="sec-title-wrapper mb-30">
<div className="sec-title">
<div className="sec-title__shape"></div>
<h6 className="sec-title__tagline">OUR ABOUT US</h6>
<h3 className="sec-title__title">We Provide Professional Advice<br />About This Business.</h3>
</div>
<img src="https://bracketweb.com/pelocishtml/assets/images/shapes/text-shape-2.png" alt="" className="sec-title__text-shape" />
<p className="section-desc">
Business tailored design, management &amp; support services Business business agency elit,
sed do eiusmod tempor majority have in some we form, by injected humour solution.
</p>
</div>
<div className="single-format-content mb-40">
<div className="format-row d-flex align-items-start gap-4">
{/* <div className="small-feature-img">
<img src="/assets/img/about/about-img10.png" alt="Team" className="rounded-3" />
</div> */}
<div className="feature-bullets">
<div className="bullet-item d-flex align-items-center mb-15">
<i className="fa-solid fa-circle-check maroon-icon"></i>
<span>Great solution for your business growth.</span>
</div>
<div className="bullet-item d-flex align-items-center">
<i className="fa-solid fa-circle-check maroon-icon"></i>
<span>Remind yourself Business know fact.</span>
</div>
</div>
</div>
</div>
<div className="btn-wrapper">
<a href="/about-us" className="about-more-btn">
<span>ABOUT MORE</span>
<div className="icon-circle">
<i className="fa-solid fa-chevron-right"></i>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</section>
);
};
export default AboutService;

View File

@ -32,7 +32,7 @@ const ServiceDetails: React.FC<ServiceDetailsProps> = ({ service }) => {
<ul className="list-unstyled service-sidebar__nav"> <ul className="list-unstyled service-sidebar__nav">
{psychologyServices.map((item) => ( {psychologyServices.map((item) => (
<li key={item.id} className={item.slug === service.slug ? "active" : ""}> <li key={item.id} className={item.slug === service.slug ? "active" : ""}>
<Link href={`/services/${item.slug}`}> <Link href={`/services-digital-solutions/${item.slug}`}>
{item.title} {item.title}
<i className="fa-solid fa-chevron-right"></i> <i className="fa-solid fa-chevron-right"></i>
</Link> </Link>

View File

@ -1,275 +0,0 @@
import React from "react";
const AboutService = () => {
return (
<section className="about-service section-space">
<div className="container">
<div className="row align-items-center">
<div className="col-lg-6">
<div className="about-image-stack p-relative">
{/* Experience Box */}
{/* <div className="experience-box animate-bounce-y">
<h3>37+</h3>
<span>Years Experience</span>
</div> */}
{/* Background Image */}
<div className="main-img-wrap">
<img src="/assets/img/about/about-img1.png" alt="Office Meeting" />
</div>
{/* Foreground Curved Image */}
<div className="curved-img-wrap">
<img src="/assets/img/about/about-img13.png" alt="Collaborative Work" />
</div>
{/* Decorative Dots */}
<div className="dots-shape">
<img src="/assets/imgs/shapes/shape-6.png" alt="dots" />
</div>
</div>
</div>
<div className="col-lg-6">
<div className="content-area pl-60">
<div className="sec-title-wrapper mb-30">
<div className="sec-title">
<div className="sec-title__shape"></div>
<h6 className="sec-title__tagline">OUR ABOUT US</h6>
<h3 className="sec-title__title">We Provide Professional Advice<br />About This Business.</h3>
</div>
<img src="https://bracketweb.com/pelocishtml/assets/images/shapes/text-shape-2.png" alt="" className="sec-title__text-shape" />
<p className="section-desc">
Business tailored design, management &amp; support services Business business agency elit,
sed do eiusmod tempor majority have in some we form, by injected humour solution.
</p>
</div>
<div className="single-format-content mb-40">
<div className="format-row d-flex align-items-start gap-4">
{/* <div className="small-feature-img">
<img src="/assets/img/about/about-img10.png" alt="Team" className="rounded-3" />
</div> */}
<div className="feature-bullets">
<div className="bullet-item d-flex align-items-center mb-15">
<i className="fa-solid fa-circle-check maroon-icon"></i>
<span>Great solution for your business growth.</span>
</div>
<div className="bullet-item d-flex align-items-center">
<i className="fa-solid fa-circle-check maroon-icon"></i>
<span>Remind yourself Business know fact.</span>
</div>
</div>
</div>
</div>
<div className="btn-wrapper">
<a href="/about-us" className="about-more-btn">
<span>ABOUT MORE</span>
<div className="icon-circle">
<i className="fa-solid fa-chevron-right"></i>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<style jsx>{`
.about-service {
padding: 80px 0;
background: #fff;
overflow: hidden;
}
@media (max-width: 767px) {
.about-service {
padding: 60px 0;
}
}
// .about-image-stack {
// padding-top: 50px;
// padding-left: 30px;
// }
.experience-box {
position: absolute;
top: 0;
left: 0;
background: #3779b9;
color: #fff;
padding: 40px 30px;
z-index: 3;
text-align: center;
border-radius: 4px;
box-shadow: 0 10px 30px rgba(60, 114, 252, 0.3);
}
.experience-box h3 {
font-size: 54px;
font-weight: 800;
margin: 0;
line-height: 1;
}
.experience-box span {
font-size: 16px;
font-weight: 600;
display: block;
margin-top: 5px;
line-height: 1.2;
}
.main-img-wrap {
width: 100%;
max-width: 450px;
border-radius: 10px;
overflow: hidden;
margin-left: auto;
box-shadow: 0 20px 50px rgba(0,0,0,0.08);
}
.main-img-wrap img {
width: 100%;
display: block;
}
.curved-img-wrap {
position: absolute;
bottom: -40px;
left: -20px;
width: 320px;
height: 320px;
border-radius: 100px 30px 100px 100px;
overflow: hidden;
border: 8px solid #fff;
z-index: 2;
box-shadow: 0 15px 45px rgba(0,0,0,0.12);
}
.curved-img-wrap img {
width: 100%;
height: 100%;
object-fit: cover;
}
.dots-shape {
position: absolute;
top: 80px;
left: -40px;
z-index: 1;
opacity: 0.4;
}
.section-subtitle {
color: #3779b9;
font-weight: 700;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 12px;
font-size: 15px;
text-transform: uppercase;
letter-spacing: 1.5px;
}
.rotate-triangle {
font-size: 14px;
transform: rotate(-30deg);
}
.section-title {
font-size: 46px;
font-weight: 800;
color: #0f172a;
line-height: 1.2;
margin-bottom: 25px;
}
.section-desc {
font-size: 16px;
color: #64748b;
line-height: 1.8;
margin-bottom: 35px;
}
.small-feature-img {
width: 140px;
flex-shrink: 0;
}
.small-feature-img img {
width: 100%;
}
.maroon-icon {
color: #0f172a;
font-size: 18px;
margin-right: 12px;
}
.bullet-item span {
font-size: 16px;
font-weight: 600;
color: #0f172a;
}
.about-more-btn {
display: inline-flex;
align-items: center;
background: #3779b9;
color: #fff;
padding: 8px 8px 8px 25px;
border-radius: 6px;
text-decoration: none;
font-weight: 700;
font-size: 14px;
letter-spacing: 1px;
transition: all 0.3s ease;
}
.about-more-btn:hover {
background: #2563eb;
transform: translateY(-2px);
}
.icon-circle {
width: 40px;
height: 40px;
background: #fff;
color: #3779b9;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
margin-left: 20px;
}
.animate-bounce-y {
animation: bounceY 4s infinite ease-in-out;
}
@keyframes bounceY {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-15px); }
}
@media (max-width: 1199px) {
.content-area {
padding-left: 30px;
}
.section-title {
font-size: 38px;
}
.curved-img-wrap {
width: 260px;
height: 260px;
}
}
@media (max-width: 991px) {
.about-image-stack {
margin-bottom: 80px;
padding-left: 0;
}
.content-area {
padding-left: 0;
}
}
@media (max-width: 575px) {
.curved-img-wrap {
width: 200px;
height: 200px;
bottom: -20px;
left: 0;
}
.experience-box {
padding: 25px 20px;
}
.experience-box h3 {
font-size: 40px;
}
}
`}</style>
</section>
);
};
export default AboutService;

View File

@ -550,9 +550,9 @@ export const pricingPlans: PricingType[] = [
export const psychologyServices = [ export const psychologyServices = [
{ {
id: 1, id: 1,
title: "Cognitive Psychology", title: "Website Development",
slug: "cognitive-psychology", slug: "web-development",
icon: "fa-solid fa-brain", icon: "fa-solid fa-code",
image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg", image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg",
description: "Business tailored design, management & support services Business for free.", description: "Business tailored design, management & support services Business for free.",
content: ` content: `
@ -583,9 +583,9 @@ export const psychologyServices = [
}, },
{ {
id: 2, id: 2,
title: "Academic Psychology", title: "Mobile Application Development",
slug: "academic-psychology", slug: "mobile-app-development",
icon: "fa-solid fa-graduation-cap", icon: "fa-solid fa-mobile-screen-button",
image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg", image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg",
description: "Business tailored design, management & support services Business for free.", description: "Business tailored design, management & support services Business for free.",
content: ` content: `
@ -616,9 +616,9 @@ export const psychologyServices = [
}, },
{ {
id: 3, id: 3,
title: "Career Counseling", title: "Graphic Designing",
slug: "career-counseling", slug: "graphic-designing",
icon: "fa-solid fa-user-tie", icon: "fa-solid fa-palette",
image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg", image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg",
description: "Business tailored design, management & support services Business for free.", description: "Business tailored design, management & support services Business for free.",
content: ` content: `
@ -649,9 +649,9 @@ export const psychologyServices = [
}, },
{ {
id: 4, id: 4,
title: "Clinical Psychology", title: "UI / UX Designing",
slug: "clinical-psychology", slug: "ui-ux-designing",
icon: "fa-solid fa-stethoscope", icon: "fa-solid fa-palette",
image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg", image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg",
description: "Business tailored design, management & support services Business for free.", description: "Business tailored design, management & support services Business for free.",
content: ` content: `
@ -682,9 +682,9 @@ export const psychologyServices = [
}, },
{ {
id: 5, id: 5,
title: "Psychiatric Treatment", title: "SEO & Content Writing",
slug: "psychiatric-treatment", slug: "seo-content-writing",
icon: "fa-solid fa-hospital-user", icon: "fa-solid fa-palette",
image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg", image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg",
description: "Business tailored design, management & support services Business for free.", description: "Business tailored design, management & support services Business for free.",
content: ` content: `
@ -715,9 +715,9 @@ export const psychologyServices = [
}, },
{ {
id: 6, id: 6,
title: "Family Therapy", title: "Digital Marketing",
slug: "family-therapy", slug: "digital-marketing",
icon: "fa-solid fa-hospital-user", icon: "fa-solid fa-palette",
image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg", image: "https://bracketweb.com/pelocishtml/assets/images/resources/service-d-2.jpg",
description: "Business tailored design, management & support services Business for free.", description: "Business tailored design, management & support services Business for free.",
content: ` content: `