+
+
+

+
+
+ {[
+ ['Home', '/'],
+ ['Cloud', '/cloud'],
+ ['Network', '/network'],
+ ['Agents', '/agents'],
+ ].map(([label, href], index) => (
+
{
+ if (timeoutRef.current) {
+ window.clearTimeout(timeoutRef.current)
+ }
+ setHoveredIndex(index)
+ }}
+ onMouseLeave={() => {
+ timeoutRef.current = window.setTimeout(() => {
+ setHoveredIndex(null)
+ }, 200)
+ }}
+ >
+
+ {hoveredIndex === index && (
+
+ )}
+
+
{label}
+
+ ))}
+
+
-
-
-
+
+ )
+}
+
+
+export function Header() {
+ const [isVisible, setIsVisible] = useState(true);
+ const [lastScrollY, setLastScrollY] = useState(0);
+
+
+ const controlHeader = () => {
+ if (typeof window !== 'undefined') {
+ if (window.scrollY > lastScrollY && window.scrollY > 100) { // Hides when scrolling down past 100px
+ setIsVisible(false);
+ } else { // Shows when scrolling up
+ setIsVisible(true);
+ }
+ setLastScrollY(window.scrollY);
+ }
+ };
+
+
+ useEffect(() => {
+ if (typeof window !== 'undefined') {
+ window.addEventListener('scroll', controlHeader);
+ return () => {
+ window.removeEventListener('scroll', controlHeader);
+ };
+ }
+ }, [lastScrollY]);
+
+
+ return (
+
+
+
+
+
)
}
diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx
index 3c4f5b7..334f71e 100644
--- a/src/components/Layout.tsx
+++ b/src/components/Layout.tsx
@@ -1,8 +1,16 @@
import { Outlet } from 'react-router-dom'
-import { Header } from './Header'
+import { FloatingNav } from './ui/floating-navbar'
import { Footer } from './Footer'
+import { Header } from './Header'
export function Layout() {
+ const navItems = [
+ { name: 'Home', link: '/' },
+ { name: 'Cloud', link: '/cloud' },
+ { name: 'Network', link: '/network' },
+ { name: 'Agents', link: '/agents' },
+ ];
+
return (
diff --git a/src/components/ScrollDownArrow.tsx b/src/components/ScrollDownArrow.tsx
new file mode 100644
index 0000000..7ea2ac2
--- /dev/null
+++ b/src/components/ScrollDownArrow.tsx
@@ -0,0 +1,22 @@
+'use client'
+
+import { ChevronDown } from 'lucide-react'
+
+export function ScrollDownArrow() {
+ const scrollToNextSection = () => {
+ const nextSection = document.querySelector('#next-section') // Assuming the next section has this id
+ if (nextSection) {
+ nextSection.scrollIntoView({ behavior: 'smooth' })
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/src/components/Texts.tsx b/src/components/Texts.tsx
index 63fa1b6..2b15ad6 100644
--- a/src/components/Texts.tsx
+++ b/src/components/Texts.tsx
@@ -3,6 +3,11 @@
import React from 'react'
import { cn } from '@/lib/utils'
+const fontVariants = {
+ sans: 'font-sans',
+ neuton: 'font-neuton',
+} as const
+
const colorVariants = {
primary: 'text-gray-900',
secondary: 'text-gray-600',
@@ -15,6 +20,7 @@ const colorVariants = {
} as const
type TextOwnProps = {
+ font?: keyof typeof fontVariants
color?: keyof typeof colorVariants
className?: string
}
@@ -34,6 +40,7 @@ const createTextComponent =
(
>
function Text({
+ font = 'sans',
as,
color = 'primary',
className,
@@ -43,7 +50,12 @@ const createTextComponent = (
const Tag = (as || defaultElement) as React.ElementType
return (
{children}
@@ -87,7 +99,7 @@ export const Subtle = createTextComponent(
)
export const H5 = createTextComponent(
'h5',
- 'text-xl lg:text-2xl font-semibold leading-snug tracking-tight'
+ 'text-xl lg:text-2xl font-light leading-snug tracking-normal'
)
export const Eyebrow = createTextComponent(
'h2',
diff --git a/src/components/ui/ScrollDown.tsx b/src/components/ui/ScrollDown.tsx
index 567bc28..4c587de 100644
--- a/src/components/ui/ScrollDown.tsx
+++ b/src/components/ui/ScrollDown.tsx
@@ -13,7 +13,7 @@ export function ScrollDown() {
return (