const { useEffect, useMemo, useState } = React;
const DATA = window.NXO_DATA || {};
const settings = DATA.settings || {};
const services = DATA.services || [];
const works = DATA.works || [];
const testimonials = DATA.testimonials || [];
const pricing = DATA.pricing || [];
const stats = DATA.stats || [];
const adminFaqs = DATA.faqs || [];
const servicePageMap = {
"web-design": "web-design.php",
"video-motion": "video-editing-motion-graphics.php",
"digital-marketing": "digital-marketing.php"
};
const servicePriceMap = {
"web-design": {
price: "From $499 / project",
note: "Landing pages, business sites, portfolio sites, and conversion pages."
},
"video-motion": {
price: "From $149 / video",
note: "Short-form edits, launch videos, motion graphics, intros, and social assets."
},
"digital-marketing": {
price: "From $399 / month",
note: "Campaign planning, creative direction, ad assets, funnels, and reporting."
}
};
const fallbackServices = [
{ id: "web-design", title: "Web Design", tagline: "Premium websites that convert", description: "High-end websites with a clear story, strong interface, and clean lead flow.", deliverables: "Strategy, UX, UI, responsive build, contact funnel" },
{ id: "video-motion", title: "Video Editing & Motion Graphics", tagline: "Sharp edits with motion polish", description: "Social videos, launch films, kinetic text, and animated brand systems.", deliverables: "Editing, sound polish, animation, exports" },
{ id: "digital-marketing", title: "Digital Marketing", tagline: "Campaigns that keep momentum", description: "Creative campaigns, content systems, analytics, and conversion-focused experiments.", deliverables: "Campaign plan, ad creative, calendar, analytics" }
];
const serviceSource = services.length ? services : fallbackServices;
const proofFeed = [
"Landing page structure locked",
"Motion direction in review",
"Campaign creative exported",
"Lead flow connected",
"Launch checklist prepared"
];
const processSteps = [
["01", "Discovery", "We map your offer, audience, goals, content gaps, timeline, and what the project must achieve.", "Brief, goals, assets, success metric"],
["02", "Strategy", "We shape the message, funnel, visual direction, pricing path, and production plan before execution.", "Positioning, page map, campaign angle"],
["03", "Design", "NXO builds the website, edits, motion assets, and campaign visuals inside one polished brand system.", "UI, motion, creative assets, review"],
["04", "Launch", "Final assets are deployed, forms are checked, analytics are prepared, and the next improvement loop is clear.", "Deploy, measure, improve"]
];
const fallbackFaqs = [
["Can NXO handle the full launch?", "Yes. The public offer, website, launch video, motion graphics, and marketing assets can be produced as one connected sprint."],
["Can I update the website later?", "Yes. NXO can keep your services, work, testimonials, pricing, settings, and incoming project messages organized for future updates."],
["Is Video Editing & Motion Graphics one service?", "Yes. It is intentionally combined so edits, animated typography, graphics, intros, outros, and exports stay in one production lane."],
["Does the page work on mobile?", "The landing page is built with responsive React/Tailwind sections, mobile navigation, fluid type, and compact interaction states."]
];
const faqs = adminFaqs.length
? adminFaqs.map((item) => [item.question || "Question", item.answer || "Answer coming soon."])
: fallbackFaqs;
function splitList(value) {
return String(value || "")
.split(/\r\n|\r|\n|,/)
.map((item) => item.trim())
.filter(Boolean);
}
function shortText(value, fallback, limit = 118) {
const text = String(value || fallback || "").trim();
if (text.length <= limit) {
return text;
}
return text.slice(0, limit).replace(/\s+\S*$/, "") + ".";
}
function serviceUrl(service) {
return servicePageMap[service?.id] || `service.php?id=${encodeURIComponent(service?.id || "")}`;
}
function servicePrice(service) {
return servicePriceMap[service?.id] || {
price: "Custom quote",
note: service?.tagline || "Scoped around your launch goal, timeline, and content needs."
};
}
function contactMessageForPlan(plan) {
const features = splitList(plan?.features).slice(0, 5);
const lines = [
`I want to discuss the ${plan?.name || "NXO project"} package.`,
plan?.price ? `Budget direction: ${plan.price}` : "",
plan?.description ? `Project fit: ${plan.description}` : "",
features.length ? `Included focus: ${features.join(", ")}` : "",
"",
"My project goal:",
"Timeline:",
"Anything else NXO should know:"
];
return lines.filter((line, index) => line || index >= lines.length - 3).join("\n");
}
function ratingValue(value) {
const numeric = Number(value);
if (!Number.isFinite(numeric)) {
return 5;
}
return Math.min(5, Math.max(1, numeric));
}
function reviewerInitials(name) {
return String(name || "NXO Client")
.split(/\s+/)
.filter(Boolean)
.slice(0, 2)
.map((part) => part.charAt(0).toUpperCase())
.join("") || "NC";
}
function cx() {
return Array.from(arguments).filter(Boolean).join(" ");
}
function useTheme() {
const initial = document.documentElement.getAttribute("data-theme") || "dark";
const [theme, setTheme] = useState(initial);
useEffect(() => {
document.documentElement.setAttribute("data-theme", theme);
localStorage.setItem("nxo-theme", theme);
}, [theme]);
return [theme, setTheme];
}
function useScrollProgress() {
const [progress, setProgress] = useState(0);
useEffect(() => {
function update() {
const scrollable = document.documentElement.scrollHeight - window.innerHeight;
setProgress(scrollable > 0 ? Math.min(100, Math.max(0, (window.scrollY / scrollable) * 100)) : 0);
}
update();
window.addEventListener("scroll", update, { passive: true });
window.addEventListener("resize", update);
return () => {
window.removeEventListener("scroll", update);
window.removeEventListener("resize", update);
};
}, []);
return progress;
}
function AmbientBackground() {
return (
);
}
function CircularHeroArc() {
return (
);
}
function Badge({ children, tone = "blue" }) {
const tones = {
blue: "border-sky-400/30 bg-sky-400/10 text-sky-200 light:text-sky-900",
lime: "border-lime-300/35 bg-lime-300/10 text-lime-100 light:text-lime-900",
dark: "border-white/10 bg-white/[0.06] text-white/80 light:border-slate-200 light:bg-white light:text-slate-700"
};
return {children} ;
}
function Navbar({ theme, setTheme }) {
const [open, setOpen] = useState(false);
const progress = useScrollProgress();
const primaryNav = [
["Services", "#services"],
["Work", "#work"],
["Pricing", "#pricing"],
["Contact", "#contact"]
];
const mobileNav = [
["Home", "#top"],
...primaryNav
];
const themeIcon = theme === "dark"
?
: (
<>
>
);
return (
);
}
function Hero() {
const [focusIndex, setFocusIndex] = useState(0);
const active = serviceSource[focusIndex % serviceSource.length] || serviceSource[0];
useEffect(() => {
const timer = window.setInterval(() => {
setFocusIndex((index) => (index + 1) % serviceSource.length);
}, 3200);
return () => window.clearInterval(timer);
}, []);
return (
{settings.availability || "Booking new projects"}
Web design + motion + growth
{settings.headline || "Digital work that makes brands impossible to ignore"}
{shortText(settings.subheadline, "Websites, videos, motion, and growth systems built for launches that need to look expensive and convert fast.", 128)}
{serviceSource.map((service, index) => (
setFocusIndex(index)}
className={cx(
"rounded-full border px-3.5 py-2 text-xs font-semibold transition",
active.id === service.id
? "border-sky-300 bg-sky-300 text-slate-950"
: "border-white/10 bg-white/[0.04] text-white/55 hover:text-white light:border-slate-200 light:bg-white light:text-slate-600"
)}
>
{service.title}
))}
{stats.map((stat) => (
{stat.value}
{stat.label}
))}
Live focus
{active.title}
Active
Momentum
{[44, 70, 52, 88, 64].map((height, index) => (
))}
Growth
4.8x
campaign lift
Strategy Design Motion Launch
);
}
function LiveProof() {
const [active, setActive] = useState(0);
useEffect(() => {
const timer = window.setInterval(() => {
setActive((index) => (index + 1) % proofFeed.length);
}, 2400);
return () => window.clearInterval(timer);
}, []);
return (
Live delivery rhythm
A page that moves without shouting.
{["Live proof", "Auto flow", "Lead-ready"].map((item) => (
{item}
))}
{proofFeed.map((item, index) => (
setActive(index)}
className={cx(
"grid grid-cols-[auto_1fr_auto] items-center gap-4 rounded-[24px] border p-4 text-left transition",
active === index ? "border-sky-300/60 bg-white text-slate-950" : "border-white/10 bg-white/[0.05] text-white/64 hover:bg-white/[0.08]"
)}
>
{item}
{active === index ? "Now" : "Queued"}
))}
);
}
function Services() {
const [active, setActive] = useState(serviceSource[0]?.id || "");
const activeService = serviceSource.find((service) => service.id === active) || serviceSource[0] || {};
const activePrice = servicePrice(activeService);
useEffect(() => {
const timer = window.setInterval(() => {
const currentIndex = serviceSource.findIndex((service) => service.id === active);
const next = serviceSource[(currentIndex + 1 + serviceSource.length) % serviceSource.length];
if (next) {
setActive(next.id);
}
}, 6200);
return () => window.clearInterval(timer);
}, [active]);
return (
Our Services
Three focused services, built to work together.
Choose one service or combine them into a launch package with one creative direction.
Selected preview
{activeService.title}
{shortText(activeService.description, activeService.tagline, 135)}
{splitList(activeService.deliverables).slice(0, 5).map((item) => (
{item}
))}
NXO
Starting at
{activePrice.price}
{activePrice.note}
Open details
);
}
function Work() {
const categories = useMemo(() => ["All", ...Array.from(new Set(works.map((work) => work.category).filter(Boolean)))], []);
const [filter, setFilter] = useState("All");
const [featuredId, setFeaturedId] = useState(works[0]?.id || "");
const sortedWorks = [...works].sort((a, b) => Number(Boolean(b.recent)) - Number(Boolean(a.recent)));
const visibleWorks = filter === "All" ? sortedWorks : sortedWorks.filter((work) => work.category === filter);
const featured = works.find((work) => work.id === featuredId) || visibleWorks[0] || works[0] || {};
return (
Selected Work
Premium visuals. Clear buying paths.
{categories.map((category) => (
setFilter(category)}
className={cx(
"rounded-full border px-4 py-2 text-sm font-semibold transition",
filter === category
? "border-white bg-white text-slate-950 light:border-slate-950 light:bg-slate-950 light:text-white"
: "border-white/10 bg-white/[0.05] text-white/70 hover:bg-white/10 light:border-slate-200 light:bg-white light:text-slate-700"
)}
>
{category}
))}
{visibleWorks.map((work, index) => (
setFeaturedId(work.id)}
onFocus={() => setFeaturedId(work.id)}
className={cx("group overflow-hidden rounded-[32px] border border-white/10 bg-white/[0.055] shadow-apple transition hover:-translate-y-2 light:border-slate-200 light:bg-white", index === 0 ? "md:col-span-2" : "")}
tabIndex="0"
>
{work.category}
{work.recent && Recent }
Outcome
{work.metric}
{(work.client || work.year) && {[work.client, work.year].filter(Boolean).join(" / ")} }
{work.title}
{shortText(work.description, "", 92)}
))}
{featured.title && (
Currently previewing
{featured.title}
{shortText(featured.description, "", 105)} {featured.metric}
)}
);
}
function Process() {
const [activeStep, setActiveStep] = useState(0);
return (
How We Work
A clear path from first brief to launch.
Four focused stages keep every website, video, and campaign moving without confusion.
{processSteps.map(([number, title, body, meta], index) => (
setActiveStep(index)}
className={cx(
"grid cursor-pointer gap-4 rounded-[24px] border p-5 shadow-apple transition light:border-slate-200 sm:grid-cols-[72px_1fr]",
activeStep === index ? "border-sky-300/50 bg-white text-slate-950" : "border-white/10 bg-white/[0.055] light:bg-white"
)}
>
{number}
{title}
{shortText(body, "", 88)}
{meta}
))}
);
}
function Testimonials() {
const rows = [...testimonials, ...testimonials];
return (
Client Reviews
Rated for launch quality, speed, and polish.
4.9 average rating
Verified project feedback
{rows.map((item, index) => {
const rating = ratingValue(item.rating);
const stars = Array.from({ length: 5 }, (_, starIndex) => starIndex + 1);
return (
{reviewerInitials(item.name)}
{item.name}
{item.role}
{rating.toFixed(1)}
{stars.map((star) => (
★
))}
Verified review
"{shortText(item.quote, "", 156)}"
{item.service || "Launch project"}
{item.location || "Bangladesh"}
{item.date || "Recent project"}
);
})}
);
}
function Pricing({ onDiscussProject }) {
return (
Pricing
Individual prices and bundle deals.
Start with one service or combine web, video, motion, and marketing into a launch package.
{serviceSource.map((service) => {
const price = servicePrice(service);
return (
{service.title}
{price.price}
{price.note}
See breakdown
);
})}
Bundle packages
{pricing.map((plan, index) => {
const left = plan.highlight ? 3 : 6;
const used = 10 - left;
return (
{plan.highlight && Most requested }
{plan.name}
{plan.price}
{shortText(plan.description, "", 100)}
{splitList(plan.features).map((feature) => (
+
{feature}
))}
{left}/10 slots left
{index === 0 ? "Flexible" : "Priority"}
onDiscussProject(plan)}
className={cx("mt-8 inline-flex h-12 w-full items-center justify-center rounded-full text-sm font-semibold transition hover:-translate-y-1", plan.highlight ? "bg-slate-950 text-white" : "bg-white text-slate-950 light:bg-slate-950 light:text-white")}
>
Discuss this project
);
})}
);
}
function FAQ() {
const [open, setOpen] = useState(0);
return (
Questions
Quick answers.
{faqs.map(([question, answer], index) => (
setOpen(open === index ? -1 : index)} className="flex w-full items-center justify-between gap-5 p-5 text-left">
{question}
{open === index ? "-" : "+"}
{open === index && {shortText(answer, "", 130)}
}
))}
);
}
function GmailLogo() {
return (
);
}
function PhoneLogo() {
return (
);
}
function WhatsAppLogo() {
return (
);
}
function Contact({ preset }) {
const [selectedService, setSelectedService] = useState("");
const [message, setMessage] = useState("");
const phoneHref = `tel:${String(settings.phone || "").replace(/[^\d+]/g, "")}`;
const whatsappHref = `https://wa.me/${String(settings.phone || "").replace(/[^\d]/g, "")}`;
const mailHref = `mailto:${settings.email || ""}`;
useEffect(() => {
if (!preset) {
return;
}
setSelectedService(preset.service || "");
setMessage(preset.message || "");
}, [preset]);
const presetServiceExists = serviceSource.some((service) => service.title === selectedService);
return (
);
}
function Footer() {
return (
{settings.brand || "NXO Studio"} Copyright {new Date().getFullYear()}
);
}
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error) {
if (window.NXO_RESTORE_FALLBACK) {
window.NXO_RESTORE_FALLBACK(error);
}
}
render() {
if (this.state.hasError) {
return null;
}
return this.props.children;
}
}
function App() {
const [theme, setTheme] = useTheme();
const [contactPreset, setContactPreset] = useState(null);
function handleDiscussProject(plan) {
setContactPreset({
service: plan?.name || "NXO project",
message: contactMessageForPlan(plan),
stamp: Date.now()
});
window.setTimeout(() => {
document.getElementById("contact")?.scrollIntoView({ behavior: "smooth", block: "start" });
}, 60);
}
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add("is-visible");
}
});
}, { threshold: 0.12 });
document.querySelectorAll(".reveal").forEach((node) => observer.observe(node));
return () => observer.disconnect();
}, []);
useEffect(() => {
if (!window.location.hash) {
return;
}
const target = document.querySelector(window.location.hash);
if (target) {
window.setTimeout(() => target.scrollIntoView({ block: "start" }), 80);
}
}, []);
return (
<>
{/* Future: add blog/resource cards or expanded testimonial case studies here. */}
>
);
}
const rootElement = document.getElementById("root");
try {
ReactDOM.createRoot(rootElement).render(
);
window.setTimeout(() => {
if (rootElement && !rootElement.textContent.trim() && window.NXO_RESTORE_FALLBACK) {
window.NXO_RESTORE_FALLBACK();
}
}, 1500);
} catch (error) {
if (window.NXO_RESTORE_FALLBACK) {
window.NXO_RESTORE_FALLBACK(error);
} else {
throw error;
}
}