'use client' import { Fragment, useEffect, useRef, useState } from 'react' import { Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react' import clsx from 'clsx' import { type MotionProps, type Variant, AnimatePresence, motion, } from 'framer-motion' import { useDebouncedCallback } from 'use-debounce' import { Eyebrow, FeatureDescription, FeatureTitle, MobileFeatureTitle, P, SectionHeader, } from '@/components/Texts' import { Container } from '@/components/Container' import reservenodeimg from '/images/cloud/reserve.png' import billingImg from '/images/cloud/billing.png' import kubeconfigImg from '/images/cloud/kubeconfig.png' /* Feature Data */ const features = [ { name: 'Decentralized Kubernetes', description: "Reserve a node and deploy sovereign Kubernetes clusters on decentralized infrastructure.", screen: () => ( ), }, { name: 'Manage Your Cluster', description: 'Manage your cluster with ease, with a simple and intuitive interface.', screen: () => ( ), }, { name: 'Personalised Billings & Accounts', description: 'Easily manage your cluster billing and accounts with personalised configurations.', screen: () => ( ), }, ] interface CustomAnimationProps { isForwards: boolean changeCount: number } const maxZIndex = 2147483647 const bodyVariantBackwards: Variant = { opacity: 0.4, scale: 0.8, zIndex: 0, filter: 'blur(4px)', transition: { duration: 0.4 }, } const bodyAnimation: MotionProps = { initial: 'initial', animate: 'animate', exit: 'exit', variants: { initial: (custom: CustomAnimationProps) => custom.isForwards ? { y: '100%', zIndex: maxZIndex - custom.changeCount, transition: { duration: 0.4 }, } : bodyVariantBackwards, animate: (custom: CustomAnimationProps) => ({ y: '0%', opacity: 1, scale: 1, zIndex: maxZIndex / 2 - custom.changeCount, filter: 'blur(0px)', transition: { duration: 0.4 }, }), exit: (custom: CustomAnimationProps) => custom.isForwards ? bodyVariantBackwards : { y: '100%', zIndex: maxZIndex - custom.changeCount, transition: { duration: 0.4 }, }, }, } function usePrevious(value: T) { const ref = useRef() useEffect(() => { ref.current = value }, [value]) return ref.current } /* Desktop Component */ function CloudFeaturesDesktop() { let [changeCount, setChangeCount] = useState(0) let [selectedIndex, setSelectedIndex] = useState(0) let prevIndex = usePrevious(selectedIndex) let isForwards = prevIndex === undefined ? true : selectedIndex > prevIndex let onChange = useDebouncedCallback( (selectedIndex: number) => { setSelectedIndex(selectedIndex) setChangeCount((changeCount) => changeCount + 1) }, 100, { leading: true }, ) return ( {features.map((feature, featureIndex) => (
{featureIndex === selectedIndex && ( )}
{feature.name} {feature.description}
))}
{features.map((feature, featureIndex) => selectedIndex === featureIndex ? ( ) : null, )}
) } /* Mobile Version */ function CloudFeaturesMobile() { return ( <>
{features.map((feature, i) => (
{feature.name} {feature.description}
))}
) } /* ✅ FINAL LIGHT MODE EXPORT — BOXED CONTAINER + BORDERS MATCHING CloudHeroNew */ export function CloudFeaturesLight() { return (
{/* ✅ Top horizontal line with spacing */}
{/* ✅ Boxed container (border-x only) */}
Platform Overview A Decentralized Cloud that Operates Itself

Mycelium Cloud runs Kubernetes on a sovereign, self-healing network with compute, storage, and networking built in — so you don’t need external cloud dependencies.

{/* ✅ Bottom horizontal line */}
{/* ✅ Bottom spacer matching hero */}
) }