18 Commits

Author SHA1 Message Date
0d08deac73 Update theme fonts 2026-03-02 10:03:26 +00:00
e35c367e1b Update theme fonts 2026-03-02 10:03:25 +00:00
c7c6e9187e Update src/app/page.tsx 2026-03-02 10:02:53 +00:00
46bd7779a7 Update theme colors 2026-03-02 10:01:59 +00:00
681ceff837 Update src/app/page.tsx 2026-03-02 09:57:26 +00:00
a0e1f0d033 Update src/app/layout.tsx 2026-03-02 09:57:25 +00:00
75ac5d01d8 Merge version_3 into main
Merge version_3 into main
2026-03-02 09:56:03 +00:00
c196d3c65c Update src/app/page.tsx 2026-03-02 09:55:59 +00:00
e55d8007b8 Merge version_3 into main
Merge version_3 into main
2026-03-02 09:55:19 +00:00
bab0f08a6e Update src/app/page.tsx 2026-03-02 09:55:15 +00:00
411088fae3 Update src/app/layout.tsx 2026-03-02 09:55:14 +00:00
d3ca6ec8f9 Merge version_2 into main
Merge version_2 into main
2026-03-02 09:47:37 +00:00
8afdb652c3 Update src/app/page.tsx 2026-03-02 09:47:33 +00:00
9d089d6447 Merge version_2 into main
Merge version_2 into main
2026-03-02 09:45:51 +00:00
1ffdd86b5c Update src/app/page.tsx 2026-03-02 09:45:47 +00:00
586be08f8b Merge version_1 into main
Merge version_1 into main
2026-03-02 09:41:22 +00:00
2e17d1828c Merge version_1 into main
Merge version_1 into main
2026-03-02 09:40:38 +00:00
063390c53f Merge version_1 into main
Merge version_1 into main
2026-03-02 09:38:27 +00:00
4 changed files with 79 additions and 121 deletions

View File

