28 Commits

Author SHA1 Message Date
kudinDmitriyUp
d638367c9d Bob AI: fix build error in src/components/ui/FloatingNav.tsx 2026-04-20 14:12:44 +00:00
kudinDmitriyUp
834f1f4564 Bob AI: fix build error in src/components/ui/FloatingNav.tsx 2026-04-20 14:03:16 +00:00
kudinDmitriyUp
7d68c26fe4 Bob AI: fix build error in src/components/ui/FloatingNav.tsx 2026-04-20 14:01:56 +00:00
ff02c77644 Merge version_8_1776693468912 into main
Merge version_8_1776693468912 into main
2026-04-20 14:00:03 +00:00
kudinDmitriyUp
af69450744 Bob AI: change the border radius to be less round, add special butto 2026-04-20 14:00:00 +00:00
kudinDmitriyUp
ad252e8c7c Bob AI: fix build errors (attempt 1) 2026-04-20 13:58:40 +00:00
1c3d9bc4a2 Switch to version 6: remove src/components/ui/FloatingNav.tsx 2026-04-20 13:57:39 +00:00
e2c897ab99 Switch to version 6: modified src/styles/animations.css 2026-04-20 13:57:39 +00:00
09c6cf4a4c Switch to version 6: modified src/index.css 2026-04-20 13:57:38 +00:00
bd514e1cf1 Switch to version 6: modified src/components/ui/HeroTrustedBy.tsx 2026-04-20 13:57:38 +00:00
00186d7e05 Switch to version 6: modified src/App.tsx 2026-04-20 13:57:37 +00:00
0d4ec5dbdb Merge version_7_1776693037983 into main
Merge version_7_1776693037983 into main
2026-04-20 13:56:17 +00:00
kudinDmitriyUp
a9877bdfb3 Bob AI: Replace the existing navigation bar with a new fixed, floati 2026-04-20 13:56:14 +00:00
kudinDmitriyUp
50bf40d17c Bob AI: Add a 'Trusted by over 2000 agencies' section to the hero, s 2026-04-20 13:53:43 +00:00
kudinDmitriyUp
f441b5f6a0 Bob AI: Add special hover animations to all interactive buttons. 2026-04-20 13:52:20 +00:00
kudinDmitriyUp
ad070a142a Bob AI: Adjust the global border radius to be less round. 2026-04-20 13:51:08 +00:00
5ef2263be8 Merge version_6_1776692161038 into main
Merge version_6_1776692161038 into main
2026-04-20 13:39:06 +00:00
kudinDmitriyUp
d812539488 Bob AI: Modify the navigation bar to have a fixed, floating design. 2026-04-20 13:39:02 +00:00
kudinDmitriyUp
2c625df909 Bob AI: Add a 'Trusted by over 2000 agencies' tag to the hero sectio 2026-04-20 13:38:07 +00:00
kudinDmitriyUp
28d2012366 Bob AI: Implement special hover animations for all interactive butto 2026-04-20 13:37:17 +00:00
kudinDmitriyUp
92bf0762d2 Bob AI: Adjust the global border-radius values to make elements less 2026-04-20 13:36:33 +00:00
946d85c625 Merge version_5_1776691918006 into main
Merge version_5_1776691918006 into main
2026-04-20 13:33:46 +00:00
kudinDmitriyUp
05c1e70b07 Bob AI: change the border radius to be less round, add special butto 2026-04-20 13:33:39 +00:00
6fde3b761e Merge version_4_1776691565356 into main
Merge version_4_1776691565356 into main
2026-04-20 13:29:09 +00:00
kudinDmitriyUp
36c3fe9e14 Bob AI: Add a new text element within the hero section containing th 2026-04-20 13:29:05 +00:00
kudinDmitriyUp
d7bdcfe68e Bob AI: Implement CSS hover animations for buttons, adding visual fe 2026-04-20 13:27:43 +00:00
kudinDmitriyUp
45aded2396 Bob AI: Adjust the border-radius property to make elements less roun 2026-04-20 13:26:40 +00:00
84514fb032 Merge version_3_1776691229413 into main
Merge version_3_1776691229413 into main
2026-04-20 13:22:02 +00:00
6 changed files with 203 additions and 2 deletions

View File

