Compare commits

4 Commits

Author SHA1 Message Date
Emre
68526abff3 improvements 2025-10-11 17:22:24 +03:00
Emre
5df98adbaf fixes 2025-10-11 13:38:27 +03:00
Emre
d3fd2db514 updates 2025-10-11 13:09:23 +03:00
Emre
9451d22494 style updates 2025-10-11 11:17:38 +03:00
39 changed files with 1052 additions and 348 deletions

View File

@@ -2,9 +2,9 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/png" href="/iconG.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>geomind2</title> <title>GeoMind</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@@ -1,5 +1,5 @@
{ {
"name": "geomind2", "name": "geomind",
"private": true, "private": true,
"version": "0.0.0", "version": "0.0.0",
"type": "module", "type": "module",

BIN
public/iconG.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/images/cloud_sky.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
public/images/node.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,18 +1,20 @@
import { useState } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import ContactForm from '../ui/ContactForm';
const footerLinksColumn1 = [ const footerLinksColumn1 = [
{ label: 'About', to: '/about' }, { label: 'About', to: '/about' },
{ label: 'Solutions', to: '/solutions' }, { label: 'Tech', to: '/technology' },
{ label: 'Use Cases', to: '/usecases' }, { label: 'Use Cases', to: '/usecases' },
]; ];
const footerLinksColumn2 = [ const footerLinksColumn2 = [
{ label: 'Manual', to: '/manual' }, { label: 'Manual', href: 'https://manual.grid.tf' },
{ label: 'Support', to: '/support' },
{ label: 'Privacy', to: '/privacy' }, { label: 'Privacy', to: '/privacy' },
]; ];
export const Footer = () => { export const Footer = () => {
const [isContactFormOpen, setIsContactFormOpen] = useState(false);
const year = new Date().getFullYear(); const year = new Date().getFullYear();
return ( return (
@@ -22,8 +24,11 @@ export const Footer = () => {
<span className="text-xs font-bold uppercase tracking-[0.35em] text-white"> <span className="text-xs font-bold uppercase tracking-[0.35em] text-white">
Geomind Geomind
</span> </span>
<p className="max-w-sm text-sm font-semibold text-white"> <p className="max-w-m text-xs font-medium uppercase tracking-[0.3em] text-white">
The datacenter standard for the next era of cloud and AI. </p> The datacenter standard for
<br />
the next era of cloud and AI.
</p>
</div> </div>
<nav className="grid grid-cols-2 gap-x-24 gap-y-4 text-xs font-medium uppercase tracking-[0.3em] text-white md:ml-auto self-start"> <nav className="grid grid-cols-2 gap-x-24 gap-y-4 text-xs font-medium uppercase tracking-[0.3em] text-white md:ml-auto self-start">
<div className="flex flex-col items-start gap-4"> <div className="flex flex-col items-start gap-4">
@@ -34,17 +39,43 @@ export const Footer = () => {
))} ))}
</div> </div>
<div className="flex flex-col items-start gap-4"> <div className="flex flex-col items-start gap-4">
{footerLinksColumn2.map(({ label, to }) => ( {footerLinksColumn2.map(({ label, to, href }) =>
<Link key={to} to={to} className="text-white transition-colors duration-300"> href ? (
<a
key={label}
href={href}
target="_blank"
rel="noreferrer"
className="text-white transition-colors duration-300"
>
{label}
</a>
) : (
<Link key={label} to={to} className="text-white transition-colors duration-300">
{label} {label}
</Link> </Link>
))} ),
)}
<button
onClick={() => setIsContactFormOpen(true)}
className="text-white transition-colors duration-300 hover:text-brand-400 uppercase"
>
Support
</button>
</div> </div>
</nav> </nav>
</div> </div>
<div className="mx-auto mt-12 flex w-full max-w-7xl items-center justify-between text-xs uppercase tracking-[0.3em] text-white"> <div className="mx-auto mt-12 flex w-full max-w-7xl items-center justify-between text-xs uppercase tracking-[0.3em] text-white">
<span>© {year} Geomind. All rights reserved.</span> <span>
© {year}. <span className="text-brand-400">Built on Geomind.</span> All rights reserved.
</span>
</div> </div>
<ContactForm
isOpen={isContactFormOpen}
onClose={() => setIsContactFormOpen(false)}
title="Get Support"
formType="contact"
/>
</footer> </footer>
); );
}; };

View File

@@ -2,15 +2,19 @@ import { useEffect, useState } from 'react';
import { Link, NavLink, useLocation } from 'react-router-dom'; import { Link, NavLink, useLocation } from 'react-router-dom';
import { motion, AnimatePresence } from 'framer-motion'; import { motion, AnimatePresence } from 'framer-motion';
import { cn } from '../../lib/cn'; import { cn } from '../../lib/cn';
import { buttonBaseClass } from '../../lib/buttonStyles';
import ContactForm from '../ui/ContactForm';
const navItems = [ const navItems = [
{ label: 'About', to: '/about' }, { label: 'About', to: '/about' },
{ label: 'Solutions', to: '/technology' }, { label: 'Tech', to: '/technology' },
{ label: 'Use Cases', to: '/usecases' }, { label: 'Use Cases', to: '/usecases' },
]; ];
export const Header = () => { export const Header = () => {
const [isMenuOpen, setIsMenuOpen] = useState(false); const [isMenuOpen, setIsMenuOpen] = useState(false);
const [hoveredNav, setHoveredNav] = useState<string | null>(null);
const [isContactFormOpen, setIsContactFormOpen] = useState(false);
const location = useLocation(); const location = useLocation();
const isHome = location.pathname === '/'; const isHome = location.pathname === '/';
@@ -29,40 +33,54 @@ export const Header = () => {
)} )}
> >
<div className="flex w-full items-center justify-between px-6 py-4 sm:px-10 lg:px-16"> <div className="flex w-full items-center justify-between px-6 py-4 sm:px-10 lg:px-16">
<div className="flex items-center gap-8"> <Link
<Link to="/" className="flex items-center"> to="/"
className="flex items-center"
onClick={() => {
if (location.pathname === '/') {
const mainElement = document.querySelector('main');
if (mainElement instanceof HTMLElement && typeof mainElement.scrollTo === 'function') {
mainElement.scrollTo({ top: 0, left: 0, behavior: 'smooth' });
} else {
window.scrollTo({ top: 0, behavior: 'smooth' });
}
}
}}
>
<img <img
src="/images/geomind_logo.png" src="/images/geomind_logo.png"
alt="Geomind logo" alt="Geomind logo"
className="h-8 w-auto object-contain" className="h-8 w-auto object-contain"
/> />
</Link> </Link>
<div className="flex items-center gap-4 sm:gap-6">
<nav className="hidden items-center gap-8 md:flex"> <nav className="hidden items-center gap-8 md:flex">
{navItems.map(({ label, to }) => ( {navItems.map(({ label, to }) => (
<NavLink <NavLink
key={to} key={to}
to={to} to={to}
className={({ isActive }) => onMouseEnter={() => setHoveredNav(to)}
cn( onMouseLeave={() => setHoveredNav(null)}
'text-sm font-medium uppercase tracking-wide text-white transition-colors duration-300 hover:text-white/80', onFocus={() => setHoveredNav(to)}
isActive && 'text-white', onBlur={() => setHoveredNav(null)}
) className={({ isActive }) => {
} const isHovered = hoveredNav === to;
return cn(
'text-sm font-semibold uppercase tracking-wide transition-colors duration-300 text-white hover:!text-brand-500 focus-visible:!text-brand-500',
(isActive || isHovered) && '!text-brand-500',
);
}}
> >
{label} {label}
</NavLink> </NavLink>
))} ))}
</nav> </nav>
</div> <button
<a onClick={() => setIsContactFormOpen(true)}
href="mailto:support@threefold.tech" className={cn(buttonBaseClass, 'hidden px-4 py-2 md:inline-flex')}
className={cn(
'rounded-full px-4 py-2 text-sm font-semibold transition-all duration-300 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-300 focus-visible:ring-offset-2',
'border border-brand-200 bg-white text-brand-700 shadow-subtle hover:border-brand-700 hover:bg-brand-700 hover:text-white focus-visible:ring-offset-white',
)}
> >
Contact GET IN TOUCH
</a> </button>
<button <button
type="button" type="button"
aria-label="Toggle navigation" aria-label="Toggle navigation"
@@ -73,27 +91,28 @@ export const Header = () => {
<span <span
className={cn( className={cn(
'absolute left-0 top-1 h-0.5 w-full transition-all duration-300', 'absolute left-0 top-1 h-0.5 w-full transition-all duration-300',
isHome ? 'bg-ink' : 'bg-white', 'bg-white',
isMenuOpen && 'translate-y-2 rotate-45', isMenuOpen && 'translate-y-2 rotate-45',
)} )}
/> />
<span <span
className={cn( className={cn(
'absolute left-0 top-3 h-0.5 w-full transition-all duration-300', 'absolute left-0 top-3 h-0.5 w-full transition-all duration-300',
isHome ? 'bg-ink' : 'bg-white', 'bg-white',
isMenuOpen && 'opacity-0', isMenuOpen && 'opacity-0',
)} )}
/> />
<span <span
className={cn( className={cn(
'absolute left-0 top-5 h-0.5 w-4 transition-all duration-300', 'absolute left-0 top-5 h-0.5 w-4 transition-all duration-300',
isHome ? 'bg-ink' : 'bg-white', 'bg-white',
isMenuOpen && 'left-0 top-3 w-full -rotate-45', isMenuOpen && 'left-0 top-3 w-full -rotate-45',
)} )}
/> />
</span> </span>
</button> </button>
</div> </div>
</div>
<AnimatePresence> <AnimatePresence>
{isMenuOpen && ( {isMenuOpen && (
<motion.nav <motion.nav
@@ -101,10 +120,7 @@ export const Header = () => {
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -16 }} exit={{ opacity: 0, y: -16 }}
transition={{ duration: 0.25, ease: 'easeOut' }} transition={{ duration: 0.25, ease: 'easeOut' }}
className={cn( className={cn('px-6 py-4 shadow-lg border-t border-white/10 bg-black md:hidden')}
'px-6 py-4 shadow-lg md:hidden',
isHome ? 'border-t border-slate-100 bg-mist/95' : 'border-t border-white/10 bg-black',
)}
> >
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
{navItems.map(({ label, to }) => ( {navItems.map(({ label, to }) => (
@@ -113,27 +129,33 @@ export const Header = () => {
to={to} to={to}
className={({ isActive }) => className={({ isActive }) =>
cn( cn(
'text-base font-medium uppercase tracking-wide text-white transition-colors duration-300', 'text-base font-semibold uppercase tracking-wide text-white transition-colors duration-300',
isActive && 'text-white', isActive && 'text-brand-500',
) )
} }
> >
{label} {label}
</NavLink> </NavLink>
))} ))}
<a <button
href="mailto:support@threefold.tech" onClick={() => {
className={cn( setIsContactFormOpen(true);
'rounded-full px-4 py-2 text-center text-sm font-semibold text-white shadow-subtle transition-colors duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-300 focus-visible:ring-offset-2', setIsMenuOpen(false);
'border border-brand-200 bg-brand-600 hover:bg-brand-700 focus-visible:ring-offset-white', }}
)} className={cn(buttonBaseClass, 'flex w-full justify-center px-4 py-2 text-center')}
> >
Contact GET IN TOUCH
</a> </button>
</div> </div>
</motion.nav> </motion.nav>
)} )}
</AnimatePresence> </AnimatePresence>
<ContactForm
isOpen={isContactFormOpen}
onClose={() => setIsContactFormOpen(false)}
title="Get in Touch"
formType="contact"
/>
</motion.header> </motion.header>
); );
}; };

