contact poup updated in carees page

This commit is contained in:
akash 2026-03-14 22:22:23 +05:30
parent 763c0df3c1
commit 0108118f2c
8 changed files with 308 additions and 514 deletions

View File

@ -7,8 +7,8 @@ import PageHeader from "@/components/common/PageHeader";
import MetatronInitializer from "@/components/MetatronInitializer"; import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Top 5 SEO Trends for 2025 | Metatroncube", title: "Web Dev, SEO & Digital Marketing Blog | Metatroncube",
description: "Explore the latest SEO strategies for 2025. Stay ahead with insights from Metatroncube Software Solution.", description: "Expert insights on web development, SEO strategies, and digital marketing trends. Actionable tips from Metatroncube Software Solutions in Waterloo, Canada.",
alternates: { alternates: {
canonical: "/blog", canonical: "/blog",
}, },

View File

@ -8,7 +8,7 @@ import AboutService from "@/components/services-digital-solutions/AboutService";
import AboutThree from "@/components/home/AboutThree"; import AboutThree from "@/components/home/AboutThree";
import ProjectsSection from "@/components/home/ProjectsSection"; import ProjectsSection from "@/components/home/ProjectsSection";
import MetatronInitializer from "@/components/MetatronInitializer"; import MetatronInitializer from "@/components/MetatronInitializer";
import CareersForm from "@/components/careers/CareersForm";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Careers - Metatroncube Software Solution | Innovative & User-Centric Tech Services in Waterloo", title: "Careers - Metatroncube Software Solution | Innovative & User-Centric Tech Services in Waterloo",
@ -33,7 +33,7 @@ export default function CareersPage() {
<AboutThree /> <AboutThree />
<WhyChooseUs /> <WhyChooseUs />
<ProjectsSection /> <ProjectsSection />
{/* <CareersForm /> */}
</main> </main>
<Footer1 /> <Footer1 />
</> </>

View File

@ -6841,7 +6841,7 @@ body {
.faq-one__accordion .accrodion { .faq-one__accordion .accrodion {
margin-bottom: 25px; margin-bottom: 25px;
border-radius: 70px; border-radius: 10px;
border: 1px solid var(--pelocis-border-color, #DDDDDD); border: 1px solid var(--pelocis-border-color, #DDDDDD);
overflow: hidden; overflow: hidden;
transition: all 400ms ease; transition: all 400ms ease;
@ -6921,10 +6921,14 @@ body {
color: var(--pelocis-white, #fff); color: var(--pelocis-white, #fff);
font-size: 10px; font-size: 10px;
transition: all 400ms ease; transition: all 400ms ease;
opacity: 0;
visibility: hidden;
} }
.faq-one__accordion .active .accrodion-title__icon { .faq-one__accordion .active .accrodion-title__icon {
background-color: var(--pelocis-base, #3779b9); background-color: var(--pelocis-base, #3779b9);
opacity: 1;
visibility: visible;
} }
.faq-one__accordion .accrodion-content .inner { .faq-one__accordion .accrodion-content .inner {
@ -9307,46 +9311,58 @@ body {
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.2); box-shadow: 0 20px 50px rgba(0, 0, 0, 0.2);
} }
.form-label-custom-global { .form-label-custom-global,
.form-label-custom {
display: block; display: block;
margin-bottom: 8px; margin-bottom: 8px;
font-weight: 700; font-weight: 700;
color: #fff; color: #fff;
font-size: 14px; font-size: 14px;
letter-spacing: 0.5px; letter-spacing: 0.5px;
text-transform: uppercase;
} }
.form-input-custom-global, .form-input-custom-global,
.form-textarea-custom-global, .form-textarea-custom-global,
.form-select-custom-styled-global { .form-select-custom-styled-global,
.form-input,
.form-select,
.form-textarea {
width: 100%; width: 100%;
padding: 18px 25px; padding: 15px 20px;
border: 1px solid #e2e8f0; border: 1px solid rgba(255, 255, 255, 0.1);
background-color: #fff; background-color: rgba(255, 255, 255, 0.05);
border-radius: 12px; border-radius: 12px;
outline: none; outline: none;
font-size: 15px; font-size: 15px;
color: #1e293b; color: #fff;
transition: all 0.3s ease; transition: all 0.3s ease;
height: 60px;
} }
.form-textarea-custom-global { .form-textarea-custom-global,
min-height: 120px; .form-textarea {
min-height: 100px;
height: auto;
resize: vertical; resize: vertical;
} }
.form-input-custom-global:focus, .form-input-custom-global:focus,
.form-textarea-custom-global:focus, .form-textarea-custom-global:focus,
.form-select-custom-styled-global:focus { .form-select-custom-styled-global:focus,
.form-input:focus,
.form-textarea:focus,
.form-select:focus {
border-color: #3779b9; border-color: #3779b9;
box-shadow: 0 0 0 4px rgba(55, 121, 185, 0.1); background-color: rgba(255, 255, 255, 0.08);
box-shadow: 0 0 0 4px rgba(55, 121, 185, 0.15);
} }
.submit-btn-custom-global { .submit-btn-custom-global {
width: 100%; width: 100%;
background: #3779b9 !important; background: #3779b9 !important;
color: #fff !important; color: #fff !important;
padding: 20px 30px; padding: 18px 30px;
border: none; border: none;
border-radius: 12px; border-radius: 12px;
font-weight: 700; font-weight: 700;
@ -9355,7 +9371,12 @@ body {
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 1.5px; letter-spacing: 1.5px;
font-size: 17px; font-size: 17px;
box-shadow: 0 10px 20px rgba(99, 102, 241, 0.2); box-shadow: 0 10px 20px rgba(55, 121, 185, 0.2);
height: 60px;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
} }
.submit-btn-custom-global:hover { .submit-btn-custom-global:hover {
@ -16449,7 +16470,7 @@ h4.service-details__dynamic-content-erp {
padding: 18px 24px; padding: 18px 24px;
cursor: pointer; cursor: pointer;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
min-height: 70px; min-height: 40px;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
} }
@ -17346,9 +17367,6 @@ h4.service-details__dynamic-content-erp {
} }
.careers-popup-optimized .file-content { .careers-popup-optimized .file-content {
display: flex;
align-items: center;
gap: 10px;
color: rgba(255, 255, 255, 0.6); color: rgba(255, 255, 255, 0.6);
} }
@ -17367,8 +17385,9 @@ h4.service-details__dynamic-content-erp {
.careers-popup-optimized .form-panel { .careers-popup-optimized .form-panel {
padding: 30px 45px 25px !important; padding: 30px 45px 25px !important;
background: #1a1f2b !important; background: #1a1f2b !important;
overflow: hidden !important; overflow-y: auto !important;
/* Force no scroll on panel */ /* Allow internal scroll if needed as fallback */
max-height: calc(100vh - 40px);
} }
.careers-popup-optimized .form-header { .careers-popup-optimized .form-header {
@ -17463,9 +17482,6 @@ h4.service-details__dynamic-content-erp {
} }
.careers-popup-optimized .file-content { .careers-popup-optimized .file-content {
display: flex;
align-items: center;
gap: 10px;
color: rgba(255, 255, 255, 0.6); color: rgba(255, 255, 255, 0.6);
} }
@ -17552,125 +17568,240 @@ h4.service-details__dynamic-content-erp {
.careers-popup-optimized { .careers-popup-optimized {
max-width: 600px !important; max-width: 600px !important;
width: 90% !important; width: 90% !important;
max-height: 95vh !important;
overflow-y: auto !important;
} }
/* No-scroll optimization: compress vertical rhythm */
.careers-popup-optimized .form-panel { .careers-popup-optimized .form-panel {
padding: 15px 30px 10px !important; padding: 10px 20px 10px !important;
} }
.careers-popup-optimized .form-header { .careers-popup-optimized .form-header {
margin-bottom: 15px; margin-bottom: 5px !important;
}
.careers-popup-optimized .form-input {
padding: 10px 14px !important;
}
.careers-popup-optimized .form-textarea {
min-height: 60px !important;
}
.careers-popup-optimized .g-recaptcha-container {
transform: scale(0.8);
margin: 5px 0 !important;
}
.contact-popup-content .close-btn {
position: absolute;
top: 10px !important;
right: 10px !important;
background: #f3f4f6;
border: none;
width: 25px !important;
height: 25px !important;
border-radius: 50%;
font-size: 16px !important;
cursor: pointer;
color: #1a1f2b;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
z-index: 100;
}
}
/* 500-475px */
@media (max-width: 500px) {
.careers-popup-optimized {
width: 95% !important;
}
.careers-popup-optimized .form-panel {
padding: 12px 20px 8px !important;
} }
.careers-popup-optimized .form-title { .careers-popup-optimized .form-title {
font-size: 20px !important; font-size: 20px !important;
} }
.careers-popup-optimized .form-subtitle { .careers-popup-optimized .form-input,
font-size: 12px !important; .careers-popup-optimized .form-select,
} .careers-popup-optimized .form-textarea {
height: 33px !important;
.careers-popup-optimized .form-label-custom { padding: 8px 15px !important;
font-size: 9px !important; font-size: 14px !important;
margin-bottom: 3px;
}
.careers-popup-optimized .mt-3 {
margin-top: 8px !important;
}
}
/* 425px */
@media (max-width: 425px) {
.careers-popup-optimized .form-panel {
padding: 10px 15px 5px !important;
}
.careers-popup-optimized .g-recaptcha-container {
transform: scale(0.75);
}
}
/* 320px - Small Mobile */
@media (max-width: 320px) {
.careers-popup-optimized .form-panel {
padding: 8px 12px 5px !important;
}
.careers-popup-optimized .form-title {
font-size: 18px !important;
}
.careers-popup-optimized .form-subtitle {
display: none;
}
.careers-popup-optimized .form-label-custom {
display: none;
}
/* Hide labels, placeholders only to save vertical space */
.careers-popup-optimized .form-input {
padding: 8px 12px !important;
font-size: 12px !important;
} }
.careers-popup-optimized .form-textarea { .careers-popup-optimized .form-textarea {
min-height: 50px !important; min-height: 50px !important;
font-size: 12px !important;
} }
.careers-popup-optimized .g-recaptcha-container { .careers-popup-optimized .g-recaptcha-container {
transform: scale(0.65); transform: scale(0.7) !important;
margin: 3px 0 !important; margin: 0 !important;
height: 60px !important;
overflow: hidden !important;
} }
.careers-popup-optimized .submit-btn { .careers-popup-optimized .submit-btn {
padding: 12px !important; height: 50px !important;
font-size: 13px !important;
margin-top: 5px !important; margin-top: 5px !important;
} }
}
/* 500-320px - Mobile */
@media (max-width: 500px) {
.careers-popup-optimized {
width: 95% !important;
max-height: 98vh !important;
}
.careers-popup-optimized .form-panel {
padding: 8px 15px 5px !important;
}
.careers-popup-optimized .form-label-custom {
font-size: 11px !important;
margin-bottom: 2px !important;
}
.careers-popup-optimized .row.g-3 {
--bs-gutter-y: 8px !important;
}
.careers-popup-optimized .mt-3 {
margin-top: 5px !important;
}
.careers-popup-optimized .file-upload-styled {
margin-bottom: 5px !important;
}
.careers-popup-optimized .file-browse-btn {
padding: 4px 10px !important;
font-size: 12px !important;
}
}
.careers-popup-optimized .form-textarea {
min-height: 50px !important;
font-size: 12px !important;
color: #fff;
}
.careers-popup-optimized .g-recaptcha-container {
transform: scale(0.65);
margin: 3px 0 !important;
}
.careers-popup-optimized .submit-btn {
padding: 12px !important;
font-size: 13px !important;
margin-top: 5px !important;
}
/* ── Height Based Responsiveness (No-Scroll Optimization) ── */
@media (max-height: 600px) {
.careers-popup-optimized .form-panel {
padding: 8px 15px 5px !important;
}
.careers-popup-optimized .form-header {
margin-bottom: 5px !important;
}
.careers-popup-optimized .form-title {
font-size: 16px !important;
}
.careers-popup-optimized .form-label-custom {
font-size: 9px !important;
margin-bottom: 2px !important;
}
.careers-popup-optimized .form-input,
.careers-popup-optimized .form-select {
height: 36px !important;
padding: 4px 10px !important;
font-size: 13px !important;
}
.careers-popup-optimized .form-textarea {
min-height: 36px !important;
height: 36px !important;
padding: 5px 10px !important;
}
.careers-popup-optimized .file-upload-label {
padding: 4px 10px !important;
}
.careers-popup-optimized .file-browse-btn {
padding: 2px 8px !important;
font-size: 10px !important;
}
.careers-popup-optimized .g-recaptcha-container {
transform: scale(0.6) !important;
transform-origin: center center;
height: 48px !important;
margin: 2px 0 !important;
}
.careers-popup-optimized .submit-btn {
height: 38px !important;
margin-top: 5px !important;
font-size: 11px !important;
padding: 5px !important;
}
}
@media (max-height: 500px) {
.careers-popup-optimized {
border-radius: 12px !important;
}
.careers-popup-optimized .form-panel {
padding: 2px 10px 2px !important;
}
.careers-popup-optimized .form-header {
margin-bottom: 2px !important;
}
.careers-popup-optimized .form-title {
font-size: 14px !important;
}
.careers-popup-optimized .form-label-custom {
font-size: 8px !important;
margin-bottom: 0 !important;
}
.careers-popup-optimized .form-input,
.careers-popup-optimized .form-select,
.careers-popup-optimized .form-textarea {
height: 30px !important;
min-height: 30px !important;
padding: 2px 8px !important;
font-size: 11px !important;
}
.careers-popup-optimized .mt-3,
.careers-popup-optimized .mt-1 {
margin-top: 2px !important;
}
.careers-popup-optimized .file-upload-label {
padding: 2px 8px !important;
border-width: 1px !important;
}
.careers-popup-optimized .file-content i {
font-size: 10px !important;
}
.careers-popup-optimized .file-name-text {
font-size: 10px !important;
}
.careers-popup-optimized .file-browse-btn {
padding: 2px 6px !important;
font-size: 9px !important;
}
.careers-popup-optimized .g-recaptcha-container {
transform: scale(0.5) !important;
height: 38px !important;
margin: 1px 0 !important;
}
.careers-popup-optimized .submit-btn {
height: 32px !important;
margin-top: 2px !important;
font-size: 10px !important;
padding: 0 !important;
}
/* Extreme optimization: hide labels for optional fields to save space */
.careers-popup-optimized .form-field-wrapper .form-label-custom {
display: none;
}
.careers-popup-optimized .optional-label {
display: none;
}
}
@media (max-height: 400px) {
.careers-popup-optimized .form-header {
display: none;
/* Hide header on very short screens to save space */
}
.careers-popup-optimized .form-panel {
padding-top: 20px !important;
/* Room for close btn */
}
} }

View File

@ -12,13 +12,9 @@ interface CareersContactPopupProps {
} }
const positions = [ const positions = [
{ value: "Frontend Developer", label: "Website Development" }, { value: "Website Development", label: "Website Development" },
{ value: "Backend Developer", label: "Social Media Marketing" }, { value: "Social Media Marketing", label: "Social Media Marketing" },
{ value: "Full Stack Developer", label: "Search Engine Optimization" }, { value: "Search Engine Optimization (SEO)", label: "Search Engine Optimization (SEO)" },
{ value: "UI/UX Designer", label: "Mobile App Development" },
{ value: "SEO Specialist", label: "UI/UX Designing" },
{ value: "Digital Marketing Executive", label: "Graphic Designing" },
{ value: "Other", label: "Other" },
]; ];
const CareersContactPopup: React.FC<CareersContactPopupProps> = ({ const CareersContactPopup: React.FC<CareersContactPopupProps> = ({
@ -26,12 +22,25 @@ const CareersContactPopup: React.FC<CareersContactPopupProps> = ({
onClose, onClose,
defaultPosition = "", defaultPosition = "",
}) => { }) => {
// Helper to find match in positions array
const getMatchedPosition = (val: string) => {
if (!val) return "";
const searchStr = val.toLowerCase();
const found = positions.find(p =>
p.label.toLowerCase() === searchStr ||
p.value.toLowerCase() === searchStr ||
searchStr.includes(p.label.toLowerCase()) ||
p.label.toLowerCase().includes(searchStr)
);
return found ? found.value : val;
};
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
name: "", name: "",
email: "", email: "",
phone: "", phone: "",
position: defaultPosition, position: getMatchedPosition(defaultPosition),
message: "", message: "",
}); });
const [resumeFile, setResumeFile] = useState<File | null>(null); const [resumeFile, setResumeFile] = useState<File | null>(null);
@ -48,7 +57,9 @@ const CareersContactPopup: React.FC<CareersContactPopupProps> = ({
// Sync position when defaultPosition changes (new card clicked) // Sync position when defaultPosition changes (new card clicked)
useEffect(() => { useEffect(() => {
setFormData((prev) => ({ ...prev, position: defaultPosition })); if (defaultPosition) {
setFormData((prev) => ({ ...prev, position: getMatchedPosition(defaultPosition) }));
}
}, [defaultPosition]); }, [defaultPosition]);
// Close on ESC // Close on ESC
@ -127,17 +138,21 @@ const CareersContactPopup: React.FC<CareersContactPopupProps> = ({
email: formData.email, email: formData.email,
phone: formData.phone, phone: formData.phone,
position: formData.position, position: formData.position,
message: `Position: ${formData.position}<br /><br />Phone: ${formData.phone}<br /><br />Message: ${formData.message || "No additional message."}`, message: `Full Name: ${formData.name}<br />Email Address: ${formData.email}<br />Phone Number: ${formData.phone}<br />Position: ${formData.position}<br /><br />Message: ${formData.message || "No additional message."}${resumeFile ? `<br /><br /><b>Resume attached:</b> ${resumeFile.name}` : ""}`,
to: "info@metatroncubesolutions.com", to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Careers Application", senderName: "Metatroncube Careers Application",
recaptchaToken: captchaToken, recaptchaToken: captchaToken,
}; };
if (resumeBase64 && resumeFile) { if (resumeBase64 && resumeFile) {
// Extract raw base64 from data URI
const base64Content = resumeBase64.split(",")[1];
emailData.attachments = [ emailData.attachments = [
{ {
filename: resumeFile.name, filename: resumeFile.name,
path: resumeBase64, content: base64Content,
contentType: resumeFile.type,
encoding: 'base64',
}, },
]; ];
} }
@ -178,7 +193,7 @@ const CareersContactPopup: React.FC<CareersContactPopupProps> = ({
}, [alert.show]); }, [alert.show]);
const handleReset = () => { const handleReset = () => {
setFormData({ name: "", email: "", phone: "", position: defaultPosition, message: "" }); setFormData({ name: "", email: "", phone: "", position: getMatchedPosition(defaultPosition), message: "" });
setResumeFile(null); setResumeFile(null);
setResumeBase64(null); setResumeBase64(null);
if (fileInputRef.current) fileInputRef.current.value = ""; if (fileInputRef.current) fileInputRef.current.value = "";
@ -275,7 +290,12 @@ const CareersContactPopup: React.FC<CareersContactPopupProps> = ({
> >
<option value="">Select Position</option> <option value="">Select Position</option>
{positions {positions
.filter(pos => !defaultPosition || pos.value === defaultPosition) .filter(pos => !defaultPosition ||
pos.label === defaultPosition ||
pos.value === defaultPosition ||
defaultPosition.toLowerCase().includes(pos.label.toLowerCase()) ||
pos.label.toLowerCase().includes(defaultPosition.toLowerCase())
)
.map((pos) => ( .map((pos) => (
<option key={pos.value} value={pos.value}> <option key={pos.value} value={pos.value}>
{pos.label} {pos.label}

View File

@ -1,351 +0,0 @@
"use client";
import React, { useState, useEffect, useRef } from "react";
import ReCAPTCHA from "react-google-recaptcha";
import axios from "axios";
const CareersForm = () => {
const sectionRef = useRef<HTMLDivElement>(null);
const [formData, setFormData] = useState({
name: "",
email: "",
phone: "",
position: "",
message: "",
});
const [resumeFile, setResumeFile] = useState<File | null>(null);
const [resumeBase64, setResumeBase64] = useState<string | null>(null);
const [formErrors, setFormErrors] = useState<any>({});
const [captchaToken, setCaptchaToken] = useState<string | null>(null);
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
const [isSubmitting, setIsSubmitting] = useState(false);
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setFormData((prev) => ({ ...prev, [name]: value }));
};
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
if (e.target.files && e.target.files.length > 0) {
const file = e.target.files[0];
// Check file size (e.g., max 5MB)
if (file.size > 5 * 1024 * 1024) {
setFormErrors((prev: any) => ({ ...prev, resume: "File size should be less than 5MB." }));
setResumeFile(null);
setResumeBase64(null);
return;
}
// Check file type
const allowedTypes = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'];
if (!allowedTypes.includes(file.type)) {
setFormErrors((prev: any) => ({ ...prev, resume: "Only PDF and Word documents are allowed." }));
setResumeFile(null);
setResumeBase64(null);
return;
}
setResumeFile(file);
setFormErrors((prev: any) => ({ ...prev, resume: undefined }));
// Convert to Base64 for email attachment
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
setResumeBase64(reader.result as string);
};
reader.onerror = (error) => {
console.error("Error reading file:", error);
setFormErrors((prev: any) => ({ ...prev, resume: "Error reading file." }));
};
}
};
const handleCaptchaChange = (token: string | null) => {
setCaptchaToken(token);
};
useEffect(() => {
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const elements = entry.target.querySelectorAll(".wow");
elements.forEach((el) => {
const htmlEl = el as HTMLElement;
const delay = htmlEl.dataset.wowDelay || "0ms";
setTimeout(() => {
htmlEl.classList.add("animated");
if (htmlEl.classList.contains("fadeInLeft")) {
htmlEl.classList.add("fadeInLeft");
} else if (htmlEl.classList.contains("fadeInRight")) {
htmlEl.classList.add("fadeInRight");
} else {
htmlEl.classList.add("fadeInUp");
}
htmlEl.style.visibility = "visible";
}, parseInt(delay));
});
observer.unobserve(entry.target);
}
});
},
{ threshold: 0.1 }
);
if (sectionRef.current) {
observer.observe(sectionRef.current);
}
return () => observer.disconnect();
}, []);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
const errors: any = {};
if (!formData.name.trim()) errors.name = "Name is required.";
if (!formData.email.trim()) errors.email = "Email is required.";
if (!formData.phone.trim()) errors.phone = "Phone is required.";
if (!formData.position.trim()) errors.position = "Please select a position.";
if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
if (!resumeFile) errors.resume = "Please upload your resume.";
setFormErrors(errors);
if (Object.keys(errors).length > 0) return;
setIsSubmitting(true);
const emailData: any = {
...formData,
message: `Position: ${formData.position}<br /><br />Phone: ${formData.phone}<br /><br />Message: ${formData.message || "No additional message."}`,
to: "info@metatroncubesolutions.com",
senderName: "Metatroncube Careers Application",
recaptchaToken: captchaToken,
};
// If the backend endpoint supports attachments via Nodemailer's "attachments" array matching to data URI paths
if (resumeBase64 && resumeFile) {
emailData.attachments = [
{
filename: resumeFile.name,
path: resumeBase64
}
];
}
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 || "Application submitted successfully!",
});
setFormData({
name: "",
email: "",
phone: "",
position: "",
message: "",
});
setResumeFile(null);
setResumeBase64(null);
// Reset file input value manually
const fileInput = document.getElementById("resume-upload") as HTMLInputElement;
if (fileInput) fileInput.value = "";
setCaptchaToken(null);
setFormErrors({});
} catch (error) {
console.error("❌ Error sending email:", error);
setAlert({
show: true,
type: "danger",
message: "Failed to submit application. Please try again later.",
});
} finally {
setIsSubmitting(false);
}
};
useEffect(() => {
if (alert.show) {
const timer = setTimeout(() => {
setAlert((prev) => ({ ...prev, show: false }));
}, 5000);
return () => clearTimeout(timer);
}
}, [alert.show]);
return (
<section ref={sectionRef} className="contact-one section-space-bottom" id="careers-form">
<div className="container contact-one__container wow fadeInUp" data-wow-delay="100ms">
<div
className="contact-one__wrapper"
style={{ backgroundImage: "url(/assets/images/careers/right-bottom-element.webp)" }}
>
<div className="row">
<div className="col-lg-6">
<div className="contact-one__image-two">
<img src="/assets/images/careers/left-img.webp" alt="Career Growth" />
</div>
</div>
<div className="col-lg-6">
<div className="contact-one__content">
<div className="sec-title text-left">
<h6 className="sec-title__tagline">
<span className="sec-title__tagline__left"></span>
Join Our Team
<span className="sec-title__tagline__right"></span>
</h6>
<h3 className="sec-title__title" style={{ color: "#fff" }}>
Apply for your dream position today.
</h3>
</div>
{alert.show && (
<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}>
<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}
className="form-input"
suppressHydrationWarning={true}
/>
{formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div>
<div className="mb-20">
<label className="form-label">Email Address *</label>
<input
type="email"
name="email"
placeholder="Email Address"
value={formData.email}
onChange={handleChange}
className="form-input"
suppressHydrationWarning={true}
/>
{formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div>
<div className="mb-20">
<label className="form-label">Phone Number *</label>
<input
type="tel"
name="phone"
placeholder="Phone Number"
value={formData.phone}
onChange={handleChange}
className="form-input"
suppressHydrationWarning={true}
/>
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div>
<div className="mb-20">
<label className="form-label">Select Position *</label>
<select
name="position"
value={formData.position}
onChange={handleChange}
className="form-select-custom"
suppressHydrationWarning={true}
>
<option value="">Select Position</option>
<option value="Frontend Developer">Website Development</option>
<option value="Backend Developer">Social Media Marketing</option>
<option value="Full Stack Developer">Search Engine Optimization</option>
<option value="UI/UX Designer">Mobile App Development</option>
<option value="SEO Specialist">UI/UX Designing</option>
<option value="Digital Marketing Executive">Graphic Designing</option>
<option value="Other">Other</option>
</select>
{formErrors.position && <small className="text-danger">{formErrors.position}</small>}
</div>
<div className="form-one__control--full mb-20 mt-2">
<label className="form-label">Upload Resume (PDF, DOC, DOCX) *</label>
<div className="custom-file-upload">
<input
id="resume-upload"
type="file"
name="resume"
accept=".pdf,.doc,.docx,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
onChange={handleFileChange}
className="hidden-file-input"
suppressHydrationWarning={true}
/>
<label htmlFor="resume-upload" className="file-upload-label">
<div className="file-upload-content">
<i className="fa-solid fa-cloud-arrow-up"></i>
<span className="file-name">
{resumeFile ? resumeFile.name : "Choose your resume"}
</span>
</div>
<div className="file-upload-browse">
Browse
</div>
</label>
</div>
{formErrors.resume && <small className="text-danger">{formErrors.resume}</small>}
</div>
<div className="form-one__control--full mb-20">
<label className="form-label">Cover Letter / Message (Optional)</label>
<textarea
name="message"
placeholder="Write your message here..."
rows={3}
value={formData.message}
onChange={handleChange}
className="form-textarea"
suppressHydrationWarning={true}
></textarea>
</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-custom-global" disabled={isSubmitting} suppressHydrationWarning={true}>
<b>{isSubmitting ? "SUBMITTING..." : "SUBMIT APPLICATION"}</b>
<span></span>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
);
};
export default CareersForm;

View File

@ -181,54 +181,53 @@ const ContactSection = () => {
</div> </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="mb-20"> <div className="mb-20">
<label className="form-label">Full Name</label> <label className="form-label-custom">Full Name</label>
<input <input
type="text" type="text"
name="name" name="name"
placeholder="Full Name" placeholder="Full Name"
value={formData.name} value={formData.name}
onChange={handleChange} onChange={handleChange}
className="form-input" className="form-input-custom-global"
suppressHydrationWarning={true} suppressHydrationWarning={true}
/> />
{formErrors.name && <small className="text-danger">{formErrors.name}</small>} {formErrors.name && <small className="text-danger">{formErrors.name}</small>}
</div> </div>
<div className="mb-20"> <div className="mb-20">
<label className="form-label">Email Address</label> <label className="form-label-custom">Email Address</label>
<input <input
type="email" type="email"
name="email" name="email"
placeholder="Email Address" placeholder="Email Address"
value={formData.email} value={formData.email}
onChange={handleChange} onChange={handleChange}
className="form-input" className="form-input-custom-global"
suppressHydrationWarning={true} suppressHydrationWarning={true}
/> />
{formErrors.email && <small className="text-danger">{formErrors.email}</small>} {formErrors.email && <small className="text-danger">{formErrors.email}</small>}
</div> </div>
<div className="mb-20"> <div className="mb-20">
<label className="form-label">Phone Number</label> <label className="form-label-custom">Phone Number</label>
<input <input
type="text" type="text"
name="phone" name="phone"
placeholder="Phone Number" placeholder="Phone Number"
value={formData.phone} value={formData.phone}
onChange={handleChange} onChange={handleChange}
className="form-input" className="form-input-custom-global"
suppressHydrationWarning={true} suppressHydrationWarning={true}
/> />
{formErrors.phone && <small className="text-danger">{formErrors.phone}</small>} {formErrors.phone && <small className="text-danger">{formErrors.phone}</small>}
</div> </div>
<div className="mb-20"> <div className="mb-20">
<label className="form-label">Select Service</label> <label className="form-label-custom">Select Service</label>
<select <select
name="service" name="service"
value={formData.service} value={formData.service}
onChange={handleChange} onChange={handleChange}
className="form-select-custom" className="form-select-custom-styled-global"
suppressHydrationWarning={true} suppressHydrationWarning={true}
> >
<option value="">Select Service</option> <option value="">Select Service</option>
@ -242,14 +241,14 @@ const ContactSection = () => {
{formErrors.service && <small className="text-danger">{formErrors.service}</small>} {formErrors.service && <small className="text-danger">{formErrors.service}</small>}
</div> </div>
<div className="form-one__control--full mb-20"> <div className="form-one__control--full mb-20">
<label className="form-label">Write Message</label> <label className="form-label-custom">Write Message</label>
<textarea <textarea
name="message" name="message"
placeholder="Write Message" placeholder="Write Message"
rows={4} rows={4}
value={formData.message} value={formData.message}
onChange={handleChange} onChange={handleChange}
className="form-textarea" className="form-textarea-custom-global"
suppressHydrationWarning={true} suppressHydrationWarning={true}
></textarea> ></textarea>
{formErrors.message && <small className="text-danger">{formErrors.message}</small>} {formErrors.message && <small className="text-danger">{formErrors.message}</small>}

View File

@ -53,7 +53,7 @@ const FaqPageSection = () => {
<div className="section-title-wrapper"> <div className="section-title-wrapper">
<div className="sec-title__shape"></div> <div className="sec-title__shape"></div>
<h6 className="sec-title__tagline">Digital Mastery Unlocked</h6> <h6 className="sec-title__tagline">Digital Mastery Unlocked</h6>
<h2 className="section-title mt-4" style={{ margin: 0 }}>Metatroncube FAQs: Web-Apps, SEO, & Digital Marketing</h2> <h2 className="sec-title__title" style={{ margin: 0 }}>Metatroncube FAQs: Web-Apps, SEO, & Digital Marketing</h2>
</div> </div>
</div> </div>
<div className="col-lg-6"> <div className="col-lg-6">

View File

@ -10,7 +10,7 @@ const projectsData = [
description: "5 Feb, 2025 | Full Time", description: "5 Feb, 2025 | Full Time",
image: "/assets/images/careers/4/web.webp", image: "/assets/images/careers/4/web.webp",
category: "web", category: "web",
link: "/services-digital-solutions/website-development-company" link: "#"
}, },
{ {
id: 2, id: 2,
@ -18,7 +18,7 @@ const projectsData = [
description: "5 Feb, 2025 | Full Time", description: "5 Feb, 2025 | Full Time",
image: "/assets/images/careers/4/seo.webp", image: "/assets/images/careers/4/seo.webp",
category: "seo", category: "seo",
link: "/services-digital-solutions/search-engine-optimization-seo-content-writing" link: "#"
}, },
{ {
id: 3, id: 3,
@ -26,7 +26,7 @@ const projectsData = [
description: "5 Feb, 2025 | Full Time", description: "5 Feb, 2025 | Full Time",
image: "/assets/images/careers/4/smm.webp", image: "/assets/images/careers/4/smm.webp",
category: "dm", category: "dm",
link: "/services-digital-solutions/digital-marketing-agency-in-canada" link: "#"
} }
]; ];
@ -126,30 +126,25 @@ const ProjectsSection = () => {
{filteredProjects.map((project) => ( {filteredProjects.map((project) => (
<div key={project.id} className="project-item"> <div key={project.id} className="project-item">
<div className="projects-one__card" onClick={(e) => openPopup(project.title, e)}> <div className="projects-one__card" style={{ cursor: 'pointer' }} onClick={(e) => openPopup(project.title, e)}>
<img src={project.image} alt={project.title} /> <img src={project.image} alt={project.title} />
<div className="projects-one__card__hover d-flex"> <div className="projects-one__card__hover d-flex">
<div className="projects-one__card__hover-mask"></div> <div className="projects-one__card__hover-mask"></div>
<div className="projects-one__card__hover-content-inner"> <div className="projects-one__card__hover-content-inner">
<div className="projects-one__card__hover-text"> <div className="projects-one__card__hover-text">
<h3> <h3 style={{ color: 'white' }}>
<a {project.title}
href="#"
onClick={(e) => openPopup(project.title, e)}
>
{project.title}
</a>
</h3> </h3>
<p>{project.description}</p> <p>{project.description}</p>
</div> </div>
<div className="projects-one__card__hover-item"></div> <div className="projects-one__card__hover-item"></div>
<a <div
href="#"
className="projects-one__card__hover-link" className="projects-one__card__hover-link"
style={{ cursor: 'pointer' }}
onClick={(e) => openPopup(project.title, e)} onClick={(e) => openPopup(project.title, e)}
> >
<i className="fa fa-arrow-right"></i> <i className="fa fa-arrow-right"></i>
</a> </div>
</div> </div>
</div> </div>
</div> </div>