@@ -9,6 +9,7 @@ import NavbarCentered from '@/components/ui/NavbarCentered';
import PricingLayeredCards from '@/components/sections/pricing/PricingLayeredCards';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
import HeroTrustedBy from '@/components/ui/HeroTrustedBy';
export default function App() {
return (
@@ -55,6 +56,9 @@ export default function App() {
}}
imageSrc="https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/a-sleek-modern-high-tech-marketing-offic-1776690837523-6e0bf547.png"
/>
<div className="flex justify-center relative z-10" style={{ marginTop: '-4rem' }}>
<HeroTrustedBy />
</div>
</div>
<div id="about" data-section="about">

View File

@@ -0,0 +1,87 @@
"use client";
import { useState, useEffect } from 'react';
import { useButtonClick } from '@/hooks/useButtonClick';
import { motion, AnimatePresence } from "framer-motion";
type NavItem = {
name: string;
href: string;
};
type CtaButton = {
text: string;
href: string;
};
type FloatingNavProps = {
logo: string;
navItems: NavItem[];
ctaButton: CtaButton;
};
const NavLink = ({ name, href }: { name: string; href: string }) => {
const handleClick = useButtonClick(href);
return (
<button
onClick={handleClick}
className="text-sm font-medium text-foreground/80 hover:text-foreground transition-colors"
>
{name}
</button>
);
};
export default function FloatingNav({ logo, navItems, ctaButton }: FloatingNavProps) {
const [visible, setVisible] = useState(true);
const [lastScrollY, setLastScrollY] = useState(0);
const controlNavbar = () => {
if (typeof window !== 'undefined') {
if (window.scrollY > lastScrollY && window.scrollY > 100) {
setVisible(false);
} else {
setVisible(true);
}
setLastScrollY(window.scrollY);
}
};
useEffect(() => {
window.addEventListener('scroll', controlNavbar);
return () => {
window.removeEventListener('scroll', controlNavbar);
};
}, [lastScrollY]);
const CtaButtonHandler = useButtonClick(ctaButton.href);
return (
<AnimatePresence>
{visible && (
<motion.nav
initial={{ y: -100, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
exit={{ y: -100, opacity: 0 }}
transition={{ duration: 0.3, ease: 'easeInOut' }}
className="fixed top-6 left-1/2 -translate-x-1/2 z-50"
>
<div className="flex items-center justify-between gap-8 px-4 py-2 border rounded-full border-accent bg-card/80 backdrop-blur-lg">
<span className="text-lg font-bold text-foreground">{logo}</span>
<div className="hidden md:flex items-center gap-6">
{navItems.map((item) => (
<NavLink key={item.name} name={item.name} href={item.href} />
))}
</div>
<button
onClick={CtaButtonHandler}
className="primary-button px-4 py-2 text-sm font-medium rounded-full text-primary-cta-text"
>
{ctaButton.text}
</button>
</div>
</motion.nav>
)}
</AnimatePresence>
);
}

View File

@@ -0,0 +1,20 @@
const HeroTrustedBy = () => {
const avatars = [
"https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/professional-headshot-of-a-japanese-male-1776690846328-d57aee35.png",
"https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/professional-headshot-of-a-female-busine-1776690854791-b9f5ea1f.png",
"https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/professional-headshot-of-a-young-japanes-1776690864881-b5f3321c.png",
];
return (
<div className="glassmorphic-tag">
<div className="avatar-stack">
{avatars.map((src, index) => (
<img key={index} src={src} alt={`avatar ${index + 1}`} className="avatar" />
))}
</div>
<span>Trusted by over 2000 agencies</span>
</div>
);
};
export default HeroTrustedBy;

View File

@@ -0,0 +1,25 @@
const TrustedBy = () => {
const avatars = [
"https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/professional-headshot-of-a-japanese-male-1776690846328-d57aee35.png",
"https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/professional-headshot-of-a-female-busine-1776690854791-b9f5ea1f.png",
"https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AM9hp4M6eDzEwMxDU5gYArbELf/professional-headshot-of-a-young-japanes-1776690864881-b5f3321c.png",
];
return (
<div className="glassmorphic-tag">
<div className="avatar-stack">
{avatars.map((src, index) => (
<img
key={index}
src={src}
alt={`Trusted by user ${index + 1}`}
className="avatar"
/>
))}
</div>
<span>Trusted by over 2000 agencies</span>
</div>
);
};
export default TrustedBy;

View File

@@ -141,6 +141,22 @@ body {
min-height: 100vh;
overscroll-behavior: none;
overscroll-behavior-y: none;
padding-top: 6rem;
}
#nav {
position: fixed;
top: 1rem;
left: 1rem;
right: 1rem;
z-index: 1000;
background-color: rgba(18, 18, 18, 0.75);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-radius: var(--radius);
border: 1px solid var(--accent);
margin: 0 auto;
max-width: 1200px;
}
h1,
@@ -183,9 +199,46 @@ h6 {
}
.primary-button:hover {
animation: button-lift-glow-primary 0.4s ease-out forwards;
animation: button-hover-effect 0.3s ease-out forwards;
box-shadow:
color-mix(in srgb, var(--color-background) 15%, transparent) 0px 4px 10px 0px inset,
color-mix(in srgb, var(--color-background) 15%, transparent) 0px -4px 8px 0px inset,
0 0 25px -3px var(--primary-cta),
0 0 10px var(--primary-cta);
}
.secondary-button:hover {
animation: button-lift-glow-secondary 0.4s ease-out forwards;
animation: button-hover-effect 0.3s ease-out forwards;
box-shadow:
0 1px 2px 0 rgb(0 0 0 / 0.05),
0 0 25px -3px var(--secondary-cta-text),
0 0 10px var(--secondary-cta-text);
}
.glassmorphic-tag {
display: inline-flex;
align-items: center;
gap: 0.75rem;
padding: 0.5rem 1rem 0.5rem 0.5rem;
background-color: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 9999px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
color: var(--foreground);
font-size: var(--text-sm);
}
.avatar-stack {
display: flex;
padding-left: 10px;
}
.avatar {
width: 2rem;
height: 2rem;
border-radius: 50%;
border: 2px solid var(--background);
object-fit: cover;
margin-left: -10px;
}

View File

@@ -188,3 +188,15 @@
0 0 8px var(--secondary-cta-text);
}
}
@keyframes button-hover-effect {
0% {
transform: translateY(0) scale(1);
}
50% {
transform: translateY(-8px) scale(1.1);
}
100% {
transform: translateY(-4px) scale(1.05);
}
}