View File

@@ -15,6 +15,8 @@ export const Layout = ({ children }: LayoutProps) => {
const darkRoutes = ['/about', '/technology', '/usecases']; const darkRoutes = ['/about', '/technology', '/usecases'];
const isDarkPage = darkRoutes.some((route) => pathname.startsWith(route)); const isDarkPage = darkRoutes.some((route) => pathname.startsWith(route));
const isAbout = pathname.startsWith('/about');
return ( return (
<div <div
className={cn( className={cn(
@@ -30,7 +32,10 @@ export const Layout = ({ children }: LayoutProps) => {
'relative z-10', 'relative z-10',
isHome isHome
? 'h-screen overflow-x-hidden overflow-y-scroll scroll-smooth snap-y snap-mandatory' ? 'h-screen overflow-x-hidden overflow-y-scroll scroll-smooth snap-y snap-mandatory'
: 'mx-auto max-w-6xl px-6 pb-24 pt-28 lg:px-8 lg:pt-32', : cn(
'pb-24 pt-28 lg:pt-32',
isAbout ? 'w-full px-0' : 'mx-auto max-w-6xl px-6 lg:px-8',
),
)} )}
> >
{children} {children}

View File

@@ -7,6 +7,15 @@ export const ScrollToTop = () => {
useEffect(() => { useEffect(() => {
const animationFrame = window.requestAnimationFrame(() => { const animationFrame = window.requestAnimationFrame(() => {
window.scrollTo({ top: 0, left: 0, behavior: 'auto' }); window.scrollTo({ top: 0, left: 0, behavior: 'auto' });
const mainElement = document.querySelector('main');
if (mainElement instanceof HTMLElement) {
if (typeof mainElement.scrollTo === 'function') {
mainElement.scrollTo({ top: 0, left: 0, behavior: 'auto' });
} else {
mainElement.scrollTop = 0;
mainElement.scrollLeft = 0;
}
}
}); });
return () => window.cancelAnimationFrame(animationFrame); return () => window.cancelAnimationFrame(animationFrame);

View File

@@ -0,0 +1,199 @@
import { motion, AnimatePresence } from 'framer-motion';
import { useState } from 'react';
import { X, Send, CheckCircle } from 'lucide-react';
interface ContactFormProps {
isOpen: boolean;
onClose: () => void;
title?: string;
formType?: 'investor' | 'partner' | 'contact' | 'deploy' | 'offtake';
}
export default function ContactForm({ isOpen, onClose, title = "Get in Touch", formType }: ContactFormProps) {
const [formData, setFormData] = useState({
name: '',
email: '',
company: '',
message: '',
});
const [isSubmitting, setIsSubmitting] = useState(false);
const [isSubmitted, setIsSubmitted] = useState(false);
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
const { name, value } = e.target;
setFormData(prev => ({
...prev,
[name]: value,
}));
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setIsSubmitting(true);
// TODO: Add emailjs integration later
// Simulate API call
setTimeout(() => {
console.log('Form submitted:', { ...formData, formType });
setIsSubmitted(true);
setTimeout(() => {
setIsSubmitted(false);
setFormData({ name: '', email: '', company: '', message: '' });
onClose();
}, 3000);
setIsSubmitting(false);
}, 1000);
};
const getPlaceholderMessage = () => {
switch (formType) {
case 'investor':
return "Tell us about your investment interests and how we can collaborate.";
case 'partner':
return "Tell us about your partnership interests and how we can work together.";
case 'deploy':
return "Tell us about your deployment capacity plans and requirements.";
case 'offtake':
return "Tell us about your capacity offtake requirements.";
default:
return "Let us know how we can help.";
}
};
return (
<AnimatePresence>
{isOpen && (
<motion.div
className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/70 backdrop-blur-sm"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
onClick={onClose}
>
<motion.div
className="bg-slate-950 rounded-2xl shadow-2xl w-full max-w-md relative overflow-hidden border border-white/10"
initial={{ scale: 0.9, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
exit={{ scale: 0.9, opacity: 0 }}
transition={{ type: "spring", damping: 25, stiffness: 300 }}
onClick={(e) => e.stopPropagation()}
>
{/* Header */}
<div className="flex items-center justify-between p-6 border-b border-white/10">
<h3 className="text-xl font-bold text-white">
{title}
</h3>
<button
onClick={onClose}
className="p-2 hover:bg-slate-800 rounded-lg transition-colors"
>
<X className="w-5 h-5 text-slate-400" />
</button>
</div>
{/* Form */}
<div className="p-6">
{isSubmitted ? (
<motion.div
className="text-center py-8"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
>
<CheckCircle className="w-16 h-16 text-brand-400 mx-auto mb-4" />
<h4 className="text-lg font-semibold text-white mb-2">
Thank you!
</h4>
<p className="text-slate-300">
We&apos;ll get back to you soon.
</p>
</motion.div>
) : (
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label htmlFor="name" className="block text-sm font-medium text-slate-300 mb-1">
Full Name *
</label>
<input
type="text"
id="name"
name="name"
value={formData.name}
onChange={handleInputChange}
required
className="w-full px-4 py-3 border border-white/10 rounded-lg focus:ring-2 focus:ring-brand-400 focus:border-transparent bg-slate-900 text-white placeholder-slate-500"
placeholder="Your full name"
/>
</div>
<div>
<label htmlFor="email" className="block text-sm font-medium text-slate-300 mb-1">
Email Address *
</label>
<input
type="email"
id="email"
name="email"
value={formData.email}
onChange={handleInputChange}
required
className="w-full px-4 py-3 border border-white/10 rounded-lg focus:ring-2 focus:ring-brand-400 focus:border-transparent bg-slate-900 text-white placeholder-slate-500"
placeholder="your.email@company.com"
/>
</div>
<div>
<label htmlFor="company" className="block text-sm font-medium text-slate-300 mb-1">
Company
</label>
<input
type="text"
id="company"
name="company"
value={formData.company}
onChange={handleInputChange}
className="w-full px-4 py-3 border border-white/10 rounded-lg focus:ring-2 focus:ring-brand-400 focus:border-transparent bg-slate-900 text-white placeholder-slate-500"
placeholder="Your company name"
/>
</div>
<div>
<label htmlFor="message" className="block text-sm font-medium text-slate-300 mb-1">
Message
</label>
<textarea
id="message"
name="message"
value={formData.message}
onChange={handleInputChange}
rows={4}
className="w-full px-4 py-3 border border-white/10 rounded-lg focus:ring-2 focus:ring-brand-400 focus:border-transparent bg-slate-900 text-white placeholder-slate-500 resize-none"
placeholder={getPlaceholderMessage()}
/>
</div>
<button
type="submit"
disabled={isSubmitting}
className="w-full inline-flex items-center justify-center gap-2 rounded-full border border-brand-200/60 bg-white px-6 py-3 text-sm font-semibold text-black shadow-[0_18px_40px_-26px_rgba(15,23,42,0.55)] transition-all duration-300 hover:-translate-y-0.5 hover:border-black hover:bg-brand-600 hover:text-white hover:shadow-[0_26px_52px_-32px_rgba(90,107,241,0.55)] disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:translate-y-0 disabled:hover:bg-white disabled:hover:text-black"
>
{isSubmitting ? (
<>
<div className="w-5 h-5 border-2 border-black/30 border-t-black rounded-full animate-spin" />
<span>Sending...</span>
</>
) : (
<>
<Send className="w-5 h-5" />
<span>Send Message</span>
</>
)}
</button>
</form>
)}
</div>
</motion.div>
</motion.div>
)}
</AnimatePresence>
);
}

View File

@@ -1,6 +1,7 @@
import { type ReactNode } from 'react'; import { type ReactNode } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { cn } from '../../lib/cn'; import { cn } from '../../lib/cn';
import { buttonBaseClass } from '../../lib/buttonStyles';
type PrimaryButtonProps = { type PrimaryButtonProps = {
to?: string; to?: string;
@@ -11,16 +12,10 @@ type PrimaryButtonProps = {
target?: string; target?: string;
}; };
const styles: Record< const styles: Record<NonNullable<PrimaryButtonProps['variant']>, string> = {
NonNullable<PrimaryButtonProps['variant']>, solid: buttonBaseClass,
string outline: buttonBaseClass,
> = { ghost: buttonBaseClass,
solid:
'bg-brand-600 text-white shadow-subtle hover:bg-brand-500 hover:text-white hover:shadow-lg',
outline:
'border border-brand-200 bg-white text-brand-700 hover:border-brand-400 hover:bg-white/95 hover:text-brand-700 hover:shadow-md',
ghost:
'bg-transparent text-brand-600 hover:bg-brand-50/80 hover:text-brand-700',
}; };
export const PrimaryButton = ({ export const PrimaryButton = ({
@@ -31,8 +26,7 @@ export const PrimaryButton = ({
className, className,
target, target,
}: PrimaryButtonProps) => { }: PrimaryButtonProps) => {
const baseClasses = const baseClasses = buttonBaseClass;
'inline-flex items-center justify-center rounded-full px-5 py-2 text-sm font-semibold transition-all duration-300 hover:-translate-y-0.5 active:translate-y-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-300 focus-visible:ring-offset-2';
if (to) { if (to) {
return ( return (

5
src/lib/buttonStyles.ts Normal file
View File

@@ -0,0 +1,5 @@
export const buttonBaseClass =
'inline-flex items-center justify-center rounded-full border border-brand-200/60 bg-white px-6 py-3 text-sm font-semibold text-black shadow-[0_18px_40px_-26px_rgba(15,23,42,0.55)] transition-all duration-300 hover:-translate-y-0.5 hover:border-black hover:bg-brand-600 hover:text-white hover:shadow-[0_26px_52px_-32px_rgba(90,107,241,0.55)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-300 focus-visible:ring-offset-2 focus-visible:ring-offset-black';
export const buttonGhostLightClass =
'inline-flex items-center justify-center rounded-full border border-white/30 bg-transparent px-6 py-3 text-sm font-semibold text-white transition-all duration-300 hover:-translate-y-0.5 hover:border-white hover:bg-white hover:text-black focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/40 focus-visible:ring-offset-2 focus-visible:ring-offset-transparent';

View File

@@ -1,6 +1,7 @@
import { AboutHero } from './components/AboutHero'; import { AboutHero } from './components/AboutHero';
import { MissionVision } from './components/MissionVision'; import { MissionVision } from './components/MissionVision';
import { TrackRecord } from './components/TrackRecord'; import { TrackRecord } from './components/TrackRecord';
import { AboutCta } from './components/AboutCta';
export const AboutPage = () => { export const AboutPage = () => {
return ( return (
@@ -8,6 +9,7 @@ export const AboutPage = () => {
<AboutHero /> <AboutHero />
<MissionVision /> <MissionVision />
<TrackRecord /> <TrackRecord />
<AboutCta />
</div> </div>
); );
}; };

View File

@@ -0,0 +1,68 @@
import { motion } from 'framer-motion';
import { Link } from 'react-router-dom';
import { cn } from '../../../lib/cn';
import { buttonBaseClass } from '../../../lib/buttonStyles';
export const AboutCta = () => {
return (
<section className="snap-start bg-black pt-10 sm:pt-16 lg:pt-20">
<div className="mx-auto flex w-full max-w-5xl flex-col items-center gap-8 px-6 pb-20 text-center sm:gap-10 sm:px-10 sm:pb-32 lg:pb-40">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut' }}
className="flex items-center justify-center gap-4"
>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<span className="text-xs font-semibold uppercase tracking-[0.4em] text-white">
Sovereign Agentic Cloud
</span>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</motion.div>
<motion.h3
initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.7, ease: 'easeOut', delay: 0.15 }}
className="text-4xl font-medium leading-tight text-white sm:text-5xl"
>
See What We&apos;re Building Next
</motion.h3>
<motion.p
initial={{ opacity: 0, y: 16 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.7, ease: 'easeOut', delay: 0.25 }}
className="max-w-2xl text-lg text-white/70"
>
We&apos;re enabling sovereign agentic cloud for everyone, unlocking infrastructure that is
locally owned, globally connected, and ready for the next wave of intelligent workloads.
</motion.p>
<motion.div
initial={{ opacity: 0, y: 12 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut', delay: 0.35 }}
className="w-full sm:w-auto"
>
<Link
to="/technology"
className={cn(
buttonBaseClass,
'w-full px-10 py-4 font-bold uppercase tracking-[0.35em] sm:w-auto',
)}
>
Explore Our Tech
</Link>
</motion.div>
</div>
</section>
);
};

View File

@@ -1,34 +1,116 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
const records = [
{
period: '19972002',
title: 'World Records for Web Hosting',
description: 'Kept UEFA, NASA, and World Cup traffic online with continent-scale uptime.',
layout: 'lg:col-span-3 lg:row-span-2',
showStream: true,
},
{
period: '2005',
title: 'The First Backup Data Duplication System in the World',
description: 'Cut enterprise backup footprints by up to 100× before dedupe was mainstream.',
layout: 'lg:col-span-3',
},
{
period: '2008',
title: 'One of the First Cloud Systems',
description: 'Shipped the first Virtual Private Data Center and proved elastic compute trust.',
layout: 'lg:col-span-3',
},
{
period: '2010',
title: 'The First Multi-Site Consistent Database',
description: 'Delivered failover that preserved every transaction across sovereign sites.',
layout: 'lg:col-span-3 lg:row-span-2',
showStream: true,
},
{
period: '2012',
title: 'The First Unbreakable and Distributed Storage System',
description: 'Built tamper-proof storage that used 10× less energy and never went dark.',
layout: 'lg:col-span-3',
},
{
period: '2017',
title: 'Probably the First Proof of Block Stake Blockchain',
description: 'Merged staking and settlement in one move, years before the market caught up.',
layout: 'lg:col-span-3',
},
] as const;
export const AboutHero = () => { export const AboutHero = () => {
return ( return (
<section className="relative overflow-hidden rounded-3xl text-white"> <section className="relative isolate bg-black px-6 pb-16 pt-0 sm:px-10 sm:pb-20 sm:pt-2 lg:px-16 lg:pb-24 lg:pt-4">
<div className="mx-auto w-full max-w-7xl">
<div className="grid gap-8 sm:gap-10 lg:grid-cols-[minmax(360px,420px)_minmax(0,1fr)] lg:items-stretch lg:gap-12 xl:grid-cols-[minmax(400px,500px)_minmax(0,1fr)]">
<div className="relative h-full">
<div className="group relative flex h-full flex-col overflow-hidden rounded-[32px] border border-white/10 bg-gradient-to-br from-[#06091d] via-[#0e1540] to-[#1c1448] text-white shadow-[0_35px_90px_-45px_rgba(15,23,42,0.95)] transition-all duration-500 hover:-translate-y-1.5 hover:border-brand-400/60 hover:shadow-[0_40px_120px_-45px_rgba(99,102,241,0.55)]">
<img <img
src="/images/hometech2.jpg" src="/images/hometech2.jpg"
alt="" alt=""
className="absolute inset-0 h-full w-full object-cover" className="absolute inset-0 h-full w-full object-cover opacity-40 mix-blend-screen transition-transform duration-700 group-hover:scale-105"
/> />
<div className="absolute inset-0 bg-gradient-to-br from-[#0f172a]/80 via-[#1e1b4b]/70 to-[#312e81]/80" /> <div className="absolute inset-0 bg-gradient-to-br from-white/10 via-white/5 to-transparent mix-blend-overlay transition-opacity duration-500 group-hover:opacity-90" />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(79,70,229,0.4),_transparent_60%)] opacity-90 transition-opacity duration-500 group-hover:opacity-100" />
<div className="absolute top-[-25%] right-[-5%] h-[420px] w-[420px] rounded-full bg-[#6366f1]/30 blur-3xl transition-transform duration-700 group-hover:scale-110" />
<motion.div <motion.div
initial={{ opacity: 0, y: 32 }} initial={{ opacity: 0, y: 32 }}
whileInView={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: 'easeOut' }} transition={{ duration: 0.6, ease: 'easeOut' }}
className="relative z-10 px-6 py-20 sm:px-10 lg:px-16 lg:py-24" className="relative z-10 flex flex-1 flex-col items-center px-6 py-20 text-center sm:px-12 lg:px-16 lg:py-24"
> >
<p className="text-xs font-semibold uppercase tracking-[0.35em] text-white"> <div className="flex w-full items-center justify-center gap-4 text-[0.7rem] font-medium uppercase tracking-[0.32em] text-white/70">
About GeoMind <span className="h-px w-12 bg-white/25 transition-colors duration-500 group-hover:bg-white/50 sm:w-14 lg:w-16" />
</p> <span className="text-white/80">About GeoMind</span>
<h1 className="mt-6 text-3xl font-semibold leading-tight sm:text-4xl lg:text-5xl"> <span className="h-px w-12 bg-white/25 transition-colors duration-500 group-hover:bg-white/50 sm:w-14 lg:w-16" />
</div>
<h1 className="mt-9 max-w-2xl text-4xl font-semibold tracking-tight text-white sm:text-[2.75rem] lg:text-[3.25rem] lg:leading-[1.05]">
We Know a Thing or Two About Datacenters We Know a Thing or Two About Datacenters
</h1> </h1>
<p className="mt-6 max-w-3xl text-base text-white/75 sm:text-lg"> <p className="mt-5 max-w-2xl text-base leading-relaxed text-white/75 sm:text-lg">
For decades, we've built the technologies that power the internet, from record-breaking Decades of building the internet&apos;s backbone, from record-breaking hosting to
web hosting to unbreakable cloud systems. Now, we're redefining what datacenters stand unbreakable cloud systems, now shape how we define the datacenter: secure, sovereign,
for: secure, sovereign, and profitable infrastructure designed for people, the planet, profitable infrastructure built for people and planet.
and the AI-powered future.
</p> </p>
</motion.div> </motion.div>
</div>
</div>
<div className="grid h-full grid-cols-1 gap-3 sm:grid-cols-2 lg:auto-rows-[minmax(120px,_1fr)] lg:grid-cols-6">
{records.map((record, index) => (
<motion.article
key={record.title}
initial={{ opacity: 0, y: 24 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: index * 0.05 }}
className={`group relative flex h-full flex-col overflow-hidden rounded-3xl border border-white/10 bg-white/[0.04] p-5 ${
record.showStream ? 'pb-16 sm:pb-5' : ''
} backdrop-blur transition-all duration-300 hover:-translate-y-1.5 hover:border-brand-400/60 hover:bg-white/[0.08] hover:shadow-[0_32px_80px_-50px_rgba(56,189,248,0.55)] ${record.layout}`}
>
<span className="block text-[0.68rem] font-semibold uppercase tracking-[0.42em] text-brand-200/80">
{record.period}
</span>
<h3 className="mt-2 text-lg font-semibold leading-snug text-white">{record.title}</h3>
<p className="mt-3 text-sm leading-6 text-slate-200">{record.description}</p>
{record.showStream && (
<div className="pointer-events-none absolute inset-x-5 bottom-6 sm:bottom-5 h-3 overflow-hidden rounded-full border border-white/10 bg-white/[0.06]">
<div className="absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(59,130,246,0.45),transparent_72%)] opacity-70" />
<div className="absolute inset-0 bg-[linear-gradient(90deg,rgba(56,189,248,0)_0%,rgba(99,102,241,0.75)_50%,rgba(56,189,248,0)_100%)] opacity-90 [background-size:200%_100%] animate-data-stream" />
<div
className="absolute inset-0 bg-[linear-gradient(90deg,rgba(255,255,255,0)_0%,rgba(255,255,255,0.55)_12%,rgba(255,255,255,0)_40%)] mix-blend-screen opacity-70 [background-size:220%_100%] animate-data-stream"
style={{ animationDelay: '1.4s' }}
/>
</div>
)}
<div className="absolute -right-12 -top-12 h-24 w-24 rounded-full bg-brand-500/10 blur-3xl transition-transform duration-500 group-hover:scale-110" />
</motion.article>
))}
</div>
</div>
</div>
</section> </section>
); );
}; };

View File

@@ -2,42 +2,69 @@ export const MissionVision = () => {
return ( return (
<section className="relative py-20 text-slate-100 lg:py-28"> <section className="relative py-20 text-slate-100 lg:py-28">
<div className="relative mx-auto max-w-6xl px-6 lg:px-12"> <div className="relative mx-auto max-w-6xl px-6 lg:px-12">
<div className="mx-auto max-w-3xl space-y-8"> <div className="flex items-center justify-center gap-4">
<div className="flex items-center gap-4">
<div className="h-px flex-1 bg-gradient-to-r from-brand-500/40 via-brand-300/40 to-transparent" />
<span className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
Technology with Purpose
</span>
</div>
<div className="relative">
<span <span
aria-hidden="true" aria-hidden="true"
className="float-left mr-3 -mt-3 text-6xl font-serif leading-none text-brand-400/40" className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
> />
<span className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
Mission &amp; Vision
</span> </span>
<div className="space-y-6 text-base leading-8 text-slate-300 sm:text-lg sm:leading-8"> <span
<p className="italic text-brand-200"> aria-hidden="true"
When we first started, our goal was simple, to build the foundation for the worlds digital future. className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
Over time, we realized that technology isnt just about performance or scale, its about purpose. />
Its about people, communities, and the planet we share. </div>
<div className="mt-8 grid gap-12 lg:grid-cols-[1.1fr,0.9fr] lg:items-center">
<div className="space-y-6">
<h2 className="text-3xl font-semibold text-white sm:text-4xl">
Prioritizing people and planet for a sovereign cloud future
</h2>
<p className="text-base text-slate-300 sm:text-lg">
GeoMind builds inclusive digital infrastructure because <strong>access to compute should be a
fundamental human right</strong>. We engineer systems that keep communities in control of their
data, reward local participation, and run with a lighter footprint on the planet.
</p> </p>
<p> <div className="space-y-4 rounded-3xl border border-white/10 bg-black/60 p-6 transition-all duration-300 hover:-translate-y-1 hover:border-brand-300/40 hover:bg-white/5 hover:shadow-[0_30px_60px_-45px_rgba(56,189,248,0.55)]">
Today, were creating the next generation of datacenters, designed not only for the AI era but for a <p className="text-sm font-semibold uppercase tracking-[0.28em] text-brand-200">
sustainable, inclusive future. Our mission is clear: to make digital decentralized infrastructure a What drives us
universal right, accessible and responsible in equal measure.
</p> </p>
<p> <ul className="space-y-3 text-sm text-slate-300 sm:text-base">
Weve spent decades pioneering technologies that power the internet. Now, were redefining what <li>
datacenters stand for, combining efficiency, sovereignty, and sustainability to serve both humanity and <span className="font-semibold text-white">People first:</span> compute that is
innovation. open, fair, and economically empowering for every operator and offtaker.
</li>
<li>
<span className="font-semibold text-white">Planet aligned:</span> efficient,
sovereign infrastructure that respects resources and communities.
</li>
<li>
<span className="font-semibold text-white">Authentic by design:</span> transparent
governance and incentives that keep trust at the center of every deployment.
</li>
</ul>
</div>
<p className="text-sm text-slate-400">
This is the lens through which we design every product decision, from hardware
tiers to marketplace economics.
</p> </p>
</div> </div>
<figure className="group relative overflow-hidden rounded-3xl border border-white/10 transition-all duration-500 hover:-translate-y-1.5 hover:border-brand-300/40 hover:shadow-[0_32px_70px_-45px_rgba(79,70,229,0.65)]">
<img
src="/images/cloud_sky.png"
alt="Sunrise light shining through layered clouds above a resilient skyline."
className="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
/>
<div className="absolute inset-0 bg-gradient-to-br from-black/70 via-black/40 to-brand-500/30" />
<div className="absolute inset-0 flex flex-col items-center justify-end gap-2 p-8 text-center">
<p className="text-xs font-semibold uppercase tracking-[0.28em] text-brand-200">
People Planet Authenticity
</p>
<p className="text-xs font-semibold uppercase tracking-[0.28em] text-brand-200">
Open-source Simplicity
</p>
</div> </div>
<div className="border-t border-white/10 pt-6 text-sm"> </figure>
<p className="font-semibold text-white">Kristof De Spiegeleer</p>
<p className="text-slate-400">Founder &amp; CEO, GeoMind</p>
</div>
</div> </div>
</div> </div>
</section> </section>

View File

@@ -1,68 +1,104 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
const records = [ const exits = [
{ {
title: 'World Records for Web Hosting (1997-2002)', year: '2005',
description: company: 'DataCenter Technologies',
'Our team started the Internet hosting and data center business in Europe. We hosted some of the largest websites in the world including UEFA, NASA, World Cup.', description: 'Disk-based backup optimization software.',
acquiredBy: 'Veritas → Symantec',
logo: '/images/exited_company_logos/DataCenter.png',
}, },
{ {
title: 'The FIRST Backup Data Duplication system in the world (2005)', year: '2005',
description: company: 'Dedigate',
'Our advancements in this field brought up to 100x benefit compared to the status quo running in data centers at the time.', description: 'Managed hosting for complex internet infrastructures.',
acquiredBy: 'Verizon & Terremark → Equinix',
logo: '/images/exited_company_logos/Dedigate.png',
}, },
{ {
title: 'One of the FIRST Cloud Systems (2008)', year: '2008',
description: company: 'HostBasket',
'We were one of the pioneers of cloud computing in general. Terms like Virtual Private Data Center were invented by us.', description: 'Belgiums largest hosting company.',
acquiredBy: 'Telenet',
logo: '/images/exited_company_logos/HOSTBASKET.png',
}, },
{ {
title: 'The FIRST multi-site consistent database (2010)', year: '2009',
description: company: 'Q-layer',
'We invented a method to store data in a database over multiple sites in such a way data could never be lost, corrupted, or order of updates changed.', description: 'Automated cloud deployment and virtualization.',
acquiredBy: 'Sun Microsystems → Oracle',
logo: '/images/exited_company_logos/Q-layer.png',
}, },
{ {
title: 'The FIRST unbreakable and distributed storage system (2012)', year: '2015',
description: company: 'Amplidata',
'Not only incorruptible, our system also boasts 10x energy efficiency compared to alternative solutions, marking a significant technological leap.', description: 'Object storage for public and private clouds.',
}, acquiredBy: 'HGST (Western Digital)',
{ logo: '/images/exited_company_logos/amplidata.png',
title: 'Probably the FIRST proof of block stake blockchain (2017)',
description:
'This blockchain was sustainable and scalable and allowed people to transact their stake as well as their digital currency in the same transaction, which still to date is novel.',
}, },
]; ];
export const TrackRecord = () => { export const TrackRecord = () => {
return ( return (
<section className="py-16 text-slate-100 lg:py-24"> <section className="px-6 pt-16 pb-12 text-slate-100 sm:px-10 lg:px-16 lg:pt-24 lg:pb-16">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-4xl text-center">
<div className="flex items-center justify-center gap-4">
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<h2 className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300"> <h2 className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
Our Track Record Proven Track Record
</h2> </h2>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</div>
<p className="mt-4 text-3xl font-semibold text-white sm:text-4xl"> <p className="mt-4 text-3xl font-semibold text-white sm:text-4xl">
Our team has been at the forefront of datacenter and cloud innovation for decades, Our team has built some of the worlds most advanced cloud technologies which were acquired by some of the biggest names in the space.
building systems that were faster, safer, and more scalable than anything before.
</p> </p>
</div> </div>
<div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
{records.map((record, index) => ( <div className="mt-12 rounded-3xl border border-white/10 bg-black/60 p-8 shadow-[0_26px_64px_-48px_rgba(0,0,0,0.6)] transition-all duration-300 hover:border-brand-300/40 hover:shadow-[0_36px_90px_-50px_rgba(56,189,248,0.35)]">
<div className="grid gap-6 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5">
{exits.map((exit, index) => (
<motion.div <motion.div
key={record.title} key={exit.company}
initial={{ opacity: 0, y: 24 }} initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.25 }} viewport={{ once: true, amount: 0.2 }}
transition={{ duration: 0.5, delay: index * 0.05 }} transition={{ duration: 0.5, delay: index * 0.05 }}
className="flex h-full flex-col rounded-3xl border border-white/10 bg-black p-8 shadow-none backdrop-blur" className="group relative flex flex-col items-center rounded-2xl bg-black/40 p-6 text-center transition-all duration-300 hover:-translate-y-1.5 hover:bg-white/5 hover:shadow-[0_22px_50px_-38px_rgba(56,189,248,0.45)]"
> >
<div className="inline-flex h-10 w-10 items-center justify-center rounded-full bg-brand-500/15 font-semibold text-brand-200"> <span className="text-xs font-semibold uppercase tracking-[0.24em] text-brand-300">
{index + 1} {exit.year}
</span>
{exit.logo && (
<div className="mt-4">
<div className="mx-auto h-16 w-16 rounded-full bg-gradient-to-br from-brand-500/50 via-brand-400/30 to-transparent p-[2px] transition-transform duration-300 group-hover:scale-105">
<div className="flex h-full w-full items-center justify-center overflow-hidden rounded-full bg-white">
<img
src={exit.logo}
alt={`${exit.company} logo`}
className="h-14 w-14 object-contain"
/>
</div>
</div>
</div>
)}
<h4 className="mt-4 text-lg font-semibold text-white">{exit.company}</h4>
<p className="mt-2 text-sm text-slate-300">{exit.description}</p>
<div className="mt-4 flex flex-1 flex-col justify-end">
<p className="text-xs font-medium uppercase tracking-[0.2em] text-slate-400">
Acquired by
</p>
<p className="mt-1 text-sm text-white/80">{exit.acquiredBy}</p>
</div> </div>
<h3 className="mt-6 text-lg font-semibold text-white">{record.title}</h3>
<p className="mt-3 text-sm leading-6 text-slate-300">{record.description}</p>
</motion.div> </motion.div>
))} ))}
</div> </div>
</div>
</section> </section>
); );
}; };

View File

@@ -1,3 +1,4 @@
import { useEffect } from 'react';
import { HeroSection } from './components/HeroSection'; import { HeroSection } from './components/HeroSection';
import { ScrollLockedSection } from './components/ScrollLockedSection'; import { ScrollLockedSection } from './components/ScrollLockedSection';
import { CtaSection } from './components/CtaSection'; import { CtaSection } from './components/CtaSection';
@@ -50,7 +51,7 @@ const sections = [
eyebrow: 'Glocal Marketplace', eyebrow: 'Glocal Marketplace',
title: ( title: (
<> <>
Local Hardware, <span className={highlightTextClass}>Global</span> Liquidity Local Hardware, <span className={highlightTextClass}>Global</span> Marketplace
</> </>
), ),
description: ( description: (
@@ -66,7 +67,7 @@ const sections = [
eyebrow: 'Profit', eyebrow: 'Profit',
title: ( title: (
<> <>
<span className={highlightTextClass}>Earn</span> While You Operate <span className={highlightTextClass}>Earn</span> from Idle Capacity
</> </>
), ),
description: description:
@@ -78,11 +79,11 @@ const sections = [
eyebrow: 'Competitive Advantage', eyebrow: 'Competitive Advantage',
title: ( title: (
<> <>
<span className={highlightTextClass}>Lower Costs</span>, Higher Margins <span className={highlightTextClass}>Lower Costs</span>, Competitive Prices
</> </>
), ),
description: description:
'Minimal datacenter build costs. Energy-efficient autonomous operation. No enterprise maintenance overhead. Your competitive advantage is built in.', 'Minimal datacenter build costs. Energy-efficient autonomous operation. No enterprise maintenance overhead. Lower OPEX and CAPEX. Your competitive advantage is built in.',
showButton: false, showButton: false,
}, },
{ {
@@ -90,7 +91,7 @@ const sections = [
eyebrow: 'Offtakers', eyebrow: 'Offtakers',
title: ( title: (
<> <>
<span className={highlightTextClass}>Built-In</span> Customer Base <span className={highlightTextClass}>Built-In</span> Demand
</> </>
), ),
description: description:
@@ -101,6 +102,10 @@ const sections = [
]; ];
export const HomePage = () => { export const HomePage = () => {
useEffect(() => {
window.scrollTo({ top: 0, behavior: 'auto' });
}, []);
return ( return (
<div className="flex min-h-screen flex-col bg-black text-white"> <div className="flex min-h-screen flex-col bg-black text-white">
<div className="flex flex-col"> <div className="flex flex-col">

View File

@@ -1,19 +1,31 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { cn } from '../../../lib/cn';
import { buttonBaseClass } from '../../../lib/buttonStyles';
export const CtaSection = () => { export const CtaSection = () => {
return ( return (
<section className="snap-start bg-black"> <section className="snap-start bg-black">
<div className="mx-auto flex w-full max-w-5xl flex-col items-center gap-10 px-6 py-40 text-center sm:px-10"> <div className="mx-auto flex w-full max-w-5xl flex-col items-center gap-8 px-6 py-20 text-center sm:gap-10 sm:px-10 sm:py-32 lg:py-40">
<motion.span <motion.div
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }} viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut' }} transition={{ duration: 0.6, ease: 'easeOut' }}
className="text-xs font-semibold uppercase tracking-[0.4em] text-white" className="flex items-center justify-center gap-4"
> >
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<span className="text-xs font-semibold uppercase tracking-[0.4em] text-white">
Ready when you are Ready when you are
</motion.span> </span>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</motion.div>
<motion.h3 <motion.h3
initial={{ opacity: 0, y: 24 }} initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
@@ -32,32 +44,43 @@ export const CtaSection = () => {
> >
From record-breaking digital infrastructure to successful exits. The team behind GeoMind has built infrastructure at scale. From record-breaking digital infrastructure to successful exits. The team behind GeoMind has built infrastructure at scale.
</motion.p> </motion.p>
<div className="flex items-center justify-center gap-4"> <div className="flex w-full flex-col items-stretch gap-4 sm:w-auto sm:flex-row sm:items-center sm:justify-center">
<motion.div <motion.div
initial={{ opacity: 0, y: 12 }} initial={{ opacity: 0, y: 12 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }} viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut', delay: 0.35 }} transition={{ duration: 0.6, ease: 'easeOut', delay: 0.35 }}
className="w-full sm:w-auto"
> >
<Link <Link
to="/about" to="/about"
className="rounded-full border border-white/20 bg-white/80 px-10 py-4 text-sm font-bold uppercase tracking-[0.35em] text-black transition-transform duration-300 hover:-translate-y-0.5 hover:bg-white hover:shadow-[0_16px_36px_-24px_rgba(0,0,0,0.65)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/40 focus-visible:ring-offset-2 focus-visible:ring-offset-black" className={cn(
buttonBaseClass,
'w-full px-10 py-4 font-bold uppercase tracking-[0.35em] sm:min-w-[12rem]',
)}
> >
About us About us
</Link> </Link>
</motion.div> </motion.div>
<motion.a <motion.div
href="https://calendly.com/sachao/30min"
target="_blank"
rel="noopener noreferrer"
initial={{ opacity: 0, y: 12 }} initial={{ opacity: 0, y: 12 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }} viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut', delay: 0.35 }} transition={{ duration: 0.6, ease: 'easeOut', delay: 0.35 }}
className="rounded-full border border-white/20 bg-transparent px-10 py-4 text-sm font-bold uppercase tracking-[0.35em] text-white transition-transform duration-300 hover:-translate-y-0.5 hover:bg-white/10 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/40 focus-visible:ring-offset-2 focus-visible:ring-offset-black" className="w-full sm:w-auto"
>
<a
href="https://calendly.com/sachao/30min"
target="_blank"
rel="noopener noreferrer"
className={cn(
buttonBaseClass,
'w-full px-10 py-4 font-bold uppercase tracking-[0.35em] sm:min-w-[12rem]',
)}
> >
Book a Meeting Book a Meeting
</motion.a> </a>
</motion.div>
</div> </div>
</div> </div>
</section> </section>

View File

@@ -35,7 +35,7 @@ export const HeroSection = () => {
<span>Scroll to explore</span> <span>Scroll to explore</span>
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<span className="h-px w-16 bg-white/60" /> <span className="h-px w-16 bg-white/60" />
<span>Landing overview</span> <span>The Living Cloud</span>
</div> </div>
</motion.div> </motion.div>
</div> </div>

View File

@@ -1,5 +1,9 @@
import { ReactNode, useRef } from 'react'; import type { ReactNode } from 'react';
import { useRef } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { ChevronsDown } from 'lucide-react';
import { cn } from '../../../lib/cn';
import { buttonBaseClass } from '../../../lib/buttonStyles';
type ScrollLockedSectionProps = { type ScrollLockedSectionProps = {
id: string; id: string;
@@ -42,7 +46,11 @@ export const ScrollLockedSection = ({
{/* Animation Section - Takes ~80% of vertical space */} {/* Animation Section - Takes ~80% of vertical space */}
<div className="flex flex-col items-center gap-6 py-10 sm:gap-8 sm:py-12 lg:gap-10"> <div className="flex flex-col items-center gap-6 py-10 sm:gap-8 sm:py-12 lg:gap-10">
<div className="mx-auto w-full border border-white/10 bg-black shadow-[0_26px_64px_-48px_rgba(0,0,0,0.6)] aspect-[28/8]" /> <div className="mx-auto flex aspect-[28/8] w-full items-center justify-center border border-white/30 bg-black/75 text-center shadow-[0_26px_64px_-48px_rgba(0,0,0,0.6)]">
<p className="px-8 text-xs font-semibold uppercase tracking-[0.35em] text-white/70 sm:text-sm">
Scroll triggered animation · Work in progress...
</p>
</div>
{/* Button below animation card */} {/* Button below animation card */}
{showButton && buttonLink && ( {showButton && buttonLink && (
<div className="flex justify-center"> <div className="flex justify-center">
@@ -51,7 +59,7 @@ export const ScrollLockedSection = ({
href={buttonLink} href={buttonLink}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="rounded-full bg-white px-5 py-2 text-sm font-bold text-black shadow-subtle transition-all duration-300 hover:-translate-y-0.5 hover:bg-brand-700 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-300 focus-visible:ring-offset-2 focus-visible:ring-offset-black" className={cn(buttonBaseClass, 'px-5 py-2 font-bold')}
> >
{buttonText} {buttonText}
</a> </a>
@@ -59,7 +67,7 @@ export const ScrollLockedSection = ({
<button <button
type="button" type="button"
onClick={() => navigate(buttonLink)} onClick={() => navigate(buttonLink)}
className="rounded-full bg-white px-5 py-2 text-sm font-bold text-black shadow-subtle transition-all duration-300 hover:-translate-y-0.5 hover:bg-brand-700 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-300 focus-visible:ring-offset-2 focus-visible:ring-offset-black" className={cn(buttonBaseClass, 'px-5 py-2 font-bold')}
> >
{buttonText} {buttonText}
</button> </button>
@@ -67,6 +75,10 @@ export const ScrollLockedSection = ({
</div> </div>
)} )}
</div> </div>
<div className="mt-auto flex items-center gap-3 pb-12 text-xs uppercase tracking-[0.3em] text-white sm:pb-16">
<span>Keep scrolling</span>
<ChevronsDown className="h-4 w-4 text-white animate-bounce" aria-hidden="true" />
</div>
</div> </div>
</div> </div>
</section> </section>

View File

@@ -2,6 +2,7 @@ import { TechnologyHero } from './components/TechnologyHero';
import { TechnologyArchitecture } from './components/TechnologyArchitecture'; import { TechnologyArchitecture } from './components/TechnologyArchitecture';
import { TechnologyStack } from './components/TechnologyStack'; import { TechnologyStack } from './components/TechnologyStack';
import { TechnologicalBenefits } from './components/TechnologicalBenefits'; import { TechnologicalBenefits } from './components/TechnologicalBenefits';
import { MarketplaceCta } from './components/MarketplaceCta';
export const TechnologyPage = () => { export const TechnologyPage = () => {
return ( return (
@@ -10,6 +11,7 @@ export const TechnologyPage = () => {
<TechnologyStack /> <TechnologyStack />
<TechnologyArchitecture /> <TechnologyArchitecture />
<TechnologicalBenefits /> <TechnologicalBenefits />
<MarketplaceCta />
</div> </div>
); );
}; };

View File

@@ -0,0 +1,68 @@
import { motion } from 'framer-motion';
import { Link } from 'react-router-dom';
import { cn } from '../../../lib/cn';
import { buttonBaseClass } from '../../../lib/buttonStyles';
export const MarketplaceCta = () => {
return (
<section className="snap-start bg-black">
<div className="mx-auto flex w-full max-w-5xl flex-col items-center gap-8 px-6 py-20 text-center sm:gap-10 sm:px-10 sm:py-32 lg:py-40">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut' }}
className="flex items-center justify-center gap-4"
>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<span className="text-xs font-semibold uppercase tracking-[0.4em] text-white">
Explore The Network
</span>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</motion.div>
<motion.h3
initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.7, ease: 'easeOut', delay: 0.15 }}
className="text-4xl font-medium leading-tight text-white sm:text-5xl"
>
See What&apos;s Being Built Right Now
</motion.h3>
<motion.p
initial={{ opacity: 0, y: 16 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.7, ease: 'easeOut', delay: 0.25 }}
className="max-w-2xl text-lg text-white/70"
>
Discover real use cases partner integrations, and revenue models running on GeoMind
infrastructure.
</motion.p>
<motion.div
initial={{ opacity: 0, y: 12 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-20%' }}
transition={{ duration: 0.6, ease: 'easeOut', delay: 0.35 }}
className="w-full sm:w-auto"
>
<Link
to="/usecases"
className={cn(
buttonBaseClass,
'w-full px-10 py-4 font-bold uppercase tracking-[0.35em] sm:w-auto',
)}
>
See Use cases
</Link>
</motion.div>
</div>
</section>
);
};

View File

@@ -1,31 +1,26 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { ShieldCheck, Globe, Leaf, LineChart, Layers } from 'lucide-react'; import { Store, Coins, Cpu, Handshake } from 'lucide-react';
const benefits = [ const benefits = [
{ {
title: 'Ultra-Secure', title: 'Free to List',
description: 'Protect sensitive workloads with end-to-end security.', description: 'Join the marketplace at no cost and showcase available cloud units instantly.',
icon: ShieldCheck, icon: Store,
}, },
{ {
title: 'Scales Globally', title: 'Earn from Idle Capacity',
description: 'Supports workloads anywhere, from local nodes to planetary scale.', description: 'Sell unused compute cycles to AI teams and turn sunk costs into recurring revenue.',
icon: Globe, icon: Coins,
}, },
{ {
title: 'Energy Efficient', title: 'Capacity on Demand',
description: 'Up to 10x less energy for specific workloads.', description: 'Tap trusted nodes across the network when workloads spike so you always have extra capacity when you need it.',
icon: Leaf, icon: Cpu,
}, },
{ {
title: 'Profitable', title: 'Trusted Settlements',
description: 'Monetize idle capacity; achieve ROI up to 3x higher.', description: 'Automated contracts and clear payouts keep every transaction compliant and transparent.',
icon: LineChart, icon: Handshake,
},
{
title: 'Flexible',
description: 'Compatible with existing infrastructure and hyperscaler requirements.',
icon: Layers,
}, },
]; ];
@@ -33,21 +28,29 @@ export const TechnologicalBenefits = () => {
return ( return (
<section className="py-16 text-slate-100 lg:py-24"> <section className="py-16 text-slate-100 lg:py-24">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<div className="flex items-center justify-center gap-4">
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<p className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300"> <p className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
Marketplace Marketplace
</p> </p>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</div>
<h2 className="mt-4 text-3xl font-semibold text-white sm:text-4xl"> <h2 className="mt-4 text-3xl font-semibold text-white sm:text-4xl">
Infrastructure that Pays for Itself Infrastructure that Pays for Itself
</h2> </h2>
<p className="mt-5 text-base text-slate-300 sm:text-lg"> <p className="mt-5 text-base text-slate-300 sm:text-lg">
GeoMind doesn't just deliver advanced datacenter capabilities, it turns your existing GeoMind Marketplace is a free exchange for cloud units. Operators list spare capacity,
infrastructure into a strategic asset. Run your own workloads securely and efficiently, buyers tap verified resources, and everyone earns. Let your AI infrastructure fund itself
while selling unused capacity to the network. With up to 10x lower energy consumption for as unused workloads convert into new revenue streams.
specific workloads and ROI up to 3x higher than traditional models, our platform works for
businesses, hyperscalers, and AI applications alike.
</p> </p>
</div> </div>
<div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-3"> <div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
{benefits.map((benefit, index) => ( {benefits.map((benefit, index) => (
<motion.div <motion.div
key={benefit.title} key={benefit.title}
@@ -55,10 +58,13 @@ export const TechnologicalBenefits = () => {
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.25 }} viewport={{ once: true, amount: 0.25 }}
transition={{ duration: 0.5, delay: index * 0.05 }} transition={{ duration: 0.5, delay: index * 0.05 }}
className="flex h-full flex-col rounded-3xl border border-white/10 bg-black p-6 shadow-none backdrop-blur" className="group relative flex h-full flex-col overflow-hidden rounded-3xl border border-white/10 bg-slate-950/80 p-6 transition-all duration-300 hover:-translate-y-1 hover:border-brand-400/50 hover:shadow-[0_25px_40px_-24px_rgba(15,118,230,0.45)]"
> >
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-brand-500/15"> <div className="pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100">
<benefit.icon className="h-7 w-7 text-brand-200" /> <div className="absolute inset-0 bg-gradient-to-br from-brand-500/15 via-transparent to-brand-200/10" />
</div>
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-gradient-to-br from-brand-500/30 via-brand-500/15 to-brand-200/10 text-brand-100">
<benefit.icon className="h-7 w-7" />
</div> </div>
<h3 className="mt-6 text-lg font-semibold text-white">{benefit.title}</h3> <h3 className="mt-6 text-lg font-semibold text-white">{benefit.title}</h3>
<p className="mt-3 text-sm leading-6 text-slate-300">{benefit.description}</p> <p className="mt-3 text-sm leading-6 text-slate-300">{benefit.description}</p>

View File

@@ -188,7 +188,20 @@ export const TechnologyArchitecture = () => {
return ( return (
<section className="py-16 text-slate-100 lg:py-24"> <section className="py-16 text-slate-100 lg:py-24">
<div className="mx-auto max-w-4xl text-center"> <div className="mx-auto max-w-4xl text-center">
<h2 className="text-3xl font-semibold text-white sm:text-4xl">Autonomous Software Stack</h2> <div className="flex items-center justify-center gap-4">
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<p className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
Software Primitives
</p>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</div>
<h2 className="mt-4 text-3xl font-semibold text-white sm:text-4xl">Autonomous Software Stack</h2>
<p className="mt-4 text-base text-slate-300 sm:text-lg"> <p className="mt-4 text-base text-slate-300 sm:text-lg">
Seamlessly integrating compute, storage, and networking, GeoMind's architecture delivers secure, Seamlessly integrating compute, storage, and networking, GeoMind's architecture delivers secure,
scalable, and efficient infrastructure for AI, cloud, and next-generation workloads from edge to scalable, and efficient infrastructure for AI, cloud, and next-generation workloads from edge to
@@ -227,7 +240,10 @@ export const TechnologyArchitecture = () => {
<p className="mt-2 text-base text-slate-300">{current.description}</p> <p className="mt-2 text-base text-slate-300">{current.description}</p>
<ul className="mt-6 space-y-4 text-sm text-slate-300"> <ul className="mt-6 space-y-4 text-sm text-slate-300">
{current.bullets.map((bullet) => ( {current.bullets.map((bullet) => (
<li key={bullet.heading} className="rounded-2xl border border-white/10 bg-black p-4"> <li
key={bullet.heading}
className="group rounded-2xl border border-white/10 bg-black p-4 transition-all duration-300 hover:-translate-y-1 hover:border-brand-400/50 hover:bg-white/5 hover:shadow-[0_24px_48px_-36px_rgba(56,189,248,0.45)]"
>
<p className="text-base font-semibold text-white">{bullet.heading}</p> <p className="text-base font-semibold text-white">{bullet.heading}</p>
<p className="mt-2 text-sm text-slate-300">{bullet.body}</p> <p className="mt-2 text-sm text-slate-300">{bullet.body}</p>
{bullet.subpoints && ( {bullet.subpoints && (
@@ -244,7 +260,7 @@ export const TechnologyArchitecture = () => {
))} ))}
</ul> </ul>
</div> </div>
<div className="hidden h-full rounded-3xl border border-white/10 bg-black p-6 backdrop-blur lg:flex lg:flex-col lg:items-start lg:justify-between"> <div className="hidden h-full rounded-3xl border border-white/10 bg-black p-6 transition-all duration-300 hover:-translate-y-1.5 hover:border-brand-400/50 hover:bg-white/5 hover:shadow-[0_30px_72px_-48px_rgba(56,189,248,0.45)] backdrop-blur lg:flex lg:flex-col lg:items-start lg:justify-between">
<motion.p <motion.p
key={`label-${current.id}`} key={`label-${current.id}`}
initial={{ opacity: 0, y: -10 }} initial={{ opacity: 0, y: -10 }}

View File

@@ -1,38 +1,22 @@
import { motion } from 'framer-motion';
import { PrimaryButton } from '../../../components/ui/PrimaryButton';
export const TechnologyHero = () => { export const TechnologyHero = () => {
return ( return (
<section className="relative overflow-hidden rounded-3xl text-white"> <section
<img aria-label="GeoMind technology showcase"
src="/images/hometech.jpg" className="group relative min-h-[420px] overflow-hidden rounded-[32px] border border-white/10 bg-slate-950 text-white shadow-[0_35px_90px_-45px_rgba(17,24,39,0.85)] transition-all duration-500 hover:-translate-y-1.5 hover:border-brand-400/70 hover:shadow-[0_45px_120px_-45px_rgba(122,141,249,0.55)] sm:min-h-[520px] lg:min-h-[600px]"
alt=""
className="absolute inset-0 h-full w-full object-cover"
/>
<div className="absolute inset-0 bg-gradient-to-br from-[#0f172a]/80 via-[#1e1b4b]/70 to-[#312e81]/75" />
<motion.div
initial={{ opacity: 0, y: 32 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: 'easeOut' }}
className="relative z-10 px-6 py-20 sm:px-10 lg:px-16 lg:py-24"
> >
<p className="text-xs font-semibold uppercase tracking-[0.35em] text-white"> <video
Technology className="absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
</p> src="/videos/galaxy_vid.mp4"
<h1 className="mt-6 text-3xl font-semibold leading-tight sm:text-4xl lg:text-5xl"> autoPlay
The Foundation of the Next-Generation Datacenter loop
</h1> muted
<p className="mt-6 max-w-3xl text-base text-white/75 sm:text-lg"> playsInline
GeoMind combines hardware and revolutionary software to deliver secure, scalable, and preload="auto"
sovereign cloud and AI infrastructure. Built for efficiency, sustainability, and />
profitability, it empowers organizations to run workloads, scale globally, and monetize <div className="absolute bottom-[-20%] right-[-10%] h-[420px] w-[420px] rounded-full bg-[rgba(90,107,240,0.25)] blur-3xl transition-transform duration-700 group-hover:scale-110" />
excess capacity. <div className="relative z-10 h-full w-full px-6 py-24 sm:px-12 lg:px-20 lg:py-32">
</p> <span className="sr-only">Immersive background video highlighting GeoMind technology.</span>
<div className="mt-10">
<PrimaryButton to="/usecases">Use Cases</PrimaryButton>
</div> </div>
</motion.div>
</section> </section>
); );
}; };

View File

@@ -20,9 +20,19 @@ export const TechnologyStack = () => {
<section className="py-16 text-slate-100 lg:py-24"> <section className="py-16 text-slate-100 lg:py-24">
<div className="mx-auto max-w-6xl px-6 sm:px-10 lg:px-16"> <div className="mx-auto max-w-6xl px-6 sm:px-10 lg:px-16">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<div className="flex items-center justify-center gap-4">
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
<p className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300"> <p className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
Hardware Tiers Hardware Tiers
</p> </p>
<span
aria-hidden="true"
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
/>
</div>
<h2 className="mt-4 text-3xl font-semibold text-white sm:text-4xl"> <h2 className="mt-4 text-3xl font-semibold text-white sm:text-4xl">
An Infrastructure Built for the AI Era An Infrastructure Built for the AI Era
</h2> </h2>
@@ -39,14 +49,14 @@ export const TechnologyStack = () => {
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }} viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.5, delay: index * 0.1 }} transition={{ duration: 0.5, delay: index * 0.1 }}
className="overflow-hidden rounded-3xl bg-black shadow-none backdrop-blur" className="flex h-full flex-col overflow-hidden rounded-3xl bg-black text-center shadow-none backdrop-blur"
> >
<div className="h-56 overflow-hidden"> <div className="h-56 overflow-hidden">
<img src={item.image} alt={item.title} className="h-full w-full object-cover" /> <img src={item.image} alt={item.title} className="h-full w-full object-cover" />
</div> </div>
<div className="p-6"> <div className="flex flex-1 flex-col items-center gap-4 p-6">
<h3 className="text-xl font-semibold text-white">{item.title}</h3> <h3 className="text-xl font-semibold text-white">{item.title}</h3>
<p className="mt-3 text-sm leading-6 text-slate-300">{item.description}</p> <p className="text-sm leading-6 text-slate-300">{item.description}</p>
</div> </div>
</motion.div> </motion.div>
))} ))}

View File

@@ -1,63 +1,75 @@
import { useState } from 'react';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { cn } from '../../../lib/cn';
import { buttonGhostLightClass } from '../../../lib/buttonStyles';
import ContactForm from '../../../components/ui/ContactForm';
const useCases = [ const useCases = [
{
title: 'Tier-S Datacenters',
description:
"GeoMind's datacenters are 60% more efficient, disaster-resistant, highly secure, fully private, and can be deployed in weeks rather than years, offering a faster, safer, and smarter solution for modern data needs.",
image: '/images/tier-s.jpeg',
},
{
title: 'Tier-H Datacenters',
description:
"GeoMind's distributed datacenter architecture extends from core to edge, seamlessly scaling into homes, offices, and communities. Its ultra-efficient AI, compute, and storage nodes deliver unmatched cost efficiency, performance, and scalability.",
image: '/images/tier-h.jpeg',
},
{ {
title: 'Project Mycelium', title: 'Project Mycelium',
highlight: 'Decentralized Core',
description: description:
'Project Mycelium is a core use case of our ecosystem, providing a decentralized, scalable, and secure infrastructure. Built on a global network of independent nodes, it allows individuals and businesses to participate in a more open, distributed, and participatory cloud and Internet model.', 'Project Mycelium turns GeoMind primitives into community services, giving underserved regions, nomads, and privacy seekers decentralized storage, secure networking, and personal agents while sustaining host demand.',
image: '/images/mycelium.jpeg', image: '/images/mycelium.jpeg',
}, },
{ {
title: 'Zanzibar Digital Free Zone', title: 'Digital Free Zone',
highlight: 'Sovereign Innovation',
description: description:
'Zanzibar Digital Free Zone offers a sovereign jurisdiction for digital innovation, allowing businesses to operate with regulatory clarity and independent dispute resolution. It supports the emerging Real World Assets (RWA) economy, enabling compliant management of digital and physical assets.', 'An economic bridge in Zanzibar for digital assets with dedicated governance, regulation, and dispute resolution so builders can deploy compliant Web3, AI, and fintech products on GeoMind-powered future-ready infrastructure.',
image: '/images/freezone.jpeg', image: '/images/freezone.jpeg',
titleOffset: '-mt-2 sm:-mt-3',
}, },
{ {
title: 'COOP Cloud', title: 'COOP Cloud',
highlight: 'People-Powered Cloud',
description: description:
'COOP Cloud is a global cooperative where every user is a member with one vote. Offering a decentralized alternative to centralized cloud providers, it empowers users to deploy nodes worldwide, aiming to create Augmented Collective Intelligence with over one million nodes globally.', 'COOP Cloud teams with the International Cooperative Alliance so 1.2 billion co-op members can run shared infrastructure and launch services together on GeoMind, building a self-sustaining digital infrastructure that serves their communities.',
image: '/images/coop.jpeg', image: '/images/coop.jpeg',
titleOffset: '-mt-3 sm:-mt-4',
}, },
{ {
title: 'Sovereign Cloud & Internet for Countries', title: 'Cloud for Nations',
highlight: 'Digital Sovereignty',
description: description:
'Most countries lack independent Internet infrastructure and rely on foreign operators. GeoMind enables countries to deploy their own sovereign Cloud & Internet, ensuring economic benefits, data sovereignty, and local control. Several governments are already exploring this.', 'Most governments and citizens rely on foreign clouds, exposing finances and national security. GeoMind equips physical and digital states with sovereign infrastructure so they control data, AI, and services on their own terms.',
image: '/images/countries.jpeg', image: '/images/countries.jpeg',
}, },
{
title: 'Real Estate Deployments',
highlight: 'Underutilized Spaces',
description:
'Deploy GeoMind in underutilized spaces with rapid integration into building utilities. Turn idle rooms into revenue generating data centers at minimal additional cost. Deliver residents and employees data sovereignty on tech that requires minimal maintenance.',
image: '/images/hometech2.jpg',
featured: true,
},
]; ];
export const UseCasesGrid = () => { export const UseCasesGrid = () => {
const [isContactFormOpen, setIsContactFormOpen] = useState(false);
const [formType, setFormType] = useState<'deploy' | 'offtake' | 'investor'>('deploy');
const handleOpenForm = (type: 'deploy' | 'offtake' | 'investor') => {
setFormType(type);
setIsContactFormOpen(true);
};
return ( return (
<section className="py-16 text-slate-100 lg:py-24"> <section className="px-4 py-16 text-slate-100 sm:px-0 lg:py-24">
<motion.div <motion.div
initial={{ opacity: 0, y: 24 }} initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }} viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: 'easeOut' }} transition={{ duration: 0.6, ease: 'easeOut' }}
> >
<h2 className="text-3xl font-semibold text-white sm:text-4xl">Use Cases</h2> <h2 className="text-center text-3xl font-semibold text-white sm:text-4xl">Use Cases</h2>
<p className="mt-5 max-w-4xl text-base text-slate-300 sm:text-lg"> <p className="mt-5 max-w-4xl text-center text-base text-slate-300 sm:text-lg sm:mx-auto">
GeoMind's next-generation datacenter architecture extends from core to edge, seamlessly From decentralized cores to national-scale infrastructure, GeoMind translates sovereign
connecting Tier S hyperscale facilities with Tier H local nodes to create a unified, sovereign compute into deployable products. Each use case blends hyperscale performance with edge
infrastructure. Up to 60% more energy-efficient and built for resilience, privacy, and responsiveness, enabling partners to launch resilient, energy-efficient capacity exactly
quantum-safe security, it can be deployed in weeks rather than years. These capabilities power where it is needed.
the transformative use cases below, driving a more secure, efficient, and autonomous digital
future.
</p> </p>
<div className="mt-12 grid gap-8 sm:grid-cols-2 lg:grid-cols-3"> <div className="mt-12 -mx-4 flex snap-x snap-mandatory gap-6 overflow-x-auto pb-6 sm:mx-0 sm:grid sm:grid-cols-2 sm:gap-8 sm:overflow-visible sm:pb-0 sm:snap-none xl:grid-cols-4">
{useCases.map((useCase, index) => ( {useCases.map((useCase, index) => (
<motion.article <motion.article
key={useCase.title} key={useCase.title}
@@ -65,20 +77,93 @@ export const UseCasesGrid = () => {
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.25 }} viewport={{ once: true, amount: 0.25 }}
transition={{ duration: 0.5, delay: index * 0.05 }} transition={{ duration: 0.5, delay: index * 0.05 }}
className="overflow-hidden rounded-3xl border border-white/10 bg-black shadow-none backdrop-blur" className={cn(
'group relative flex h-full min-w-[80vw] snap-center flex-col overflow-hidden rounded-3xl border border-white/10 bg-slate-950/80 transition-all duration-300 hover:-translate-y-1 hover:border-brand-400/50 hover:shadow-[0_25px_40px_-24px_rgba(15,118,230,0.45)] sm:min-w-0',
useCase.featured && 'min-w-[88vw] sm:col-span-2 xl:col-span-4 sm:flex sm:flex-row sm:items-start sm:gap-8'
)}
> >
<div className="relative h-48 overflow-hidden"> <div className="pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100">
<img src={useCase.image} alt={useCase.title} className="h-full w-full object-cover" /> <div className="absolute inset-0 bg-gradient-to-br from-brand-500/15 via-transparent to-brand-200/10" />
<div className="absolute inset-0 bg-gradient-to-t from-ink/70 via-transparent to-transparent" /> </div>
<h3 className="absolute bottom-4 left-4 text-lg font-semibold text-white"> <div
{useCase.title} className={cn(
</h3> 'relative h-48 overflow-hidden sm:h-56 lg:h-full',
useCase.featured && 'sm:h-full sm:w-[42%] lg:w-[38%]'
)}
>
<img
src={useCase.image}
alt={useCase.title}
className="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
/>
<div className="absolute inset-0 bg-gradient-to-t from-ink/80 via-transparent to-transparent" />
</div>
<div
className={cn(
'relative flex h-full flex-col items-center px-6 pb-6 pt-6 text-center sm:px-8 sm:pb-8 sm:pt-8',
useCase.featured && 'sm:flex-1 sm:px-10 sm:pb-12 sm:pt-12'
)}
>
<div className={cn('flex flex-col items-center gap-3', useCase.titleOffset)}>
<span className="text-xs font-semibold uppercase tracking-[0.3em] text-sky-200/80">
{useCase.highlight}
</span>
<h3 className="text-xl font-semibold text-white">{useCase.title}</h3>
</div>
<p className="mt-6 text-sm leading-6 text-slate-300 sm:mt-8">{useCase.description}</p>
</div> </div>
<p className="p-6 text-sm leading-6 text-slate-300">{useCase.description}</p>
</motion.article> </motion.article>
))} ))}
</div> </div>
<motion.div
initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: 'easeOut', delay: 0.2 }}
className="mt-16 overflow-hidden rounded-[32px] border border-white/10 bg-gradient-to-br from-[#0d112a] via-[#111f3f] to-[#1c2257] p-8 text-white shadow-[0_30px_90px_-50px_rgba(15,23,42,1)] sm:p-12 lg:p-16"
>
<div className="flex flex-col gap-8 lg:flex-row lg:items-center lg:justify-between">
<div className="max-w-2xl space-y-4">
<p className="text-xs font-semibold uppercase tracking-[0.4em] text-white/60">
Become a Partner
</p>
<h3 className="text-2xl font-semibold sm:text-3xl">
Build sovereign infrastructure with GeoMind&apos;s ecosystem.
</h3>
<p className="text-base text-white/70">
Pick the path that delivers outcomes fast: deploy capacity, lock in offtake, or invest in
the platform redefining cloud infrastructure.
</p>
</div>
<div className="grid w-full gap-4 sm:grid-cols-2 lg:w-auto lg:grid-cols-1">
<button
onClick={() => handleOpenForm('deploy')}
className={cn(buttonGhostLightClass, 'flex w-full uppercase tracking-[0.25em]')}
>
Deploy Capacity
</button>
<button
onClick={() => handleOpenForm('offtake')}
className={cn(buttonGhostLightClass, 'flex w-full uppercase tracking-[0.25em]')}
>
Offtake Capacity
</button>
<button
onClick={() => handleOpenForm('investor')}
className={cn(buttonGhostLightClass, 'flex w-full uppercase tracking-[0.25em]')}
>
Invest in the Tech
</button>
</div>
</div>
</motion.div> </motion.div>
</motion.div>
<ContactForm
isOpen={isContactFormOpen}
onClose={() => setIsContactFormOpen(false)}
title={formType === 'deploy' ? 'Deploy Capacity' : formType === 'offtake' ? 'Offtake Capacity' : 'Invest in the Tech'}
formType={formType}
/>
</section> </section>
); );
}; };

View File

@@ -2,31 +2,31 @@ import { motion } from 'framer-motion';
export const UseCasesHero = () => { export const UseCasesHero = () => {
return ( return (
<section className="relative overflow-hidden rounded-3xl text-white"> <section className="group relative flex overflow-hidden rounded-[32px] border border-white/10 bg-gradient-to-br from-[#050a21] via-[#11173a] to-[#221852] text-white shadow-[0_35px_90px_-45px_rgba(17,24,39,0.95)] transition-all duration-500 hover:-translate-y-1.5 hover:border-brand-400/60 hover:shadow-[0_40px_120px_-45px_rgba(122,141,249,0.45)]">
<img <img
src="/images/uscase_BG.png" src="/images/mesh2.gif"
alt="" alt=""
className="absolute inset-0 h-full w-full object-cover" className="absolute inset-0 h-full w-full object-cover opacity-40 mix-blend-screen transition-transform duration-700 group-hover:scale-105"
/> />
<div className="absolute inset-0 bg-gradient-to-br from-[#0f172a]/80 via-[#1e1b4b]/70 to-[#312e81]/80" /> <div className="absolute inset-0 bg-gradient-to-br from-white/10 via-white/5 to-transparent mix-blend-overlay transition-opacity duration-500 group-hover:opacity-90" />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(122,141,249,0.35),_transparent_60%)] opacity-90 transition-opacity duration-500 group-hover:opacity-100" />
<div className="absolute bottom-[-35%] right-[-5%] h-[380px] w-[380px] rounded-full bg-brand-400/30 blur-3xl transition-transform duration-700 group-hover:scale-110" />
<motion.div <motion.div
initial={{ opacity: 0, y: 32 }} initial={{ opacity: 0, y: 32 }}
whileInView={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: 'easeOut' }} transition={{ duration: 0.6, ease: 'easeOut' }}
className="relative z-10 px-6 py-20 sm:px-10 lg:px-16 lg:py-24" className="relative z-10 flex w-full flex-col items-center px-6 py-24 text-center sm:px-12 lg:px-20 lg:py-28"
> >
<p className="text-xs font-semibold uppercase tracking-[0.35em] text-white"> <span className="inline-flex items-center gap-3 text-[0.68rem] uppercase tracking-[0.42em] text-white/70">
<span className="h-px w-10 bg-white/40" />
Real World Applications Real World Applications
</p> <span className="h-px w-10 bg-white/40" />
<h1 className="mt-6 text-3xl font-semibold leading-tight sm:text-4xl lg:text-5xl"> </span>
<h1 className="mt-8 max-w-3xl text-3xl font-semibold leading-tight sm:text-4xl lg:text-5xl lg:leading-[1.1]">
Designed for Real-World Impact Designed for Real-World Impact
</h1> </h1>
<p className="mt-6 max-w-3xl text-base text-white/75 sm:text-lg"> <p className="mt-6 max-w-3xl text-base text-white/80 sm:text-lg">
GeoMind empowers organizations to deploy secure, efficient, and sovereign cloud and AI GeoMind empowers organizations to deploy secure, efficient, and sovereign infrastructure. From enterprises to governments, our use cases demonstrate GeoMind's potential to generate value, ensure sovereignty, and support modern workloads.
infrastructure anywhere. From enterprises to governments, our use cases demonstrate how
next-generation datacenters generate value, ensure sovereignty, and support modern AI,
cloud, and edge workloads.
</p> </p>
</motion.div> </motion.div>
</section> </section>

View File

@@ -26,6 +26,20 @@ export default {
boxShadow: { boxShadow: {
subtle: '0 20px 45px -25px rgba(18, 28, 132, 0.35)', subtle: '0 20px 45px -25px rgba(18, 28, 132, 0.35)',
}, },
keyframes: {
blink: {
'0%, 100%': { opacity: 1 },
'50%': { opacity: 0.35 },
},
'data-stream': {
'0%': { backgroundPosition: '0% 50%' },
'100%': { backgroundPosition: '200% 50%' },
},
},
animation: {
blink: 'blink 0.9s steps(2, start) infinite',
'data-stream': 'data-stream 2.75s linear infinite',
},
}, },
}, },
plugins: [], plugins: [],

View File

@@ -5,6 +5,6 @@ import react from '@vitejs/plugin-react'
export default defineConfig({ export default defineConfig({
plugins: [react()], plugins: [react()],
server: { server: {
allowedHosts: ['coucha-royal-nontannic.ngrok-free.dev'], allowedHosts: ['coucha-royal-nontannic.ngrok-free.dev', 'reasonedly-avifaunal-wanda.ngrok-free.dev'],
}, },
}) })