Compare commits
2 Commits
68526abff3
...
221edb106a
Author | SHA1 | Date | |
---|---|---|---|
|
221edb106a | ||
|
e0f097c548 |
14
package-lock.json
generated
14
package-lock.json
generated
@@ -1,13 +1,14 @@
|
|||||||
{
|
{
|
||||||
"name": "geomind2",
|
"name": "geomind",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "geomind2",
|
"name": "geomind",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@emailjs/browser": "^4.4.1",
|
||||||
"framer-motion": "^12.23.23",
|
"framer-motion": "^12.23.23",
|
||||||
"lucide-react": "^0.545.0",
|
"lucide-react": "^0.545.0",
|
||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
@@ -327,6 +328,15 @@
|
|||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@emailjs/browser": {
|
||||||
|
"version": "4.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@emailjs/browser/-/browser-4.4.1.tgz",
|
||||||
|
"integrity": "sha512-DGSlP9sPvyFba3to2A50kDtZ+pXVp/0rhmqs2LmbMS3I5J8FSOgLwzY2Xb4qfKlOVHh29EAutLYwe5yuEZmEFg==",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@esbuild/aix-ppc64": {
|
"node_modules/@esbuild/aix-ppc64": {
|
||||||
"version": "0.25.10",
|
"version": "0.25.10",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz",
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@emailjs/browser": "^4.4.1",
|
||||||
"framer-motion": "^12.23.23",
|
"framer-motion": "^12.23.23",
|
||||||
"lucide-react": "^0.545.0",
|
"lucide-react": "^0.545.0",
|
||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
|
@@ -31,7 +31,7 @@ export const Layout = ({ children }: LayoutProps) => {
|
|||||||
className={cn(
|
className={cn(
|
||||||
'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-proximity'
|
||||||
: cn(
|
: cn(
|
||||||
'pb-24 pt-28 lg:pt-32',
|
'pb-24 pt-28 lg:pt-32',
|
||||||
isAbout ? 'w-full px-0' : 'mx-auto max-w-6xl px-6 lg:px-8',
|
isAbout ? 'w-full px-0' : 'mx-auto max-w-6xl px-6 lg:px-8',
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import { motion, AnimatePresence } from 'framer-motion';
|
import { motion, AnimatePresence } from 'framer-motion';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { X, Send, CheckCircle } from 'lucide-react';
|
import { X, Send, CheckCircle } from 'lucide-react';
|
||||||
|
import emailjs from '@emailjs/browser';
|
||||||
|
|
||||||
interface ContactFormProps {
|
interface ContactFormProps {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
@@ -31,18 +32,35 @@ export default function ContactForm({ isOpen, onClose, title = "Get in Touch", f
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setIsSubmitting(true);
|
setIsSubmitting(true);
|
||||||
|
|
||||||
// TODO: Add emailjs integration later
|
try {
|
||||||
// Simulate API call
|
const templateParams = {
|
||||||
setTimeout(() => {
|
from_name: formData.name,
|
||||||
console.log('Form submitted:', { ...formData, formType });
|
from_email: formData.email,
|
||||||
|
company: formData.company,
|
||||||
|
message: formData.message,
|
||||||
|
to_email: 'emre@incubaid.com', // Recipient email
|
||||||
|
form_type: formType || 'General Inquiry',
|
||||||
|
};
|
||||||
|
|
||||||
|
await emailjs.send(
|
||||||
|
'service_03d0vf8', // EmailJS Service ID
|
||||||
|
'template_6o6e8oe', // EmailJS Template ID
|
||||||
|
templateParams,
|
||||||
|
'bhkly3gzrO-SA9w7v' // EmailJS Public Key
|
||||||
|
);
|
||||||
|
|
||||||
setIsSubmitted(true);
|
setIsSubmitted(true);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setIsSubmitted(false);
|
setIsSubmitted(false);
|
||||||
setFormData({ name: '', email: '', company: '', message: '' });
|
setFormData({ name: '', email: '', company: '', message: '' });
|
||||||
onClose();
|
onClose();
|
||||||
}, 3000);
|
}, 3000);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Email sending failed:', error);
|
||||||
|
alert('Failed to send message. Please try again.');
|
||||||
|
} finally {
|
||||||
setIsSubmitting(false);
|
setIsSubmitting(false);
|
||||||
}, 1000);
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const getPlaceholderMessage = () => {
|
const getPlaceholderMessage = () => {
|
||||||
|
@@ -6,8 +6,8 @@ import { AboutCta } from './components/AboutCta';
|
|||||||
export const AboutPage = () => {
|
export const AboutPage = () => {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-12 text-slate-100 lg:space-y-16">
|
<div className="space-y-12 text-slate-100 lg:space-y-16">
|
||||||
<AboutHero />
|
|
||||||
<MissionVision />
|
<MissionVision />
|
||||||
|
<AboutHero />
|
||||||
<TrackRecord />
|
<TrackRecord />
|
||||||
<AboutCta />
|
<AboutCta />
|
||||||
</div>
|
</div>
|
||||||
|
@@ -47,7 +47,7 @@ export const AboutHero = () => {
|
|||||||
<div className="mx-auto w-full max-w-7xl">
|
<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="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="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)]">
|
<div className="group relative flex h-full flex-col overflow-hidden rounded-[32px] border border-white/10 bg-gradient-to-br from-[#2d336c] via-[#4350d7] to-[#7a8df9] 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=""
|
||||||
@@ -64,7 +64,7 @@ export const AboutHero = () => {
|
|||||||
>
|
>
|
||||||
<div className="flex w-full items-center justify-center gap-4 text-[0.7rem] font-medium uppercase tracking-[0.32em] text-white/70">
|
<div className="flex w-full items-center justify-center gap-4 text-[0.7rem] font-medium uppercase tracking-[0.32em] text-white/70">
|
||||||
<span className="h-px w-12 bg-white/25 transition-colors duration-500 group-hover:bg-white/50 sm:w-14 lg:w-16" />
|
<span className="h-px w-12 bg-white/25 transition-colors duration-500 group-hover:bg-white/50 sm:w-14 lg:w-16" />
|
||||||
<span className="text-white/80">About GeoMind</span>
|
<span className="text-white/80">About Us</span>
|
||||||
<span className="h-px w-12 bg-white/25 transition-colors duration-500 group-hover:bg-white/50 sm:w-14 lg:w-16" />
|
<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>
|
</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]">
|
<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]">
|
||||||
|
@@ -1,72 +1,32 @@
|
|||||||
export const MissionVision = () => {
|
export const MissionVision = () => {
|
||||||
return (
|
return (
|
||||||
<section className="relative py-20 text-slate-100 lg:py-28">
|
<section className="relative -mt-28 flex min-h-screen flex-col overflow-hidden text-white lg:-mt-32">
|
||||||
<div className="relative mx-auto max-w-6xl px-6 lg:px-12">
|
<img
|
||||||
<div className="flex items-center justify-center gap-4">
|
src="/images/cloud_sky.png"
|
||||||
<span
|
alt="Sunrise light shining through layered clouds above a resilient skyline."
|
||||||
aria-hidden="true"
|
className="absolute inset-0 h-full w-full object-cover"
|
||||||
className="hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block"
|
/>
|
||||||
/>
|
<div className="absolute inset-0 bg-gradient-to-br from-black/85 via-black/60 to-brand-900/40" />
|
||||||
<span className="text-xs font-semibold uppercase tracking-[0.35em] text-brand-300">
|
|
||||||
|
<div className="relative z-10 flex flex-1 items-start justify-center px-6 pb-24 pt-[45vh] text-center sm:px-10 sm:pt-[40vh]">
|
||||||
|
<div className="max-w-4xl space-y-8">
|
||||||
|
<span className="inline-block text-xs font-semibold uppercase tracking-[0.35em] text-brand-200">
|
||||||
Mission & Vision
|
Mission & Vision
|
||||||
</span>
|
</span>
|
||||||
<span
|
<h2 className="text-3xl font-semibold leading-tight sm:text-4xl md:text-5xl">
|
||||||
aria-hidden="true"
|
Prioritizing people and planet for a sovereign cloud future
|
||||||
className="hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block"
|
</h2>
|
||||||
/>
|
<p className="mx-auto max-w-3xl text-base text-white/80 sm:text-lg">
|
||||||
</div>
|
GeoMind builds inclusive digital infrastructure because access to compute should be a fundamental human
|
||||||
<div className="mt-8 grid gap-12 lg:grid-cols-[1.1fr,0.9fr] lg:items-center">
|
right. We engineer systems that keep communities in control of their data, reward local participation, and
|
||||||
<div className="space-y-6">
|
run with a lighter footprint on the planet.
|
||||||
<h2 className="text-3xl font-semibold text-white sm:text-4xl">
|
</p>
|
||||||
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>
|
|
||||||
<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)]">
|
|
||||||
<p className="text-sm font-semibold uppercase tracking-[0.28em] text-brand-200">
|
|
||||||
What drives us
|
|
||||||
</p>
|
|
||||||
<ul className="space-y-3 text-sm text-slate-300 sm:text-base">
|
|
||||||
<li>
|
|
||||||
<span className="font-semibold text-white">People first:</span> compute that is
|
|
||||||
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>
|
|
||||||
</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>
|
|
||||||
</figure>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="relative z-10 px-6 pb-10 text-center text-xs font-semibold uppercase tracking-[0.35em] text-white/80 sm:px-10 sm:text-sm">
|
||||||
|
People • Planet • Authenticity • Open-source • Simplicity
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -60,7 +60,7 @@ export const TrackRecord = () => {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<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="mt-12 mx-auto max-w-6xl 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">
|
<div className="grid gap-6 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5">
|
||||||
{exits.map((exit, index) => (
|
{exits.map((exit, index) => (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
@@ -1,105 +1,8 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { HeroSection } from './components/HeroSection';
|
import { HeroSection } from './components/HeroSection';
|
||||||
import { ScrollLockedSection } from './components/ScrollLockedSection';
|
|
||||||
import { CtaSection } from './components/CtaSection';
|
import { CtaSection } from './components/CtaSection';
|
||||||
import { Footer } from '../../components/layout/Footer';
|
import { Footer } from '../../components/layout/Footer';
|
||||||
|
import { ScrollLockedSection } from './components/ScrollLockedSection';
|
||||||
const highlightTextClass = 'text-brand-500';
|
|
||||||
|
|
||||||
const sections = [
|
|
||||||
{
|
|
||||||
id: 'datacenter-economy',
|
|
||||||
eyebrow: 'Datacenter Economy',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
The Datacenter Economy,{' '}
|
|
||||||
<span className={highlightTextClass}>Decentralized</span>
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description:
|
|
||||||
'GeoMind enables everyone to profit from Cloud and AI infrastructure at any scale. Deploy hardware, sell your capacity to the marketplace, earn from day one.',
|
|
||||||
showButton: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'deploy-anywhere',
|
|
||||||
eyebrow: 'Deployment Tiers',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
<span className={highlightTextClass}>Deploy</span> Anywhere, Any Scale
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description:
|
|
||||||
'Tier-H for homes and communities. Tier-S for enterprises and underutilized commercial space. Same economics, different scale.',
|
|
||||||
buttonText: 'Explore Hardware Tiers',
|
|
||||||
buttonLink: '/technology#hardware-tiers',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'autonomous-stack',
|
|
||||||
eyebrow: 'Plug-and-Play',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
Five Primitives, <span className={highlightTextClass}>Zero Dependencies</span>
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description:
|
|
||||||
'Hardware ships with OS, Compute, Storage, Network, and GPU built-in. Fully autonomous operation eliminates vendor lock-in completely.',
|
|
||||||
buttonText: 'Explore Software Stack',
|
|
||||||
buttonLink: '/technology#software-stack',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'capacity-marketplace',
|
|
||||||
eyebrow: 'Glocal Marketplace',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
Local Hardware, <span className={highlightTextClass}>Global</span> Marketplace
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description: (
|
|
||||||
<>
|
|
||||||
Zero-OS partitions capacity into tradeable slices called <strong>Cloud Units (CU)</strong>. Use what you need. Sell idle capacity automatically on the marketplace.
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
buttonText: 'Explore Marketplace',
|
|
||||||
buttonLink: '/technology#marketplace',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'dual-revenue',
|
|
||||||
eyebrow: 'Profit',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
<span className={highlightTextClass}>Earn</span> from Idle Capacity
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description:
|
|
||||||
'Run your workloads during business hours. Rent excess capacity 24/7. Cloud capacity and infrastructure becomes an income-generating asset, not a cost center.',
|
|
||||||
showButton: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'economic-advantage',
|
|
||||||
eyebrow: 'Competitive Advantage',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
<span className={highlightTextClass}>Lower Costs</span>, Competitive Prices
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description:
|
|
||||||
'Minimal datacenter build costs. Energy-efficient autonomous operation. No enterprise maintenance overhead. Lower OPEX and CAPEX. Your competitive advantage is built in.',
|
|
||||||
showButton: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'instant-demand',
|
|
||||||
eyebrow: 'Offtakers',
|
|
||||||
title: (
|
|
||||||
<>
|
|
||||||
<span className={highlightTextClass}>Built-In</span> Demand
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
description:
|
|
||||||
'Initial enterprise offtake partners are in place. Deploy hardware, connect to marketplace, start earning. No customer acquisition needed.',
|
|
||||||
buttonText: 'See Use Cases',
|
|
||||||
buttonLink: '/usecases',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export const HomePage = () => {
|
export const HomePage = () => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -108,14 +11,14 @@ export const HomePage = () => {
|
|||||||
|
|
||||||
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">
|
<HeroSection />
|
||||||
<HeroSection />
|
<ScrollLockedSection />
|
||||||
{sections.map((section) => (
|
<div className="snap-start">
|
||||||
<ScrollLockedSection key={section.id} {...section} />
|
|
||||||
))}
|
|
||||||
<CtaSection />
|
<CtaSection />
|
||||||
</div>
|
</div>
|
||||||
<Footer />
|
<div className="snap-start">
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -22,7 +22,7 @@ export const HeroSection = () => {
|
|||||||
<p className="max-w-xl text-lg text-white">
|
<p className="max-w-xl text-lg text-white">
|
||||||
A new generation of decentralized cloud and AI infrastructure.
|
A new generation of decentralized cloud and AI infrastructure.
|
||||||
<br />
|
<br />
|
||||||
Secure, scalable, efficient, and sovereign by design. Deploy your own datacenter, scale globally, and turn infrastructure into profit.
|
Faster, greener, smarter. Deploy your own datacenter, scale globally, and own your cloud, turning IT from a cost center to a profit center.
|
||||||
</p>
|
</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
@@ -30,9 +30,8 @@ export const HeroSection = () => {
|
|||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.8, ease: 'easeOut', delay: 0.4 }}
|
transition={{ duration: 0.8, ease: 'easeOut', delay: 0.4 }}
|
||||||
className="flex items-center justify-between text-xs uppercase tracking-[0.3em] text-white"
|
className="flex items-center justify-end text-xs uppercase tracking-[0.3em] text-white"
|
||||||
>
|
>
|
||||||
<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>The Living Cloud</span>
|
<span>The Living Cloud</span>
|
||||||
|
@@ -1,86 +1,464 @@
|
|||||||
import type { ReactNode } from 'react';
|
import { useState, type CSSProperties } from 'react';
|
||||||
import { useRef } from 'react';
|
import { motion } from 'framer-motion';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import type { LucideIcon } from 'lucide-react';
|
||||||
import { ChevronsDown } from 'lucide-react';
|
import {
|
||||||
|
CloudCog,
|
||||||
|
Bot,
|
||||||
|
BatteryCharging,
|
||||||
|
Coins,
|
||||||
|
ShieldCheck,
|
||||||
|
Network,
|
||||||
|
} from 'lucide-react';
|
||||||
import { cn } from '../../../lib/cn';
|
import { cn } from '../../../lib/cn';
|
||||||
import { buttonBaseClass } from '../../../lib/buttonStyles';
|
|
||||||
|
|
||||||
type ScrollLockedSectionProps = {
|
const baseSectionClass =
|
||||||
id: string;
|
'relative flex min-h-screen snap-start items-center justify-center overflow-hidden bg-black pt-20 text-white sm:pt-24';
|
||||||
eyebrow: string;
|
const baseContainerClass =
|
||||||
title: ReactNode;
|
'relative z-10 mx-auto flex w-full max-w-7xl flex-col gap-10 px-6 pt-28 pb-20 sm:px-10 sm:pt-32 sm:pb-24 lg:px-16 lg:pt-36 lg:pb-28';
|
||||||
description: ReactNode;
|
const paragraphClass = 'text-base leading-relaxed text-white/70 sm:text-lg';
|
||||||
showButton?: boolean;
|
|
||||||
buttonText?: string;
|
const slideMotion = {
|
||||||
buttonLink?: string;
|
initial: { opacity: 0, y: 40 },
|
||||||
|
whileInView: { opacity: 1, y: 0 },
|
||||||
|
viewport: { once: true, amount: 0.35 },
|
||||||
|
transition: { duration: 0.9, ease: 'easeOut' },
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ScrollLockedSection = ({
|
type TierCardProps = {
|
||||||
id,
|
image: { primary: string; fallback?: string; alt: string };
|
||||||
eyebrow,
|
lines: [string, string];
|
||||||
title,
|
};
|
||||||
description,
|
|
||||||
showButton = true,
|
const TierCard = ({ image, lines }: TierCardProps) => {
|
||||||
buttonText = 'Directory Info',
|
const [src, setSrc] = useState(image.primary);
|
||||||
buttonLink,
|
|
||||||
}: ScrollLockedSectionProps) => {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const sectionRef = useRef<HTMLElement | null>(null);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section id={id} ref={sectionRef} className="relative h-[200vh] snap-start bg-black">
|
<div className="group relative flex h-full flex-col gap-4 overflow-hidden rounded-3xl border border-white/10 bg-white/[0.04] p-6 sm:p-8">
|
||||||
<div className="sticky top-0 flex h-screen flex-col">
|
<div className="absolute inset-0 bg-gradient-to-br from-white/10 via-transparent to-transparent opacity-0 transition-opacity duration-500 group-hover:opacity-100" />
|
||||||
<div className="flex h-full w-full flex-col px-6 sm:px-10 lg:px-16">
|
<div className="relative aspect-[4/3] overflow-hidden rounded-2xl border border-white/10 bg-black/40">
|
||||||
{/* Text Section - Takes ~20% of vertical space */}
|
<img
|
||||||
<div className="flex-shrink-0 space-y-4 pt-16 sm:pt-20 lg:pt-24">
|
src={src}
|
||||||
<span className="text-[11px] font-semibold uppercase tracking-[0.45em] text-white">
|
alt={image.alt}
|
||||||
{eyebrow}
|
className="h-full w-full object-cover opacity-90"
|
||||||
</span>
|
onError={() => {
|
||||||
<div className="max-w-3xl space-y-3">
|
if (image.fallback && src !== image.fallback) {
|
||||||
<p className="text-2xl font-semibold leading-tight text-white sm:text-3xl lg:text-[2.25rem] lg:leading-[1.2]">
|
setSrc(image.fallback);
|
||||||
{title}
|
}
|
||||||
</p>
|
}}
|
||||||
<p className="text-base leading-relaxed text-white/70 sm:text-lg">{description}</p>
|
/>
|
||||||
</div>
|
<div className="pointer-events-none absolute inset-0 bg-gradient-to-b from-black/0 via-black/20 to-black/40" />
|
||||||
</div>
|
</div>
|
||||||
|
<div className="relative space-y-3">
|
||||||
|
<p className="text-lg font-semibold leading-tight text-white">{lines[0]}</p>
|
||||||
|
<p className="text-base leading-relaxed text-white/70">{lines[1]}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
{/* Animation Section - Takes ~80% of vertical space */}
|
type SectionTagProps = {
|
||||||
<div className="flex flex-col items-center gap-6 py-10 sm:gap-8 sm:py-12 lg:gap-10">
|
label: string;
|
||||||
<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)]">
|
align?: 'start' | 'center';
|
||||||
<p className="px-8 text-xs font-semibold uppercase tracking-[0.35em] text-white/70 sm:text-sm">
|
className?: string;
|
||||||
Scroll triggered animation · Work in progress...
|
};
|
||||||
</p>
|
|
||||||
</div>
|
const SectionTag = ({ label, align = 'start', className }: SectionTagProps) => (
|
||||||
{/* Button below animation card */}
|
<div
|
||||||
{showButton && buttonLink && (
|
className={cn(
|
||||||
<div className="flex justify-center">
|
'flex items-center gap-4 text-xs font-semibold uppercase tracking-[0.4em] text-white',
|
||||||
{buttonLink.startsWith('http') ? (
|
align === 'center' ? 'justify-center' : 'justify-start',
|
||||||
<a
|
className
|
||||||
href={buttonLink}
|
)}
|
||||||
target="_blank"
|
>
|
||||||
rel="noopener noreferrer"
|
<span
|
||||||
className={cn(buttonBaseClass, 'px-5 py-2 font-bold')}
|
aria-hidden="true"
|
||||||
>
|
className={cn(
|
||||||
{buttonText}
|
'hidden h-px w-16 bg-gradient-to-r from-transparent via-brand-500/40 to-brand-300/70 sm:block',
|
||||||
</a>
|
align === 'start' && 'opacity-70'
|
||||||
) : (
|
)}
|
||||||
<button
|
/>
|
||||||
type="button"
|
<span className="text-center sm:text-left">{label}</span>
|
||||||
onClick={() => navigate(buttonLink)}
|
<span
|
||||||
className={cn(buttonBaseClass, 'px-5 py-2 font-bold')}
|
aria-hidden="true"
|
||||||
>
|
className={cn(
|
||||||
{buttonText}
|
'hidden h-px w-16 bg-gradient-to-l from-transparent via-brand-500/40 to-brand-300/70 sm:block',
|
||||||
</button>
|
align === 'start' && 'opacity-40'
|
||||||
)}
|
)}
|
||||||
</div>
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
type Feature = {
|
||||||
|
heading: [string, string];
|
||||||
|
detail: string;
|
||||||
|
icon: LucideIcon;
|
||||||
|
accent: string;
|
||||||
|
accentSoft: string;
|
||||||
|
accentGlow: string;
|
||||||
|
emphasis?: 'hero';
|
||||||
|
};
|
||||||
|
|
||||||
|
type FeatureCardProps = {
|
||||||
|
feature: Feature;
|
||||||
|
};
|
||||||
|
|
||||||
|
const FeatureCard = ({ feature }: FeatureCardProps) => {
|
||||||
|
const Icon = feature.icon;
|
||||||
|
const variant = feature.emphasis === 'hero' ? 'hero' : 'standard';
|
||||||
|
|
||||||
|
const featureStyles = {
|
||||||
|
'--feature-accent': feature.accent,
|
||||||
|
'--feature-accent-soft': feature.accentSoft,
|
||||||
|
'--feature-accent-glow': feature.accentGlow,
|
||||||
|
} as CSSProperties;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<article
|
||||||
|
className={cn(
|
||||||
|
'group relative flex h-full flex-col justify-between overflow-hidden rounded-3xl border border-white/10 bg-white/[0.03] p-6 sm:p-7 [box-shadow:0_26px_55px_rgba(8,9,21,0.35)] backdrop-blur-[30px] transition-all duration-500 hover:-translate-y-1.5 hover:bg-white/[0.05]',
|
||||||
|
'group-hover:border-[color:var(--feature-accent-soft)] group-hover:[box-shadow:0_32px_80px_var(--feature-accent-glow)]',
|
||||||
|
variant === 'hero' && 'sm:p-9 lg:p-10 hover:-translate-y-2'
|
||||||
|
)}
|
||||||
|
style={featureStyles}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-500 group-hover:opacity-100"
|
||||||
|
style={{
|
||||||
|
background: 'linear-gradient(140deg, var(--feature-accent-soft) 0%, rgba(5,7,18,0) 65%)',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="relative flex flex-1 flex-col gap-6">
|
||||||
|
<div className="flex items-start gap-4">
|
||||||
|
<span
|
||||||
|
className={cn(
|
||||||
|
'relative flex h-12 w-12 items-center justify-center rounded-2xl border border-white/15 bg-[#0d1126] text-white transition-transform duration-500 group-hover:scale-[1.05]',
|
||||||
|
variant === 'hero' && 'h-14 w-14 rounded-3xl'
|
||||||
)}
|
)}
|
||||||
</div>
|
style={{
|
||||||
<div className="mt-auto flex items-center gap-3 pb-12 text-xs uppercase tracking-[0.3em] text-white sm:pb-16">
|
borderColor: 'var(--feature-accent-soft)',
|
||||||
<span>Keep scrolling</span>
|
background:
|
||||||
<ChevronsDown className="h-4 w-4 text-white animate-bounce" aria-hidden="true" />
|
'linear-gradient(135deg, rgba(14,18,38,0.85) 0%, rgba(8,10,26,0.6) 60%)',
|
||||||
|
boxShadow: '0 18px 45px var(--feature-accent-glow)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className="pointer-events-none absolute inset-0 rounded-[inherit] opacity-40 mix-blend-screen transition-opacity duration-500 group-hover:opacity-100"
|
||||||
|
style={{
|
||||||
|
background:
|
||||||
|
'radial-gradient(circle at 30% 30%, var(--feature-accent) 0%, rgba(12,14,30,0) 65%)',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Icon
|
||||||
|
className={cn('relative h-5 w-5', variant === 'hero' && 'h-6 w-6')}
|
||||||
|
style={{ color: 'var(--feature-accent)' }}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
<h3
|
||||||
|
className={cn(
|
||||||
|
'font-semibold text-white leading-tight',
|
||||||
|
variant === 'hero' ? 'text-xl sm:text-2xl' : 'text-lg sm:text-xl'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{feature.heading.map((line) => (
|
||||||
|
<span key={line} className="block">
|
||||||
|
{line}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
className={cn(
|
||||||
|
'block h-px w-full rounded-full transition-opacity duration-500',
|
||||||
|
variant === 'hero' ? 'opacity-70' : 'opacity-50',
|
||||||
|
'group-hover:opacity-100'
|
||||||
|
)}
|
||||||
|
style={{
|
||||||
|
background:
|
||||||
|
'linear-gradient(90deg, rgba(12,14,34,0), var(--feature-accent), rgba(12,14,34,0))',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<p
|
||||||
|
className={cn(
|
||||||
|
'text-sm leading-relaxed text-white/70 sm:text-base',
|
||||||
|
variant === 'hero' && 'text-base sm:text-lg text-white/80'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{feature.detail}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const DatacenterSlide = () => (
|
||||||
|
<section
|
||||||
|
id="datacenter-economy"
|
||||||
|
className={cn(
|
||||||
|
baseSectionClass,
|
||||||
|
'bg-gradient-to-br from-[#050611] via-[#03030c] to-black'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="pointer-events-none absolute inset-0">
|
||||||
|
<div className="absolute left-[-8rem] top-[18%] h-80 w-80 rounded-full bg-[#5a6cf0]/15 blur-3xl" />
|
||||||
|
<div className="absolute right-[-6rem] bottom-[-8rem] h-[22rem] w-[22rem] rounded-full bg-[#2f3c96]/18 blur-3xl" />
|
||||||
|
</div>
|
||||||
|
<motion.div
|
||||||
|
{...slideMotion}
|
||||||
|
className={cn(
|
||||||
|
baseContainerClass,
|
||||||
|
'lg:grid lg:grid-cols-[minmax(0,6fr)_minmax(0,5fr)] lg:items-center lg:gap-16'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="space-y-6">
|
||||||
|
<SectionTag label="THE DATACENTER ECONOMY" />
|
||||||
|
<h2 className="text-4xl font-semibold leading-tight text-white sm:text-5xl">
|
||||||
|
The Cloud, Decentralized.
|
||||||
|
</h2>
|
||||||
|
<div className="space-y-5">
|
||||||
|
<p className={paragraphClass}>
|
||||||
|
GeoMind brings together next-generation hardware and an autonomous AI cloud stack to make
|
||||||
|
deploying and operating your own datacenter effortless. Open, local, and profitable by
|
||||||
|
design.
|
||||||
|
</p>
|
||||||
|
<p className={paragraphClass}>
|
||||||
|
Built for energy providers, telcos, and governments ready to own their infrastructure and
|
||||||
|
reclaim data sovereignty — creating the foundation for a new, self-sustaining digital
|
||||||
|
economy.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="relative hidden h-full items-center justify-center lg:flex">
|
||||||
|
<div className="relative w-full max-w-md rounded-[2.5rem] border border-white/10 bg-white/[0.04] p-10 backdrop-blur-sm">
|
||||||
|
<div className="absolute inset-0 rounded-[2.5rem] bg-gradient-to-br from-white/10 to-white/0 opacity-60" />
|
||||||
|
<div className="relative flex h-full w-full flex-col items-center justify-center gap-6 text-center">
|
||||||
|
<span className="text-xs uppercase tracking-[0.35em] text-white/50">
|
||||||
|
Visualization Placeholder
|
||||||
|
</span>
|
||||||
|
<div className="flex h-28 w-full items-center justify-center rounded-2xl border border-white/10 bg-black/40">
|
||||||
|
<span className="text-[10px] uppercase tracking-[0.4em] text-white/40">
|
||||||
|
Immersive canvas coming soon
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</motion.div>
|
||||||
);
|
</section>
|
||||||
};
|
);
|
||||||
|
|
||||||
|
const DeploymentSlide = () => (
|
||||||
|
<section
|
||||||
|
id="deployment-tiers"
|
||||||
|
className={cn(
|
||||||
|
baseSectionClass,
|
||||||
|
'bg-gradient-to-br from-[#03050d] via-[#050312] to-[#0a0618]'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="pointer-events-none absolute inset-0">
|
||||||
|
<div className="absolute right-1/4 top-[-6rem] h-64 w-64 rounded-full bg-[#8b6bff]/15 blur-3xl" />
|
||||||
|
<div className="absolute left-[-4rem] bottom-[-6rem] h-72 w-72 rounded-full bg-[#2b356f]/25 blur-3xl" />
|
||||||
|
</div>
|
||||||
|
<motion.div
|
||||||
|
{...slideMotion}
|
||||||
|
className={cn(
|
||||||
|
baseContainerClass,
|
||||||
|
'lg:grid lg:grid-cols-[minmax(0,5fr)_minmax(0,6fr)] lg:items-start lg:gap-16'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="space-y-6">
|
||||||
|
<SectionTag label="DEPLOYMENT TIERS" />
|
||||||
|
<h2 className="text-3xl font-semibold leading-tight text-white sm:text-4xl lg:text-[2.5rem]">
|
||||||
|
Two Forms of Autonomy. One Sovereign Cloud.
|
||||||
|
</h2>
|
||||||
|
<p className={paragraphClass}>
|
||||||
|
Whatever your footprint, GeoMind lets you build and control digital infrastructure on your
|
||||||
|
own terms.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid gap-6 sm:grid-cols-2">
|
||||||
|
<TierCard
|
||||||
|
image={{
|
||||||
|
primary: '/images/tier-s.png',
|
||||||
|
fallback: '/images/tier-s.jpeg',
|
||||||
|
alt: 'Tier-S autonomous datacenter',
|
||||||
|
}}
|
||||||
|
lines={[
|
||||||
|
'Tier-S — Power redefined.',
|
||||||
|
'A liquid-cooled, high-density autonomous datacenter built for unmatched performance and endurance.',
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<TierCard
|
||||||
|
image={{
|
||||||
|
primary: '/images/node.png',
|
||||||
|
alt: 'Tier-H distributed edge node',
|
||||||
|
}}
|
||||||
|
lines={[
|
||||||
|
'Tier-H — Intelligence everywhere.',
|
||||||
|
'A distributed, autonomous edge system that brings cloud power closer to people, cities, and life itself.',
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
|
||||||
|
const MarketplaceSlide = () => (
|
||||||
|
<section
|
||||||
|
id="the-marketplace"
|
||||||
|
className={cn(
|
||||||
|
baseSectionClass,
|
||||||
|
'bg-gradient-to-br from-[#04040c] via-[#050819] to-[#060a1f]'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="pointer-events-none absolute inset-0">
|
||||||
|
<div className="absolute left-[-6rem] top-[-6rem] h-64 w-64 rounded-full bg-[#4d81ff]/20 blur-3xl" />
|
||||||
|
<div className="absolute right-[-4rem] bottom-[-6rem] h-72 w-72 rounded-full bg-[#2e395f]/26 blur-3xl" />
|
||||||
|
</div>
|
||||||
|
<motion.div
|
||||||
|
{...slideMotion}
|
||||||
|
className={cn(
|
||||||
|
baseContainerClass,
|
||||||
|
'lg:grid lg:grid-cols-[minmax(0,6fr)_minmax(0,5fr)] lg:items-center lg:gap-16'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="space-y-6">
|
||||||
|
<SectionTag label="THE MARKETPLACE" />
|
||||||
|
<h2 className="text-4xl font-semibold leading-tight text-white sm:text-5xl">
|
||||||
|
Autonomy that pays back.
|
||||||
|
</h2>
|
||||||
|
<div className="space-y-5">
|
||||||
|
<p className={paragraphClass}>
|
||||||
|
GeoMind doesn’t just let you deploy your own sovereign cloud, it gives you a way to earn
|
||||||
|
from it.
|
||||||
|
</p>
|
||||||
|
<p className={paragraphClass}>
|
||||||
|
Access a global marketplace where excess compute, storage, and bandwidth become revenue,
|
||||||
|
all while you stay fully in control of your infrastructure and data.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="relative mt-6 space-y-6 overflow-hidden rounded-[2.5rem] border border-white/10 bg-white/[0.03] p-8 lg:mt-0">
|
||||||
|
<div className="absolute inset-x-0 top-0 h-1/2 rounded-[2.5rem] bg-gradient-to-b from-white/10 via-white/0 to-transparent" />
|
||||||
|
<div className="relative flex flex-col gap-4">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span className="text-xs uppercase tracking-[0.35em] text-white/50">
|
||||||
|
Marketplace Flow Placeholder
|
||||||
|
</span>
|
||||||
|
<span className="text-xs text-white/40">Pending visual</span>
|
||||||
|
</div>
|
||||||
|
<div className="grid gap-3 text-sm text-white/70">
|
||||||
|
<div className="flex items-center justify-between rounded-2xl border border-white/5 bg-black/40 px-4 py-3">
|
||||||
|
<span>Compute</span>
|
||||||
|
<span className="text-white/80">•</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between rounded-2xl border border-white/5 bg-black/40 px-4 py-3">
|
||||||
|
<span>Storage</span>
|
||||||
|
<span className="text-white/80">•</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between rounded-2xl border border-white/5 bg-black/40 px-4 py-3">
|
||||||
|
<span>Bandwidth</span>
|
||||||
|
<span className="text-white/80">•</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
|
||||||
|
const features: Feature[] = [
|
||||||
|
{
|
||||||
|
heading: ['True Sovereign', 'Cloud'],
|
||||||
|
detail:
|
||||||
|
'All GPU/compute/storage/network capabilities delivered locally under your control. No vendor lock-in. No intermediaries.',
|
||||||
|
icon: CloudCog,
|
||||||
|
accent: '#60a5fa',
|
||||||
|
accentSoft: 'rgba(96, 165, 250, 0.22)',
|
||||||
|
accentGlow: 'rgba(96, 165, 250, 0.45)',
|
||||||
|
emphasis: 'hero',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: ['Autonomous', 'Operation'],
|
||||||
|
detail:
|
||||||
|
'Self-driving, self-healing infrastructure that deploys, optimizes, and maintains itself—autonomy as a service.',
|
||||||
|
icon: Bot,
|
||||||
|
accent: '#a855f7',
|
||||||
|
accentSoft: 'rgba(168, 85, 247, 0.24)',
|
||||||
|
accentGlow: 'rgba(168, 85, 247, 0.45)',
|
||||||
|
emphasis: 'hero',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: ['Energy', 'Sustainability'],
|
||||||
|
detail:
|
||||||
|
'Up to 3× more energy-efficient for AI/compute and up to 10× for storage, driven by intelligent power orchestration, heat reuse, and localized workloads.',
|
||||||
|
icon: BatteryCharging,
|
||||||
|
accent: '#34d399',
|
||||||
|
accentSoft: 'rgba(52, 211, 153, 0.24)',
|
||||||
|
accentGlow: 'rgba(52, 211, 153, 0.42)',
|
||||||
|
emphasis: 'hero',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: ['Radical Cost', 'Advantage'],
|
||||||
|
detail:
|
||||||
|
'Up to 7× more affordable by eliminating hyperscaler overhead and monetizing idle capacity.',
|
||||||
|
icon: Coins,
|
||||||
|
accent: '#fbbf24',
|
||||||
|
accentSoft: 'rgba(251, 191, 36, 0.26)',
|
||||||
|
accentGlow: 'rgba(251, 191, 36, 0.42)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: ['Uncompromising', 'Security'],
|
||||||
|
detail:
|
||||||
|
'Encrypted, isolated, and pre-deterministic—from silicon to software—for enterprise and nation-grade assurance.',
|
||||||
|
icon: ShieldCheck,
|
||||||
|
accent: '#818cf8',
|
||||||
|
accentSoft: 'rgba(129, 140, 248, 0.24)',
|
||||||
|
accentGlow: 'rgba(129, 140, 248, 0.45)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: ['Scalable by', 'Nature'],
|
||||||
|
detail:
|
||||||
|
'From edge nodes to sovereign cloud networks—modular, rapidly deployable, and orchestrated as one fabric.',
|
||||||
|
icon: Network,
|
||||||
|
accent: '#f472b6',
|
||||||
|
accentSoft: 'rgba(244, 114, 182, 0.24)',
|
||||||
|
accentGlow: 'rgba(244, 114, 182, 0.42)',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const FeaturesSlide = () => (
|
||||||
|
<section
|
||||||
|
id="the-features"
|
||||||
|
className={cn(
|
||||||
|
baseSectionClass,
|
||||||
|
'bg-gradient-to-br from-[#05060f] via-[#03040b] to-black'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="pointer-events-none absolute inset-0">
|
||||||
|
<div className="absolute left-1/2 top-[-10rem] h-[26rem] w-[26rem] -translate-x-1/2 rounded-full bg-[#4a5dd9]/14 blur-3xl" />
|
||||||
|
<div className="absolute right-[-8rem] bottom-[-4rem] h-72 w-72 rounded-full bg-[#1e233d]/35 blur-3xl" />
|
||||||
|
</div>
|
||||||
|
<motion.div
|
||||||
|
{...slideMotion}
|
||||||
|
className={cn(baseContainerClass, 'items-stretch gap-12')}
|
||||||
|
>
|
||||||
|
<div className="flex justify-center">
|
||||||
|
<SectionTag label="THE FEATURES" align="center" />
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 gap-5 sm:gap-6 md:[grid-template-columns:repeat(auto-fit,minmax(320px,1fr))] md:auto-rows-[minmax(280px,auto)]">
|
||||||
|
{features.map((feature) => (
|
||||||
|
<FeatureCard key={feature.heading.join('-')} feature={feature} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const ScrollLockedSection = () => (
|
||||||
|
<>
|
||||||
|
<DatacenterSlide />
|
||||||
|
<DeploymentSlide />
|
||||||
|
<MarketplaceSlide />
|
||||||
|
<FeaturesSlide />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
@@ -1,26 +1,26 @@
|
|||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
import { Store, Coins, Cpu, Handshake } from 'lucide-react';
|
import { Globe, Coins, Zap, ShieldCheck } from 'lucide-react';
|
||||||
|
|
||||||
const benefits = [
|
const benefits = [
|
||||||
{
|
{
|
||||||
title: 'Free to List',
|
title: 'Open access',
|
||||||
description: 'Join the marketplace at no cost and showcase available cloud units instantly.',
|
description: 'List available capacity instantly and reach verified global buyers.',
|
||||||
icon: Store,
|
icon: Globe,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Earn from Idle Capacity',
|
title: 'Earn from excess',
|
||||||
description: 'Sell unused compute cycles to AI teams and turn sunk costs into recurring revenue.',
|
description: 'Monetize idle compute, storage, and bandwidth.',
|
||||||
icon: Coins,
|
icon: Coins,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Capacity on Demand',
|
title: 'On-demand scaling',
|
||||||
description: 'Tap trusted nodes across the network when workloads spike so you always have extra capacity when you need it.',
|
description: 'Access additional nodes when workloads surge.',
|
||||||
icon: Cpu,
|
icon: Zap,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Trusted Settlements',
|
title: 'Trusted ecosystem',
|
||||||
description: 'Automated contracts and clear payouts keep every transaction compliant and transparent.',
|
description: 'Verified participants, transparent contracts, and secure settlements.',
|
||||||
icon: Handshake,
|
icon: ShieldCheck,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -42,12 +42,11 @@ export const TechnologicalBenefits = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</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
|
Turn Infrastructure Into Income.
|
||||||
</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 Marketplace is a free exchange for cloud units. Operators list spare capacity,
|
The GeoMind Marketplace connects operators with global demand for compute, storage, and GPU capacity.
|
||||||
buyers tap verified resources, and everyone earns. Let your AI infrastructure fund itself
|
Sell your unused resources, tap additional capacity on demand, and transform infrastructure from a cost center into a profit center.
|
||||||
as unused workloads convert into new revenue streams.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
|
<div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
|
||||||
|
@@ -19,27 +19,31 @@ type Tab = {
|
|||||||
const tabs: Tab[] = [
|
const tabs: Tab[] = [
|
||||||
{
|
{
|
||||||
id: 'zero-os',
|
id: 'zero-os',
|
||||||
label: 'Zero-OS',
|
label: 'Mycelium OS',
|
||||||
title: 'Zero-OS',
|
title: 'Mycelium OS',
|
||||||
description:
|
description:
|
||||||
'Minimal, self-healing bare-metal OS that powers autonomous nodes across the ThreeFold Grid.',
|
'Autonomous. Secure. Efficient. A bare-metal operating system that runs infrastructure directly on hardware — no hypervisors, no drift, no manual management. It boots from a verified state, locks the system, and connects to the Mycelium network as a permanent, self-managing node.',
|
||||||
cardText: 'Stateless architecture ensures every boot is secure and unmodified, eliminating configuration drift and security vulnerabilities.',
|
cardText: 'A bare-metal operating system that runs infrastructure directly on hardware with hardware-level security and self-driving operation.',
|
||||||
bullets: [
|
bullets: [
|
||||||
{
|
{
|
||||||
heading: 'Immutable by Design',
|
heading: 'Hardware-level security',
|
||||||
body: 'Boots statelessly from a signed image each time, removing drift and shrinking the attack surface.',
|
body: 'The system is sealed after boot, isolating it from external access.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Autonomous Operations',
|
heading: 'Self-driving operation',
|
||||||
body: 'Digital twin controllers redeploy workloads to healthy nodes and roll out updates with zero downtime.',
|
body: 'Provisions, repairs, and optimizes itself automatically.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Zero-Trust Networking',
|
heading: 'Bare-metal performance',
|
||||||
body: 'Integrated WireGuard overlay and cryptographic identities secure every peer-to-peer connection.',
|
body: 'Maximum efficiency, zero virtualization overhead.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Unified Resource Fabric',
|
heading: 'Energy-smart design',
|
||||||
body: 'Exposes compute, storage, and network primitives through a single API for edge, datacenter, or hybrid deployments.',
|
body: 'Powers down when idle, extending hardware life and cutting waste.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Network-native',
|
||||||
|
body: 'Integrates seamlessly into the encrypted Mycelium mesh for instant connectivity.',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -47,50 +51,53 @@ const tabs: Tab[] = [
|
|||||||
id: 'compute',
|
id: 'compute',
|
||||||
label: 'Compute',
|
label: 'Compute',
|
||||||
title: 'Compute',
|
title: 'Compute',
|
||||||
description: 'A self-healing compute fabric designed for resilience, decentralization, and scale.',
|
description: 'Predictable. Compatible. Free from lock-in. Deploy any workload exactly where you want it—with full control over hardware, policy, and cost. Fully compatible with Kubernetes, Docker, and micro-VMs; if it runs on Linux, it runs on Mycelium.',
|
||||||
cardText: 'Autonomous workload orchestration across distributed nodes ensures maximum uptime and performance.',
|
cardText: 'Deploy any workload exactly where you want it—with full control over hardware, policy, and cost.',
|
||||||
bullets: [
|
bullets: [
|
||||||
{
|
{
|
||||||
heading: 'Autonomous Workload Management',
|
heading: 'Pre-deterministic control',
|
||||||
body: 'Workloads automatically migrate to healthy nodes to ensure fault tolerance and high availability.',
|
body: 'Know precisely where workloads run and under what conditions.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'AI & Web3 Ready',
|
heading: 'Full compatibility',
|
||||||
body: 'Run LLMs, autonomous agents, blockchain nodes, and immersive metaverse apps at the edge.',
|
body: 'Supports major cloud-native frameworks out of the box.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Zero-OS (ZOS)',
|
heading: 'Universal workloads',
|
||||||
body: 'Our custom-built, stateless, immutable OS that powers:',
|
body: 'From AI to enterprise apps, deploy seamlessly anywhere.',
|
||||||
subpoints: [
|
|
||||||
'MicroVMs & containerized environments (Kubernetes, Docker, Firecracker).',
|
|
||||||
'AI inference and training workloads.',
|
|
||||||
'Web3 infrastructure and federated learning models.',
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'No Hyperscalers',
|
heading: 'Transparent economics',
|
||||||
body: 'Fully independent infrastructure managed by intelligent agents on bare metal.',
|
body: 'Pay-as-you-go, no lock-in, always efficient.',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'data',
|
id: 'data',
|
||||||
label: 'Data',
|
label: 'Storage',
|
||||||
title: 'Data',
|
title: 'Storage',
|
||||||
description: 'Private, distributed, and AI-native storage with user sovereignty at its core.',
|
description: 'Private. Efficient. Interoperable. Mycelium Storage keeps data where it belongs—under your control. Encrypted, distributed, and locality-aware, it delivers fast, compliant, and sustainable data management across regions and clouds.',
|
||||||
cardText: 'Quantum-safe encryption and distributed redundancy protect your data while maintaining lightning-fast access.',
|
cardText: 'Mycelium Storage keeps data where it belongs—under your control with quantum-safe encryption.',
|
||||||
bullets: [
|
bullets: [
|
||||||
{
|
{
|
||||||
heading: 'Privacy-First',
|
heading: 'Quantum-safe design',
|
||||||
body: 'End-to-end encryption and redundancy, with no central control.',
|
body: 'Secured in use, in transit, and at rest against next-generation threats.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: '10x Efficient',
|
heading: 'Geo-aware',
|
||||||
body: 'Optimized for performance and sustainability, far surpassing traditional cloud.',
|
body: 'Data stays within chosen jurisdictions to meet sovereignty and compliance needs.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Geo-Aware & Compliant',
|
heading: 'Energy-efficient',
|
||||||
body: "Data stays where it's supposed to, satisfying regional policies and privacy standards.",
|
body: 'Erasure coding and smart replication cut storage bloat and power use.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Open protocols',
|
||||||
|
body: 'Compatible with S3, IPFS, NFS, and other industry standards.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Unified control',
|
||||||
|
body: 'Manage storage from edge to core through a single interface.',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -99,51 +106,59 @@ const tabs: Tab[] = [
|
|||||||
label: 'Network',
|
label: 'Network',
|
||||||
title: 'Network',
|
title: 'Network',
|
||||||
description:
|
description:
|
||||||
'A secure, peer-to-peer internet backbone, self-sustaining, censorship-resistant, and optimized for performance.',
|
'Sovereign. Secure. Resilient. Mycelium Network forms a cryptographically verified mesh that connects every node, datacenter, and user into one sovereign backbone. It ensures private, reliable, and compliant connectivity across borders — built for a world where resilience and control matter more than ever.',
|
||||||
cardText: 'Mesh topology with intelligent routing creates a resilient network that adapts to changing conditions.',
|
cardText: 'Mycelium Network forms a cryptographically verified mesh that connects every node into one sovereign backbone.',
|
||||||
bullets: [
|
bullets: [
|
||||||
{
|
{
|
||||||
heading: 'End-to-End Encryption',
|
heading: 'End-to-end encrypted mesh',
|
||||||
body: 'All communications are secured by design.',
|
body: 'Private IPv6 overlay with identity-bound nodes and no intermediaries.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Shortest-Path Routing',
|
heading: 'Shortest-path routing',
|
||||||
body: 'Dynamically finds the most efficient path across the network, reducing latency and cost.',
|
body: 'Dynamically connects peers through the most direct verified route.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'No Middlemen',
|
heading: 'Self-healing connectivity',
|
||||||
body: 'Fully peer-to-peer, removing reliance on centralized ISPs or DNS providers.',
|
body: 'Automatically restores links when paths degrade or fail.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Censorship Resistance',
|
heading: 'Integrated name service',
|
||||||
body: 'Built to thrive under pressure, even in restricted or controlled regions.',
|
body: 'Gateways handle DNS and content delivery within the mesh.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Policy-aware by design',
|
||||||
|
body: 'Data stays within chosen jurisdictions for full sovereignty.',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'gpu',
|
id: 'gpu',
|
||||||
label: 'GPU Fabric',
|
label: 'GPU Fabric',
|
||||||
title: 'Distributed GPU Fabric',
|
title: 'GPU Fabric',
|
||||||
description:
|
description:
|
||||||
'A sovereign mesh of GPU capacity that turns idle silicon into revenue while powering global AI workloads and collective intelligence.',
|
'Intelligent. Scalable. Sovereign. A distributed GPU network that runs AI and rendering workloads closer to data—improving latency, utilization, and control.',
|
||||||
cardText:
|
cardText:
|
||||||
'Autonomous allocation keeps GPUs saturated with high-value workloads, creating a lucrative marketplace for operators and builders alike.',
|
'A distributed GPU network that runs AI and rendering workloads closer to data—improving latency, utilization, and control.',
|
||||||
bullets: [
|
bullets: [
|
||||||
{
|
{
|
||||||
heading: 'Global GPU Federation',
|
heading: 'Federated architecture',
|
||||||
body: 'Aggregates GPUs across homes, enterprises, and datacenters into a single pool so large-scale training and inference run close to data without hyperscaler dependence.',
|
body: 'Securely aggregates and manages GPU capacity across datacenters and edge nodes.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Revenue Engine',
|
heading: 'AI-driven orchestration',
|
||||||
body: 'Dynamic marketplace routes AI and rendering jobs to available GPUs, maximizing utilization and delivering steady cash flow to operators.',
|
body: 'Agents route workloads dynamically for peak performance and zero idle time.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Sovereign Collective Intelligence',
|
heading: 'Open ecosystem',
|
||||||
body: 'Supports collaborative model training where communities contribute data and capacity, unlocking responsible AI networks governed by their stakeholders.',
|
body: 'Pre-integrated open-source LLMs, databases, and developer tools for instant AI deployment.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'Zero-OS Integration',
|
heading: 'Local and sovereign',
|
||||||
body: 'Zero-OS provisions GPU-optimized microVMs with secure drivers, ensuring deterministic performance and remote attestation of every workload.',
|
body: 'Inference and training stay within borders, under your governance.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Transparent economics',
|
||||||
|
body: 'Pay-per-use, no vendor lock-in, full ownership of data and outcomes.',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@@ -5,13 +5,13 @@ const stackItems = [
|
|||||||
title: 'Tier S Datacenters',
|
title: 'Tier S Datacenters',
|
||||||
image: '/images/tiers.png',
|
image: '/images/tiers.png',
|
||||||
description:
|
description:
|
||||||
'Strategically deployed, containerized datacenters built for autonomy and resilience. Self-healing infrastructure that runs AI & cloud workloads at the edge while delivering up to 3x lower energy use, improved security, and significantly higher ROI.',
|
'High-density, liquid-cooled autonomous datacenters engineered for sustained performance and efficiency. The optimal backbone for national platforms and enterprise workloads, delivering higher ROI with up to 3× lower energy use and a dramatically smaller carbon footprint than hyperscalers.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Tier H Datacenters',
|
title: 'Tier H Datacenters',
|
||||||
image: '/images/tierh.png',
|
image: '/images/tierh.png',
|
||||||
description:
|
description:
|
||||||
'Lightweight edge nodes for homes, offices, and campuses that turn properties into secure, reward-earning contributors to global infrastructure. Easy to deploy and manage, designed for planetary-scale rollout without requiring specialist technical skills.',
|
'Distributed, self-managing edge nodes that bring compute and storage closer to users. No cooling required, minimal power draw, and seamless scalability — cutting capex and opex while supporting ESG goals through localized, energy-efficient infrastructure.',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -37,8 +37,10 @@ export const TechnologyStack = () => {
|
|||||||
An Infrastructure Built for the AI Era
|
An Infrastructure Built for the AI Era
|
||||||
</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">
|
||||||
Our unique technology stack delivers unmatched security, scalability, and flexibility,
|
GeoMind’s hardware ecosystem empowers businesses and countries to build, operate, and scale sovereign AI infrastructure within their own borders.
|
||||||
preparing you for the AI workforce of the future.
|
Secure, local, and energy-efficient by design, it delivers the performance and autonomy needed to power the AI workforce of the future.
|
||||||
|
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-12 grid gap-6 lg:grid-cols-2">
|
<div className="mt-12 grid gap-6 lg:grid-cols-2">
|
||||||
|
@@ -7,14 +7,14 @@ import ContactForm from '../../../components/ui/ContactForm';
|
|||||||
const useCases = [
|
const useCases = [
|
||||||
{
|
{
|
||||||
title: 'Project Mycelium',
|
title: 'Project Mycelium',
|
||||||
highlight: 'Decentralized Core',
|
highlight: 'Decentralized Tools',
|
||||||
description:
|
description:
|
||||||
'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.',
|
'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: 'Digital Free Zone',
|
title: 'Digital Free Zone',
|
||||||
highlight: 'Sovereign Innovation',
|
highlight: 'Sovereign Innovation Zone',
|
||||||
description:
|
description:
|
||||||
'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.',
|
'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',
|
||||||
|
@@ -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', 'reasonedly-avifaunal-wanda.ngrok-free.dev'],
|
allowedHosts: ['coucha-royal-nontannic.ngrok-free.dev', 'reasonedly-avifaunal-wanda.ngrok-free.dev', 'unattributive-evia-inanimately.ngrok-free.dev'],
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user