{isInvestor ? "We've received your interest and will be in touch soon." : "We've received your message and will be in touch shortly."}
) : (
<>
{isInvestor ? "Investor Enquiry" : "Collaborate with us"}
{isInvestor ? "Tell us about yourself and we'll be in touch." : "Tell us about your idea and we'll get back to you."}
{status === "error" && (
{errMsg}
)}
>
)}
);
};
/* Section components for Herb Immortal homepage */
const Tag = ({ children }) => (
{children}
);
const SectionHead = ({ tag, num, children }) => null;
const Arrow = () => ;
// ----------------------------- Nav -----------------------------
const Nav = () => {
const [isScrolled, setIsScrolled] = React.useState(false);
const [isHidden, setIsHidden] = React.useState(false);
const lastScrollY = React.useRef(0);
const frame = React.useRef(0);
const [navModal, setNavModal] = React.useState(null);
const [menuOpen, setMenuOpen] = React.useState(false);
React.useEffect(() => {
// The ecosystem scene is a pinned, full-bleed stage; the bar floating over it
// fights the imagery, so it stays hidden there in both scroll directions.
//
// Its position is measured on resize and cached, never read during a scroll.
// Reading it per event meant a getBoundingClientRect() — a forced synchronous
// layout — on every frame Lenis emitted, interleaved with ScrollScene writing
// transforms in the same frame. That read/write thrash was the scroll jank.
// The scene's own height is set from JS, so a ResizeObserver keeps the cache
// honest without ever measuring mid-scroll.
const scene = document.getElementById("solutions");
let sceneTop = 0;
let sceneBottom = 0;
const measure = () => {
if (!scene) return;
const r = scene.getBoundingClientRect();
sceneTop = r.top + window.scrollY;
sceneBottom = sceneTop + r.height;
};
measure();
const ro = scene && "ResizeObserver" in window ? new ResizeObserver(measure) : null;
if (ro) ro.observe(scene);
const update = () => {
frame.current = 0;
const currentScrollY = window.scrollY;
setIsScrolled(currentScrollY > 24);
// Same test as before, from the cached box instead of a live measurement.
const overEcosystem =
!!scene &&
sceneTop - currentScrollY <= 8 &&
sceneBottom - currentScrollY >= window.innerHeight * 0.5;
// Hide on scroll down, show on scroll up — except over the ecosystem scene.
if (menuOpen) {
setIsHidden(false);
} else if (overEcosystem) {
setIsHidden(true);
} else {
// Smooth scrolling emits sub-pixel deltas, so an exact `>` comparison
// flip-flops on the tail of a flick and makes the bar flicker on the way
// back up. A few pixels of deadband keeps the direction unambiguous.
const delta = currentScrollY - lastScrollY.current;
if (Math.abs(delta) > 4) {
setIsHidden(currentScrollY > 150 && delta > 0);
lastScrollY.current = currentScrollY;
}
return;
}
lastScrollY.current = currentScrollY;
};
// One update per frame at most, on the frame the browser is about to paint.
const handleScroll = () => {
if (!frame.current) frame.current = requestAnimationFrame(update);
};
window.addEventListener("scroll", handleScroll, { passive: true });
window.addEventListener("resize", measure);
return () => {
if (frame.current) cancelAnimationFrame(frame.current);
frame.current = 0;
if (ro) ro.disconnect();
window.removeEventListener("scroll", handleScroll);
window.removeEventListener("resize", measure);
};
}, [menuOpen]);
React.useEffect(() => {
document.body.style.overflow = menuOpen ? "hidden" : "";
if (window.lenis) { menuOpen ? window.lenis.stop() : window.lenis.start(); }
return () => { document.body.style.overflow = ""; if (window.lenis) window.lenis.start(); };
}, [menuOpen]);
const closeMenu = () => setMenuOpen(false);
const NavTag = window.motion ? window.motion.nav : 'nav';
return (
<>
{navModal && setNavModal(null)} />}
The world's first unified platform for traditional wellness. We connect healers,
knowledge, and communities across every tradition, language, and border.
);
};
// ---------------------- Industry Gap ---------------------------
const IndustryGap = () => {
const gaps = [
{
n: "I",
t: "Discovery Gap",
b: "With no universal way to find trusted practitioners and products globally, every search starts from zero.",
m: "DISCOVERY GAP • GLOBAL DISCOVERY • PRACTITIONERS • VERIFIED PRODUCTS • ",
img: [
"https://images.unsplash.com/photo-1544367567-0f2fcb009e0b?q=80&w=400&auto=format&fit=crop",
"https://images.unsplash.com/photo-1512466699195-2d936166e5db?q=80&w=400&auto=format&fit=crop"
]
},
{
n: "II",
t: "Trust Gap",
b: "No consistent cross-region verification or quality standards. Trust is a question, not a feature.",
m: "TRUST GAP • VERIFICATION • CERTIFICATIONS • AUTHENTICITY • QUALITY STANDARDS • ",
img: [
"https://images.unsplash.com/photo-1579541592065-27a3c3e214d0?q=80&w=400&auto=format&fit=crop",
"https://images.unsplash.com/photo-1601758003122-53c40e686a19?q=80&w=400&auto=format&fit=crop"
]
},
{
n: "III",
t: "Access Gap",
b: "Knowledge remains locked in silos of books, lineages, and languages, rather than serving as a usable, queryable infrastructure.",
m: "ACCESS GAP • KNOWLEDGE • ANCIENT TEXTS • LANGUAGES • LIBRARIES • PRESERVATION • ",
img: [
"https://images.unsplash.com/photo-1532012197267-da84d127e765?q=80&w=400&auto=format&fit=crop",
"https://images.unsplash.com/photo-1507842217343-583bb7270b66?q=80&w=400&auto=format&fit=crop"
]
},
];
return (
The industry exists. The infrastructure does not.
Systems like Ayurveda, TCM, Unani, and Siddha represent the lived reality of billions.
Despite this immense scale, the industry still operates without a shared digital infrastructure.
Knowledge is fragmented. Trust standards are uneven. Access still depends on
geography and language. Herb Immortal is building the missing layer.
Global demand. Cultural momentum. AI readiness. All three are converging.
The missing piece has always been trusted, unified infrastructure.
Market
The global wellness economy is the fastest-growing slice of healthcare.
Users
People who already use traditional medicine as primary care.
Platforms
Only
Unified, cross-tradition, cross-border infrastructure. Just one.
Window
Now
AI maturity, mobile-first regions, and a global wellness shift are perfectly aligned.
Until now.
);
// ----------------------------- Image Strip --------------------
const ImageStripSection = () => ;
// ----------------------------- Vision ---------------------------
// Cinematic, scroll-driven "chapter" moment — pins the section, inverts the
// theme, drifts the headline, and reveals the botanical. Fully self-contained:
// scoped ScrollTriggers, gsap.matchMedia auto-cleanup, Lenis-compatible, and a
// reduced-motion / mobile fallback. Nothing here touches any other section.
const Vision = () => {
const rootRef = React.useRef(null);
// Clean light editorial section — the headline reveals via SplitText; no
// scroll-driven background inversion (kept the site white + green, not murky).
return (
A future where traditional wellness is easier to discover, easier to trust,
and easier to live. It must be affordable and accessible to everyone, every single day.
One Globe. One Vision. One Platform.
);
};
// --------------------------- Solutions --------------------------
// Deep-green anchor section: the section pins itself and the four pillar images
// stack full-bleed in the background (), each sliding up over the
// last while the one it covers eases back. The intro holds for the whole run and
// only the pillar's index/heading/body swaps, crossfading in place. Same on
// mobile — the stage is just a shorter viewport.
const Solutions = () => {
const rootRef = React.useRef(null);
const pillars = [
{ t: "Global Practitioner Network", b: "Connect with vetted traditional healers and certified clinics worldwide.", img: "assets/pillar_network.jpg" },
{ t: "Clinical Documentation", b: "Integrate historical texts with modern evidence-based research.", img: "assets/pillar_clinical.jpg" },
{ t: "Verified Botanicals", b: "Source authenticated medicinal plants and traceable formulations.", img: "assets/pillar_botanicals.jpg" },
{ t: "Unified Ecosystem", b: "A secure, decentralized ledger linking every facet of traditional medicine.", img: "assets/pillar_ecosystem.jpg" },
];
const total = String(pillars.length).padStart(2, "0");
return (
{pillars.map((it) => (
))}
{/* Swapping pillar copy on top, section intro anchoring the bottom. */}
{/* One grid cell for every step, so the block is as tall as the
tallest heading and the text crossfades in place. */}
Traditional medicine is not alternative. For billions of people around the world,
it is simply medicine. It is the care they grew up with. The wisdom passed through
families, communities, healers, and generations.
Yet this vast, living body of knowledge has no global home. No shared language.
No infrastructure that connects a healer in rural India with a seeker in Toronto.
We are building that home. Our goal is not to replace what exists, but to give it the
infrastructure it has always deserved.
The world's oldest healing systems deserve world-class digital infrastructure.
We are raising our first round. If you believe the world's oldest healing systems
deserve world-class digital infrastructure, we would love to hear from you.