forked from emre/www_projectmycelium_com
feat: restructure GPU page layout and simplify content presentation
- Reordered sections to improve information flow (Capabilities → Design → Architecture → Overview) - Simplified use cases and overview sections by removing redundant bullet points - Added new GpuCapabilities and GpuDesign components with cleaner, more focused messaging
This commit is contained in:
75
src/pages/gpu/GpuArchitectureArchive.tsx
Normal file
75
src/pages/gpu/GpuArchitectureArchive.tsx
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import { Container } from '../../components/Container'
|
||||||
|
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
|
||||||
|
|
||||||
|
const architectureSections = [
|
||||||
|
{
|
||||||
|
title: 'Distributed GPU Mesh',
|
||||||
|
description:
|
||||||
|
'A peer-to-peer fabric connects GPU nodes across the ThreeFold Grid, exposing them through the Mycelium network.',
|
||||||
|
bullets: [
|
||||||
|
'GPU nodes distributed globally for on-demand acceleration.',
|
||||||
|
'Mycelium network provides encrypted peer-to-peer connectivity.',
|
||||||
|
'Smart contract orchestration allocates and governs resources.',
|
||||||
|
'Real-time monitoring tracks utilization and health.',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Performance Characteristics',
|
||||||
|
description:
|
||||||
|
'Consistency and transparency are built into the fabric so workloads behave predictably anywhere on the planet.',
|
||||||
|
bullets: [
|
||||||
|
'Edge-to-core deployment flexibility for every workload profile.',
|
||||||
|
'Adaptive intelligence optimizes allocation automatically.',
|
||||||
|
'Deterministic performance guarantees availability when booked.',
|
||||||
|
'Transparent cost tracking for every GPU cycle consumed.',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export function GpuArchitectureArchive() {
|
||||||
|
return (
|
||||||
|
<section id="gpu-architecture" className="bg-white py-24 sm:py-32">
|
||||||
|
<Container>
|
||||||
|
<div className="mx-auto max-w-3xl text-center">
|
||||||
|
<Eyebrow>
|
||||||
|
Technical Architecture
|
||||||
|
</Eyebrow>
|
||||||
|
<SectionHeader as="h2" className="mt-6 text-gray-900">
|
||||||
|
A peer-to-peer mesh purpose-built for acceleration.
|
||||||
|
</SectionHeader>
|
||||||
|
<P className="mt-6 text-gray-600">
|
||||||
|
Mycelium GPU treats every node as part of a sovereign mesh. Encrypted
|
||||||
|
networking, smart contract orchestration, and transparent monitoring
|
||||||
|
ensure your workloads receive precisely the power they request.
|
||||||
|
</P>
|
||||||
|
</div>
|
||||||
|
<div className="mt-16 grid gap-8 lg:grid-cols-2">
|
||||||
|
{architectureSections.map((section) => (
|
||||||
|
<div
|
||||||
|
key={section.title}
|
||||||
|
className="flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
|
||||||
|
>
|
||||||
|
<h3 className="text-xl font-semibold text-gray-900">
|
||||||
|
{section.title}
|
||||||
|
</h3>
|
||||||
|
<p className="mt-4 text-sm leading-relaxed text-gray-600">
|
||||||
|
{section.description}
|
||||||
|
</p>
|
||||||
|
<ul className="mt-6 space-y-3 text-sm text-gray-600">
|
||||||
|
{section.bullets.map((bullet) => (
|
||||||
|
<li
|
||||||
|
key={bullet}
|
||||||
|
className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
|
||||||
|
>
|
||||||
|
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
|
||||||
|
<span>{bullet}</span>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
52
src/pages/gpu/GpuCapabilities.tsx
Normal file
52
src/pages/gpu/GpuCapabilities.tsx
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { Container } from '../../components/Container'
|
||||||
|
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
|
||||||
|
|
||||||
|
const architecture = [
|
||||||
|
{
|
||||||
|
title: 'Sovereign Compute Nodes',
|
||||||
|
description: 'GPUs hosted on hardware you trust.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Encrypted Mesh Networking',
|
||||||
|
description: 'Secure, private connectivity to workloads.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Reservation & Verification Layer',
|
||||||
|
description: 'Guarantees GPU access and consistency.',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export function GpuArchitecture() {
|
||||||
|
return (
|
||||||
|
<section id="gpu-architecture" className="bg-white py-24 sm:py-32">
|
||||||
|
<Container>
|
||||||
|
<div className="mx-auto max-w-3xl text-center">
|
||||||
|
<Eyebrow>ARCHITECTURE</Eyebrow>
|
||||||
|
<SectionHeader as="h2" className="mt-6 text-gray-900">
|
||||||
|
HOW IT WORKS
|
||||||
|
</SectionHeader>
|
||||||
|
<P className="mt-6 text-gray-600">
|
||||||
|
A sovereign GPU fabric built for transparent access, secure routing,
|
||||||
|
and guaranteed performance—no opaque clouds or shared queues.
|
||||||
|
</P>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mx-auto mt-16 max-w-4xl space-y-6">
|
||||||
|
{architecture.map((item) => (
|
||||||
|
<div
|
||||||
|
key={item.title}
|
||||||
|
className="rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
|
||||||
|
>
|
||||||
|
<h3 className="text-xl font-semibold text-gray-900">
|
||||||
|
{item.title}
|
||||||
|
</h3>
|
||||||
|
<p className="mt-3 text-sm leading-relaxed text-gray-600">
|
||||||
|
{item.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
62
src/pages/gpu/GpuDesign.tsx
Normal file
62
src/pages/gpu/GpuDesign.tsx
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
import { Container } from '../../components/Container'
|
||||||
|
import { Eyebrow, H3, P, CT } from '../../components/Texts'
|
||||||
|
import {
|
||||||
|
BoltIcon,
|
||||||
|
BanknotesIcon,
|
||||||
|
GlobeAltIcon,
|
||||||
|
ShieldCheckIcon,
|
||||||
|
} from '@heroicons/react/24/solid'
|
||||||
|
|
||||||
|
const benefits = [
|
||||||
|
{
|
||||||
|
name: 'Consistent, reserved GPU performance (no noisy neighbor effects)',
|
||||||
|
icon: BoltIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Transparent cost (no markup, no surprise billing)',
|
||||||
|
icon: BanknotesIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Run anywhere – cloud, on-prem, edge, home lab',
|
||||||
|
icon: GlobeAltIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Your data never leaves your control',
|
||||||
|
icon: ShieldCheckIcon,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export function GpuDesign() {
|
||||||
|
return (
|
||||||
|
<section className="bg-white py-24 sm:py-32">
|
||||||
|
<Container>
|
||||||
|
{/* Header */}
|
||||||
|
<div className="mx-auto max-w-3xl sm:text-center">
|
||||||
|
<Eyebrow>CORE VALUE</Eyebrow>
|
||||||
|
<H3 className="mt-4 text-gray-900">GPU Power You Actually Control</H3>
|
||||||
|
<P className="mt-6 text-gray-600">
|
||||||
|
Mycelium GPU gives you access to real hardware, not gated queues or
|
||||||
|
proprietary runtimes.
|
||||||
|
</P>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Key Benefits */}
|
||||||
|
<div className="mx-auto mt-16 max-w-5xl">
|
||||||
|
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-2">
|
||||||
|
{benefits.map((benefit) => (
|
||||||
|
<div key={benefit.name} className="relative pl-12">
|
||||||
|
<benefit.icon
|
||||||
|
className="absolute left-0 top-1 size-6 text-cyan-600"
|
||||||
|
aria-hidden="true"
|
||||||
|
/>
|
||||||
|
<CT className="font-semibold text-gray-900">
|
||||||
|
{benefit.name}
|
||||||
|
</CT>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,48 +1,30 @@
|
|||||||
import {
|
import {
|
||||||
CodeBracketSquareIcon,
|
AdjustmentsHorizontalIcon,
|
||||||
CubeTransparentIcon,
|
GlobeAltIcon,
|
||||||
LockClosedIcon,
|
BanknotesIcon,
|
||||||
Squares2X2Icon,
|
|
||||||
} from '@heroicons/react/24/outline'
|
} from '@heroicons/react/24/outline'
|
||||||
|
|
||||||
import { Container } from '../../components/Container'
|
import { Container } from '../../components/Container'
|
||||||
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
|
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
|
||||||
|
|
||||||
const overviewCards = [
|
const coreFeatures = [
|
||||||
{
|
{
|
||||||
label: 'Overview',
|
name: 'Deterministic GPU Allocation',
|
||||||
title: 'Unified GPU acceleration across the ThreeFold Grid',
|
|
||||||
description:
|
description:
|
||||||
'Mycelium GPU aggregates distributed hardware into a single fabric, delivering sovereign acceleration for AI, ML, and rendering workloads.',
|
'Reserve the GPU type you need and get exactly that, every time.',
|
||||||
|
icon: AdjustmentsHorizontalIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Core Concept',
|
name: 'Multi-Topology Deployment',
|
||||||
title: 'Sovereign intelligence layer',
|
|
||||||
description:
|
description:
|
||||||
'No silos, no intermediaries—just raw, verifiable GPU power orchestrated through smart contracts and APIs you control.',
|
'Run workloads in data centers, at the edge, or on self-hosted nodes.',
|
||||||
},
|
icon: GlobeAltIcon,
|
||||||
]
|
|
||||||
|
|
||||||
const principles = [
|
|
||||||
{
|
|
||||||
name: 'No Silos',
|
|
||||||
description: 'Every GPU resource is accessible through a single interface.',
|
|
||||||
icon: Squares2X2Icon,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'No Intermediaries',
|
name: 'Transparent Cost Structure',
|
||||||
description: 'Direct access to hardware without centralized brokers.',
|
description:
|
||||||
icon: CubeTransparentIcon,
|
'No inflated pricing, no hidden fees, no marketplace brokerage.',
|
||||||
},
|
icon: BanknotesIcon,
|
||||||
{
|
|
||||||
name: 'Verifiable Power',
|
|
||||||
description: 'Every GPU cycle is attested and cryptographically verified.',
|
|
||||||
icon: LockClosedIcon,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Code-Orchestrated',
|
|
||||||
description: 'Smart contracts and APIs automate allocation and policy.',
|
|
||||||
icon: CodeBracketSquareIcon,
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -52,52 +34,31 @@ export function GpuOverview() {
|
|||||||
<Container>
|
<Container>
|
||||||
<div className="mx-auto max-w-3xl text-center">
|
<div className="mx-auto max-w-3xl text-center">
|
||||||
<Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
|
<Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
|
||||||
Platform Overview
|
PLATFORM OVERVIEW
|
||||||
</Eyebrow>
|
</Eyebrow>
|
||||||
<SectionHeader as="h2" color="light" className="mt-6 font-medium">
|
<SectionHeader as="h2" color="light" className="mt-6 font-medium">
|
||||||
The sovereign acceleration layer for intelligent workloads.
|
Core Features
|
||||||
</SectionHeader>
|
</SectionHeader>
|
||||||
<P color="lightSecondary" className="mt-6">
|
<P color="lightSecondary" className="mt-6">
|
||||||
Mycelium GPU makes distributed acceleration feel like one machine.
|
The Mycelium GPU layer provides predictable, sovereign acceleration
|
||||||
Harness global GPUs with deterministic performance, transparent
|
— without arbitrary limits or hidden economics.
|
||||||
costs, and end-to-end verification.
|
|
||||||
</P>
|
</P>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-16 grid gap-8 lg:grid-cols-2">
|
|
||||||
{overviewCards.map((card) => (
|
<div className="mx-auto mt-16 max-w-5xl grid gap-8 sm:grid-cols-2 lg:grid-cols-3">
|
||||||
|
{coreFeatures.map((feature) => (
|
||||||
<div
|
<div
|
||||||
key={card.title}
|
key={feature.name}
|
||||||
className="group relative overflow-hidden rounded-3xl border border-white/10 bg-white/[0.04] p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]"
|
className="rounded-3xl border border-white/10 bg-white/[0.04] p-8 text-left backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]"
|
||||||
>
|
|
||||||
<div className="absolute inset-0 bg-gradient-to-br from-cyan-500/0 via-white/[0.05] to-cyan-300/20 opacity-0 transition group-hover:opacity-100" />
|
|
||||||
<div className="relative">
|
|
||||||
<Small className="text-xs uppercase tracking-[0.35em] text-cyan-200">
|
|
||||||
{card.label}
|
|
||||||
</Small>
|
|
||||||
<h3 className="mt-4 text-lg font-semibold text-white">
|
|
||||||
{card.title}
|
|
||||||
</h3>
|
|
||||||
<p className="mt-4 text-sm leading-relaxed text-gray-300">
|
|
||||||
{card.description}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
<div className="mt-16 grid gap-8 sm:grid-cols-2 lg:grid-cols-4">
|
|
||||||
{principles.map((principle) => (
|
|
||||||
<div
|
|
||||||
key={principle.name}
|
|
||||||
className="rounded-3xl border border-white/10 bg-white/[0.04] p-6 text-left transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]"
|
|
||||||
>
|
>
|
||||||
<div className="mb-6 flex size-12 items-center justify-center rounded-full bg-cyan-500/15">
|
<div className="mb-6 flex size-12 items-center justify-center rounded-full bg-cyan-500/15">
|
||||||
<principle.icon aria-hidden="true" className="size-6 text-cyan-300" />
|
<feature.icon className="size-6 text-cyan-300" aria-hidden="true" />
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-base font-semibold text-white">
|
<h3 className="text-lg font-semibold text-white">
|
||||||
{principle.name}
|
{feature.name}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-3 text-sm leading-relaxed text-gray-300">
|
<p className="mt-3 text-sm leading-relaxed text-gray-300">
|
||||||
{principle.description}
|
{feature.description}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import { GpuUseCases } from './GpuUseCases'
|
|||||||
import { GpuGettingStarted } from './GpuGettingStarted'
|
import { GpuGettingStarted } from './GpuGettingStarted'
|
||||||
import { GpuDifferentiators } from './GpuDifferentiators'
|
import { GpuDifferentiators } from './GpuDifferentiators'
|
||||||
import { CallToAction } from './CallToAction'
|
import { CallToAction } from './CallToAction'
|
||||||
|
import { GpuCapabilities } from './GpuCapabilities'
|
||||||
|
import { GpuDesign } from './GpuDesign'
|
||||||
|
|
||||||
export default function GpuPage() {
|
export default function GpuPage() {
|
||||||
return (
|
return (
|
||||||
@@ -14,24 +16,39 @@ export default function GpuPage() {
|
|||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuHero />
|
<GpuHero />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuOverview />
|
<GpuCapabilities />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
|
<AnimatedSection>
|
||||||
|
<GpuDesign />
|
||||||
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuArchitecture />
|
<GpuArchitecture />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuIntegration />
|
<GpuOverview />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuUseCases />
|
<GpuUseCases />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
|
<AnimatedSection>
|
||||||
|
<GpuIntegration />
|
||||||
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuGettingStarted />
|
<GpuGettingStarted />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<GpuDifferentiators />
|
<GpuDifferentiators />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<CallToAction />
|
<CallToAction />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|||||||
@@ -1,34 +1,18 @@
|
|||||||
import { Container } from '../../components/Container'
|
import { Container } from '../../components/Container'
|
||||||
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
|
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
|
||||||
|
|
||||||
const useCases = [
|
const gpuUseCases = [
|
||||||
{
|
{
|
||||||
title: 'AI / ML Training',
|
title: 'AI / ML Training & Inference',
|
||||||
description:
|
description: 'Scale model execution across sovereign GPU nodes.',
|
||||||
'Scale training, fine-tuning, and inference workloads anywhere on the grid.',
|
|
||||||
bullets: ['GPU acceleration', 'Scalable compute', 'Cost optimization'],
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Rendering & Visualization',
|
title: 'Rendering & Visualization',
|
||||||
description:
|
description: 'Run 3D, scientific, simulation, or generative rendering pipelines.',
|
||||||
'Drive high-performance graphics pipelines for media, science, and immersive experiences.',
|
|
||||||
bullets: [
|
|
||||||
'Distributed 3D rendering',
|
|
||||||
'Scientific visualization',
|
|
||||||
'Real-time VR / AR processing',
|
|
||||||
'Digital twin simulations',
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'General GPU Computing',
|
title: 'Distributed & Edge Compute',
|
||||||
description:
|
description: 'Place GPU power close to where data is generated.',
|
||||||
'Harness sovereign acceleration for simulations, finance, blockchain, and research.',
|
|
||||||
bullets: [
|
|
||||||
'Scientific simulations',
|
|
||||||
'Financial modeling',
|
|
||||||
'Blockchain processing',
|
|
||||||
'Protein folding and discovery',
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -37,41 +21,28 @@ export function GpuUseCases() {
|
|||||||
<section className="bg-white py-24 sm:py-32">
|
<section className="bg-white py-24 sm:py-32">
|
||||||
<Container>
|
<Container>
|
||||||
<div className="mx-auto max-w-3xl text-center">
|
<div className="mx-auto max-w-3xl text-center">
|
||||||
<Eyebrow>
|
<Eyebrow>USE CASES</Eyebrow>
|
||||||
Use Cases
|
|
||||||
</Eyebrow>
|
|
||||||
<SectionHeader as="h2" className="mt-6 text-gray-900">
|
<SectionHeader as="h2" className="mt-6 text-gray-900">
|
||||||
Acceleration for every intelligent workload.
|
Built for Intelligent Workloads
|
||||||
</SectionHeader>
|
</SectionHeader>
|
||||||
<P className="mt-6 text-gray-600">
|
<P className="mt-6 text-gray-600">
|
||||||
From deep learning to immersive visualization, Mycelium GPU delivers
|
From sovereign AI execution to real-time rendering and edge inference,
|
||||||
deterministic access to the power you need without the waitlists or
|
Mycelium GPU ensures predictable acceleration with full ownership and no centralized control.
|
||||||
markups of centralized clouds.
|
|
||||||
</P>
|
</P>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-16 grid gap-8 lg:grid-cols-3">
|
|
||||||
{useCases.map((useCase) => (
|
<div className="mx-auto mt-16 max-w-4xl space-y-6 lg:space-y-0 lg:grid lg:grid-cols-3 lg:gap-8">
|
||||||
|
{gpuUseCases.map((useCase) => (
|
||||||
<div
|
<div
|
||||||
key={useCase.title}
|
key={useCase.title}
|
||||||
className="flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
|
className="rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
|
||||||
>
|
>
|
||||||
<h3 className="text-xl font-semibold text-gray-900">
|
<h3 className="text-xl font-semibold text-gray-900">
|
||||||
{useCase.title}
|
{useCase.title}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-4 text-sm leading-relaxed text-gray-600">
|
<p className="mt-3 text-sm leading-relaxed text-gray-600">
|
||||||
{useCase.description}
|
{useCase.description}
|
||||||
</p>
|
</p>
|
||||||
<ul className="mt-6 space-y-3 text-sm text-gray-600">
|
|
||||||
{useCase.bullets.map((bullet) => (
|
|
||||||
<li
|
|
||||||
key={bullet}
|
|
||||||
className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
|
|
||||||
>
|
|
||||||
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
|
|
||||||
<span>{bullet}</span>
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user