@@ -4,14 +4,9 @@ import { Inter } from "next/font/google";
import "./globals.css";
import { ServiceWrapper } from "@/components/ServiceWrapper";
import Tag from "@/tag/Tag";
import { Poppins } from "next/font/google";
const mulish = Mulish({
variable: "--font-mulish", subsets: ["latin"],
});
const inter = Inter({
variable: "--font-inter", subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Nexus Marketing | Strategic Digital Marketing Agency", description: "Award-winning marketing agency specializing in digital strategy, content creation, SEO, and brand design. Drive growth with data-driven campaigns.", keywords: "marketing agency, digital marketing, brand strategy, SEO, content marketing, marketing campaigns", openGraph: {
@@ -23,6 +18,12 @@ export const metadata: Metadata = {
}
};
const poppins = Poppins({
variable: "--font-poppins",
subsets: ["latin"],
weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"],
});
export default function RootLayout({
children,
}: Readonly<{
@@ -31,9 +32,7 @@ export default function RootLayout({
return (
<html lang="en" suppressHydrationWarning>
<ServiceWrapper>
<body
className={`${mulish.variable} ${inter.variable} antialiased`}
>
<body className={`${poppins.variable} antialiased`}>
<Tag />
{children}
@@ -278,9 +277,7 @@ export default function RootLayout({
const getElementInfo = (element, assignId = false) => {
const rect = element.getBoundingClientRect();
const tagName = element.tagName.toLowerCase();
const selector = getUniqueSelector(element, assignId);
const sectionId = getSectionId(element);
let className = undefined;
try {
if (element.className) {
@@ -308,8 +305,7 @@ export default function RootLayout({
};
if (tagName === 'img') {
const originalSrc = extractOriginalUrl(element.src);
info.imageData = {
info.imageData = {
src: originalSrc,
alt: element.alt || undefined,
naturalWidth: element.naturalWidth,
@@ -320,8 +316,7 @@ export default function RootLayout({
if (tagName === 'video') {
const rawSrc = element.src || element.currentSrc || (element.querySelector('source') && element.querySelector('source').src) || '';
const resolvedSrc = extractOriginalUrl(rawSrc);
info.imageData = {
info.imageData = {
src: resolvedSrc,
alt: element.getAttribute('aria-label') || undefined,
isBackground: false,
@@ -334,8 +329,7 @@ export default function RootLayout({
if (backgroundImage && backgroundImage !== 'none') {
const urlMatch = backgroundImage.match(/url(['"]?([^'")]+)['"]?)/);
if (urlMatch) {
const originalBgSrc = extractOriginalUrl(urlMatch[1]);
if (tagName !== 'img') {
if (tagName !== 'img') {
info.imageData = {
src: originalBgSrc,
isBackground: true
@@ -347,8 +341,7 @@ export default function RootLayout({
}
}
const elementType = getElementType(element);
info.elementType = elementType;
info.elementType = elementType;
if (elementType === 'Button') {
const buttonText = element.textContent?.trim() || element.value || element.getAttribute('aria-label') || '';
@@ -441,13 +434,11 @@ export default function RootLayout({
};
const isTextElement = (element) => {
const elementType = getElementType(element);
return elementType === 'Text';
return elementType === 'Text';
};
const isButtonElement = (element) => {
const elementType = getElementType(element);
return elementType === 'Button';
return elementType === 'Button';
};
const updateButtonText = (element, newText) => {
@@ -522,8 +513,7 @@ export default function RootLayout({
};
const handleInput = () => {
const elementInfo = getElementInfo(element);
let currentText = element.textContent;
let currentText = element.textContent;
// Ensure there's always at least a space to keep the element editable
if (currentText === '' || currentText === null || currentText.length === 0) {
@@ -636,8 +626,7 @@ export default function RootLayout({
}, '*');
if (save && originalContent !== element.textContent) {
const elementInfo = getElementInfo(element);
let finalText = element.textContent;
let finalText = element.textContent;
// Trim the final text and convert space-only to empty string for saving
if (finalText === ' ' || finalText.trim() === '') {
@@ -766,7 +755,7 @@ export default function RootLayout({
lastMouseX = e.clientX;
lastMouseY = e.clientY;
const target = getMostSpecificElement(e.clientX, e.clientY) || e.target;
|| e.target;
if (!isValidElement(target) || target === hoveredElement || target === selectedElement) {
return;
@@ -798,8 +787,7 @@ export default function RootLayout({
hoverOverlay = createHoverOverlay(target);
}
const elementType = getElementType(target);
showElementTypeLabel(target, elementType);
showElementTypeLabel(target, elementType);
window.parent.postMessage({
type: 'webild-element-hover',
@@ -841,7 +829,7 @@ export default function RootLayout({
e.preventDefault();
e.stopPropagation();
const target = getMostSpecificElement(e.clientX, e.clientY) || e.target;
|| e.target;
if (!isValidElement(target)) return;
if (selectedElement && selectedElement !== target) {
@@ -886,8 +874,7 @@ export default function RootLayout({
hoveredElement = null;
}
const elementInfo = getElementInfo(target, true);
selectedElement.dataset.webildSelector = elementInfo.selector;
selectedElement.dataset.webildSelector = elementInfo.selector;
showElementTypeLabel(target, elementInfo.elementType);
window.parent.postMessage({
@@ -970,8 +957,7 @@ export default function RootLayout({
isScrolling = false;
if (lastMouseX > 0 && lastMouseY > 0) {
const target = getMostSpecificElement(lastMouseX, lastMouseY);
if (target && isValidElement(target) && target !== selectedElement) {
if (target && isValidElement(target) && target !== selectedElement) {
hoveredElement = target;
const computedStyle = window.getComputedStyle(target);
@@ -985,8 +971,7 @@ export default function RootLayout({
hoveredElement.classList.add(hoverClass);
hoverOverlay = createHoverOverlay(target);
const elementType = getElementType(target);
showElementTypeLabel(target, elementType);
showElementTypeLabel(target, elementType);
window.parent.postMessage({
type: 'webild-element-hover',
@@ -1009,8 +994,7 @@ export default function RootLayout({
const saveChangeToStorage = (change) => {
try {
const storageKey = getStorageKey();
const existingChanges = JSON.parse(localStorage.getItem(storageKey) || '[]');
const existingChanges = JSON.parse(localStorage.getItem(storageKey) || '[]');
const filteredChanges = existingChanges.filter(c => {
return !(c.oldValue === change.oldValue && c.sectionId === change.sectionId);
@@ -1030,8 +1014,7 @@ export default function RootLayout({
const clearLocalChanges = () => {
try {
const storageKey = getStorageKey();
localStorage.removeItem(storageKey);
localStorage.removeItem(storageKey);
window.parent.postMessage({
type: 'webild-local-changes-cleared',
data: {}
@@ -1080,8 +1063,7 @@ export default function RootLayout({
if (e.data.type === 'webild-cancel-changes') {
try {
const storageKey = getStorageKey();
const savedChanges = localStorage.getItem(storageKey);
const savedChanges = localStorage.getItem(storageKey);
if (savedChanges) {
const changes = JSON.parse(savedChanges);
changes.forEach(change => {
@@ -1103,8 +1085,7 @@ export default function RootLayout({
if (isBackground) {
element.style.backgroundImage = change.oldValue ? 'url(' + change.oldValue + ')' : '';
} else {
const oldMediaType = getMediaTypeFromUrl(change.oldValue);
if (revertTag === 'video' && oldMediaType === 'image') {
if (revertTag === 'video' && oldMediaType === 'image') {
swapMediaElement(element, 'img', change.oldValue);
} else if (revertTag === 'img' && oldMediaType === 'video') {
swapMediaElement(element, 'video', change.oldValue);
@@ -1152,8 +1133,7 @@ export default function RootLayout({
const el = textElements[i];
if (isTextElement(el) && el.textContent.trim() === (oldValue || '').trim()) {
element = el;
const newSelector = getUniqueSelector(element, true);
if (newSelector) {
if (newSelector) {
element.dataset.webildSelector = newSelector;
}
break;
@@ -1244,10 +1224,8 @@ export default function RootLayout({
replaced = true;
} else if (element.tagName.toLowerCase() === 'img') {
oldValue = element.src;
const newMediaType = getMediaTypeFromUrl(newSrc);
if (newMediaType === 'video' && allowMediaTypeSwap) {
const swapped = swapMediaElement(element, 'video', newSrc);
if (selectedElement === element) selectedElement = swapped;
if (newMediaType === 'video' && allowMediaTypeSwap) {
if (selectedElement === element) selectedElement = swapped;
element = swapped;
} else {
element.src = newSrc;
@@ -1255,11 +1233,9 @@ export default function RootLayout({
replaced = true;
} else if (element.tagName.toLowerCase() === 'video') {
oldValue = element.src || element.currentSrc || '';
const newMediaType = getMediaTypeFromUrl(newSrc);
const sources = element.querySelectorAll('source');
const sources = element.querySelectorAll('source');
if (newMediaType === 'image' && allowMediaTypeSwap) {
const swapped = swapMediaElement(element, 'img', newSrc);
if (selectedElement === element) selectedElement = swapped;
if (selectedElement === element) selectedElement = swapped;
element = swapped;
} else {
if (sources.length > 0) {
@@ -1281,8 +1257,7 @@ export default function RootLayout({
}
if (replaced) {
const elementInfo = getElementInfo(element);
let cleanOldValue = oldValue;
if (oldValue.includes('url(')) {
const urlMatch = oldValue.match(/url(['"]?([^'")]+)['"]?)/);
@@ -1353,13 +1328,7 @@ export default function RootLayout({
}
}, true);
const urlCheckInterval = setInterval(() => {
if (lastPathname !== window.location.pathname) {
lastPathname = window.location.pathname;
notifyPageChange();
}
}, 500);
notifyPageChange();
window.webildCleanup = () => {

View File

@@ -1,8 +1,8 @@
"use client"
"use client";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarLayoutFloatingInline from '@/components/navbar/NavbarLayoutFloatingInline';
import HeroBillboardRotatedCarousel from '@/components/sections/hero/HeroBillboardRotatedCarousel';
import HeroSplitDualMedia from '@/components/sections/hero/HeroSplitDualMedia';
import TextSplitAbout from '@/components/sections/about/TextSplitAbout';
import FeatureCardTwentyFive from '@/components/sections/feature/FeatureCardTwentyFive';
import MetricCardThree from '@/components/sections/metrics/MetricCardThree';
@@ -41,10 +41,10 @@ export default function LandingPage() {
</div>
<div id="hero" data-section="hero">
<HeroBillboardRotatedCarousel
title="Elevate Your Brand Through Strategic Marketing"
description="We create targeted marketing campaigns that drive growth, increase brand awareness, and convert customers. Partner with our award-winning team to transform your vision into measurable results."
tag="Marketing Excellence"
<HeroSplitDualMedia
title="Transform Your Brand With Expert Marketing"
description="Strategic marketing campaigns designed to elevate your brand presence and drive measurable business growth."
tag="Marketing Solutions"
tagIcon={Sparkles}
tagAnimation="slide-up"
buttons={[
@@ -53,28 +53,17 @@ export default function LandingPage() {
]}
buttonAnimation="slide-up"
background={{ variant: "plain" }}
carouselItems={[
mediaItems={[
{
id: "1", imageSrc: "http://img.b2bpic.net/free-photo/laptop-computer-with-company-profit-progress-screen_482257-77678.jpg", imageAlt: "Marketing dashboard with analytics"
imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/uploaded-1772445436332-4x4u1wfq.png", imageAlt: "Marketing dashboard with analytics"
},
{
id: "2", imageSrc: "http://img.b2bpic.net/free-photo/professionals-present-financial-charts-meeting_482257-121150.jpg", imageAlt: "Business strategy planning session"
},
{
id: "3", imageSrc: "http://img.b2bpic.net/free-photo/young-coworkers-sharing-concepts-together_329181-19755.jpg", imageAlt: "Creative team brainstorming"
},
{
id: "4", imageSrc: "http://img.b2bpic.net/free-photo/media-marketing-internet-digital-global_53876-138500.jpg", imageAlt: "Social media marketing strategy"
},
{
id: "5", imageSrc: "http://img.b2bpic.net/free-vector/gradient-ui-ux-background_52683-68958.jpg", imageAlt: "Creative design and UI"
},
{
id: "6", imageSrc: "http://img.b2bpic.net/free-photo/growth-status-technology-online-website-concept_53876-21396.jpg", imageAlt: "Business growth metrics"
imageSrc: "https://images.unsplash.com/photo-1552664730-d307ca884978?w=800&h=600&fit=crop&_wi=2", imageAlt: "Business strategy planning session"
}
]}
autoPlay={true}
autoPlayInterval={4000}
mediaAnimation="slide-up"
rating={5}
ratingText="Trusted by industry leaders"
/>
</div>
@@ -82,7 +71,7 @@ export default function LandingPage() {
<TextSplitAbout
title="Why Choose Nexus Marketing"
description={[
"At Nexus Marketing, we combine data-driven insights with creative excellence to deliver campaigns that resonate with your audience and drive real business growth. Our team of strategists, designers, and copywriters work collaboratively to ensure every aspect of your marketing aligns with your brand vision and business goals.", "With over a decade of experience across industries, we've helped hundreds of brands achieve their marketing objectives through innovative strategies, compelling storytelling, and measurable results. We don't just create campaigns—we create connections."
"At Nexus Marketing, we combine data-driven insights with creative excellence to deliver campaigns that resonate with your audience and drive real business growth."
]}
buttons={[
{ text: "Explore Our Services", href: "#services" }
@@ -103,10 +92,10 @@ export default function LandingPage() {
title: "Digital Marketing Strategy", description: "Develop comprehensive digital strategies that align with your business goals and maximize ROI across all channels.", icon: Target,
mediaItems: [
{
imageSrc: "http://img.b2bpic.net/free-vector/digital-marketing-agency-corporate-social-media-banner-instagram-post-template_1435-1951.jpg?_wi=1", imageAlt: "Digital marketing strategy visualization"
imageSrc: "https://images.unsplash.com/photo-1460925895917-adf4e5a5bbf1?w=800&h=600&fit=crop&_wi=1", imageAlt: "Digital marketing strategy visualization"
},
{
imageSrc: "http://img.b2bpic.net/free-vector/search-engine-optimization_24908-55724.jpg?_wi=1", imageAlt: "Analytics dashboard"
imageSrc: "https://images.unsplash.com/photo-1460925895917-adf4e5a5bbf1?w=800&h=600&fit=crop&_wi=2", imageAlt: "Analytics dashboard"
}
]
},
@@ -114,10 +103,10 @@ export default function LandingPage() {
title: "Content Creation & Management", description: "Craft compelling content that engages your audience, establishes authority, and drives meaningful conversations around your brand.", icon: PenTool,
mediaItems: [
{
imageSrc: "http://img.b2bpic.net/free-photo/young-woman-with-glasses-cafe_273609-3980.jpg?_wi=1", imageAlt: "Content creation workspace"
imageSrc: "http://img.b2bpic.net/free-photo/focused-team-leader-presenting-marketing-plan-interested-multiracial-coworkers-serious-speaker-boss-executive-business-trainer-explaining-development-strategy-motivated-mixed-race-employees_482257-13781.jpg?id=17983464", imageAlt: "Content creation workspace"
},
{
imageSrc: "http://img.b2bpic.net/free-vector/digital-marketing-agency-corporate-social-media-banner-instagram-post-template_1435-1951.jpg?_wi=2", imageAlt: "Social media content grid"
imageSrc: "https://images.unsplash.com/photo-1552664730-d307ca884978?w=800&h=600&fit=crop&_wi=4", imageAlt: "Social media content grid"
}
]
},
@@ -125,10 +114,10 @@ export default function LandingPage() {
title: "SEO & Search Marketing", description: "Boost your online visibility with data-driven SEO strategies and targeted search campaigns that attract qualified leads.", icon: Search,
mediaItems: [
{
imageSrc: "http://img.b2bpic.net/free-vector/search-engine-optimization_24908-55724.jpg?_wi=2", imageAlt: "SEO analytics and metrics"
imageSrc: "https://images.unsplash.com/photo-1460925895917-adf4e5a5bbf1?w=800&h=600&fit=crop&_wi=3", imageAlt: "SEO analytics and metrics"
},
{
imageSrc: "http://img.b2bpic.net/free-vector/digital-marketing-agency-corporate-social-media-banner-instagram-post-template_1435-1951.jpg?_wi=3", imageAlt: "Search engine optimization"
imageSrc: "https://images.unsplash.com/photo-1460925895917-adf4e5a5bbf1?w=800&h=600&fit=crop&_wi=4", imageAlt: "Search engine optimization"
}
]
},
@@ -136,10 +125,10 @@ export default function LandingPage() {
title: "Brand Identity & Design", description: "Build a distinctive brand identity that resonates with your target audience and sets you apart from competitors.", icon: Palette,
mediaItems: [
{
imageSrc: "http://img.b2bpic.net/free-vector/modern-business-card-template-with-geometric-design_23-2147941082.jpg", imageAlt: "Brand design and identity"
imageSrc: "https://images.unsplash.com/photo-1561070791-2526d30994b5?w=800&h=600&fit=crop&_wi=1", imageAlt: "Brand design and identity"
},
{
imageSrc: "http://img.b2bpic.net/free-photo/young-woman-with-glasses-cafe_273609-3980.jpg?_wi=2", imageAlt: "Creative brand assets"
imageSrc: "https://images.unsplash.com/photo-1561070791-2526d30994b5?w=800&h=600&fit=crop&_wi=2", imageAlt: "Creative brand assets"
}
]
}
@@ -187,22 +176,22 @@ export default function LandingPage() {
author="Sarah Mitchell, CEO of TechFlow Solutions"
avatars={[
{
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-handsome-successful-man_1163-5475.jpg", alt: "Sarah Mitchell"
src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", alt: "Sarah Mitchell"
},
{
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-handsome-successful-man_1163-5475.jpg", alt: "Team member 2"
src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", alt: "Team member 2"
},
{
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-handsome-successful-man_1163-5475.jpg", alt: "Team member 3"
src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", alt: "Team member 3"
},
{
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-handsome-successful-man_1163-5475.jpg", alt: "Team member 4"
src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", alt: "Team member 4"
},
{
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-handsome-successful-man_1163-5475.jpg", alt: "Team member 5"
src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", alt: "Team member 5"
},
{
src: "http://img.b2bpic.net/free-photo/close-up-portrait-young-handsome-successful-man_1163-5475.jpg", alt: "Team member 6"
src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", alt: "Team member 6"
}
]}
ratingAnimation="slide-up"

View File

@@ -11,7 +11,7 @@ html {
body {
background-color: var(--background);
color: var(--foreground);
font-family: var(--font-inter), sans-serif;
font-family: var(--font-poppins), sans-serif;
position: relative;
min-height: 100vh;
overscroll-behavior: none;
@@ -24,5 +24,5 @@ h3,
h4,
h5,
h6 {
font-family: var(--font-mulish), sans-serif;
font-family: var(--font-poppins), sans-serif;
}

View File

@@ -2,23 +2,23 @@
/* Base units */
/* --vw is set by ThemeProvider */
/* --background: #f5f5f5;;
--card: #ffffff;;
--foreground: #1c1c1c;;
--primary-cta: #6139e6;;
--secondary-cta: #ffffff;;
--accent: #6139e6;;
--background-accent: #b3a8e8;; */
/* --background: #0a0a0a;;;
--card: #1a1a1a;;;
--foreground: #fffffae6;;;
--primary-cta: #fde047;;;
--secondary-cta: #1a1a1a;;;
--accent: #737373;;;
--background-accent: #737373;;; */
--background: #f5f5f5;;
--card: #ffffff;;
--foreground: #1c1c1c;;
--primary-cta: #6139e6;;
--primary-cta-text: #f5f5f5;;
--secondary-cta: #ffffff;;
--secondary-cta-text: #1c1c1c;;
--accent: #6139e6;;
--background-accent: #b3a8e8;;
--background: #0a0a0a;;;
--card: #1a1a1a;;;
--foreground: #fffffae6;;;
--primary-cta: #fde047;;;
--primary-cta-text: #0a0a0a;;;
--secondary-cta: #1a1a1a;;;
--secondary-cta-text: #fffffae6;;;
--accent: #737373;;;
--background-accent: #737373;;;
/* text sizing - set by ThemeProvider */
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);