forked from emre/www_projectmycelium_com
Compare commits
2 Commits
cf32cd081c
...
326efc9fbd
| Author | SHA1 | Date | |
|---|---|---|---|
| 326efc9fbd | |||
| 3a656ef5e9 |
BIN
public/images/cons.png
Normal file
BIN
public/images/cons.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 793 KiB |
BIN
public/images/dev.png
Normal file
BIN
public/images/dev.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 801 KiB |
BIN
public/images/seekers.png
Normal file
BIN
public/images/seekers.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 990 KiB |
@@ -11,7 +11,7 @@ const ComputePage = lazy(() => import('./pages/compute/ComputePage'));
|
|||||||
const StoragePage = lazy(() => import('./pages/storage/StoragePage'));
|
const StoragePage = lazy(() => import('./pages/storage/StoragePage'));
|
||||||
const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
|
const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
|
||||||
const PodsPage = lazy(() => import('./pages/pods/PodsPage'));
|
const PodsPage = lazy(() => import('./pages/pods/PodsPage'));
|
||||||
const NodePage = lazy(() => import('./pages/node/NodePage'));
|
const NodesPage = lazy(() => import('./pages/nodes/NodesPage'));
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
@@ -28,7 +28,7 @@ function App() {
|
|||||||
<Route path="storage" element={<StoragePage />} />
|
<Route path="storage" element={<StoragePage />} />
|
||||||
<Route path="gpu" element={<GpuPage />} />
|
<Route path="gpu" element={<GpuPage />} />
|
||||||
<Route path="pods" element={<PodsPage />} />
|
<Route path="pods" element={<PodsPage />} />
|
||||||
<Route path="nodes" element={<NodePage />} />
|
<Route path="nodes" element={<NodesPage />} />
|
||||||
</Route>
|
</Route>
|
||||||
</Routes>
|
</Routes>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ export function Footer() {
|
|||||||
<Link to="/agents" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
|
<Link to="/agents" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
|
||||||
Agents
|
Agents
|
||||||
</Link>
|
</Link>
|
||||||
<Link to="/node" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
|
<Link to="/nodes" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
|
||||||
Node
|
Nodes
|
||||||
</Link>
|
</Link>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -43,10 +43,10 @@ export function Header() {
|
|||||||
Agents
|
Agents
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
to="/node"
|
to="/nodes"
|
||||||
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
|
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
|
||||||
>
|
>
|
||||||
Node
|
Nodes
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -131,11 +131,11 @@ export function Header() {
|
|||||||
Agents
|
Agents
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
to="/node"
|
to="/nodes"
|
||||||
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
|
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
|
||||||
onClick={() => setMobileMenuOpen(false)}
|
onClick={() => setMobileMenuOpen(false)}
|
||||||
>
|
>
|
||||||
Node
|
Nodes
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="py-6">
|
<div className="py-6">
|
||||||
|
|||||||
@@ -43,10 +43,10 @@ export function HeaderDark() {
|
|||||||
Agents
|
Agents
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
to="/node"
|
to="/nodes"
|
||||||
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
|
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
|
||||||
>
|
>
|
||||||
Node
|
Nodes
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -131,11 +131,11 @@ export function HeaderDark() {
|
|||||||
Agents
|
Agents
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
to="/node"
|
to="/nodes"
|
||||||
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
|
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
|
||||||
onClick={() => setMobileMenuOpen(false)}
|
onClick={() => setMobileMenuOpen(false)}
|
||||||
>
|
>
|
||||||
Node
|
Nodes
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="py-6">
|
<div className="py-6">
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { Link } from 'react-router-dom';
|
||||||
import { Container } from '@/components/Container'
|
import { Container } from '@/components/Container'
|
||||||
import { Button } from '@/components/Button'
|
import { Button } from '@/components/Button'
|
||||||
import { H3, P } from '@/components/Texts'
|
import { H3, P } from '@/components/Texts'
|
||||||
@@ -63,9 +64,9 @@ export function CallToAction() {
|
|||||||
Deploy in Cloud
|
Deploy in Cloud
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<a href="/node" className="text-cyan-400 hover:text-cyan-300 transition-colors">
|
<Link to="/nodes" className="text-cyan-400 hover:text-cyan-300 transition-colors">
|
||||||
Host a Node →
|
Host a Node →
|
||||||
</a>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Container } from "@/components/Container";
|
import { Link } from 'react-router-dom';
|
||||||
|
import { Container } from '@/components/Container'
|
||||||
import { Button } from "@/components/Button";
|
import { Button } from "@/components/Button";
|
||||||
|
|
||||||
export function CallToAction() {
|
export function CallToAction() {
|
||||||
@@ -42,9 +43,9 @@ Use the network to link environments, deploy workloads, or host nodes to strengt
|
|||||||
Deploy in Cloud
|
Deploy in Cloud
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<a href="/node" className="text-cyan-400 hover:text-cyan-300 transition-colors">
|
<Link to="/nodes" className="text-cyan-400 hover:text-cyan-300 transition-colors">
|
||||||
Host a Node →
|
Host a Node →
|
||||||
</a>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import { SecondaryFeatures } from './SecondaryFeatures'
|
|||||||
import { CallToAction } from './CallToAction'
|
import { CallToAction } from './CallToAction'
|
||||||
import { NetworkCapabilities } from './NetworkCapabilities'
|
import { NetworkCapabilities } from './NetworkCapabilities'
|
||||||
import { NetworkUsecases } from './NetworkUsecases'
|
import { NetworkUsecases } from './NetworkUsecases'
|
||||||
|
import { NetworkPros } from './NetworkPros'
|
||||||
|
|
||||||
|
|
||||||
export default function NetworkPage() {
|
export default function NetworkPage() {
|
||||||
return (
|
return (
|
||||||
@@ -19,7 +21,7 @@ export default function NetworkPage() {
|
|||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<Features />
|
<SecondaryFeatures />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
@@ -27,13 +29,18 @@ export default function NetworkPage() {
|
|||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<NetworkUsecases />
|
<Features />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<SecondaryFeatures />
|
<NetworkPros />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
|
<AnimatedSection>
|
||||||
|
<NetworkUsecases />
|
||||||
|
</AnimatedSection>
|
||||||
|
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<CallToAction />
|
<CallToAction />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|||||||
68
src/pages/network/NetworkPros.tsx
Normal file
68
src/pages/network/NetworkPros.tsx
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import { Small } from '@/components/Texts'
|
||||||
|
|
||||||
|
const highlights = [
|
||||||
|
{
|
||||||
|
label: 'Network Advantage',
|
||||||
|
title: 'Fully peer-to-peer, no logins, no central cloud.',
|
||||||
|
description:
|
||||||
|
'Connectivity flows directly between users, nodes, and services without platform ownership.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Identity',
|
||||||
|
title: 'One identity across all capabilities.',
|
||||||
|
description:
|
||||||
|
'A single cryptographic identity governs your network, storage, agents, and deployments.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Scale',
|
||||||
|
title: 'Scales instantly from one POD to thousands.',
|
||||||
|
description:
|
||||||
|
'Deploy locally or expand globally — the mesh routes and balances itself automatically.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Security',
|
||||||
|
title: 'Secure, quantum-safe, and edge-ready for the next decade.',
|
||||||
|
description:
|
||||||
|
'Next-gen encryption, multipath routing, and attested nodes protect workloads everywhere.',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export function NetworkPros() {
|
||||||
|
return (
|
||||||
|
<section className="relative w-full bg-[#121212] overflow-hidden">
|
||||||
|
{/* ✅ Top horizontal line with spacing */}
|
||||||
|
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
|
||||||
|
<div className="w-full border-t border-l border-r border-gray-800" />
|
||||||
|
|
||||||
|
<div className="bg-[#121212] w-full max-w-7xl mx-auto border border-t-0 border-b-0 border-gray-800">
|
||||||
|
<div className="grid lg:grid-cols-4">
|
||||||
|
{highlights.map((item) => (
|
||||||
|
<div
|
||||||
|
key={item.title}
|
||||||
|
className="group relative overflow-hidden border border-white/10 bg-white/4 p-8 backdrop-blur-sm transition hover:border-cyan-300/50 hover:bg-white/8"
|
||||||
|
>
|
||||||
|
<div className="absolute inset-0 bg-linear-to-br from-cyan-500/0 via-white/5 to-cyan-300/20 opacity-0 transition group-hover:opacity-100" />
|
||||||
|
|
||||||
|
<div className="relative">
|
||||||
|
<Small className="text-xs uppercase tracking-[0.16em] text-cyan-200">
|
||||||
|
{item.label}
|
||||||
|
</Small>
|
||||||
|
|
||||||
|
<h3 className="mt-4 text-lg font-semibold leading-tight text-white">
|
||||||
|
{item.title}
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p className="mt-4 text-sm leading-relaxed text-gray-300">
|
||||||
|
{item.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="w-full border-b border-gray-800 bg-[#121212]" />
|
||||||
|
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useRef } from "react";
|
|
||||||
import { Eyebrow, SectionHeader, P } from "@/components/Texts";
|
import { Eyebrow, SectionHeader, P } from "@/components/Texts";
|
||||||
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
|
|
||||||
import {
|
import {
|
||||||
LockClosedIcon,
|
LockClosedIcon,
|
||||||
ArrowPathIcon,
|
ArrowPathIcon,
|
||||||
GlobeAltIcon,
|
GlobeAltIcon,
|
||||||
|
SignalIcon,
|
||||||
|
CpuChipIcon,
|
||||||
} from "@heroicons/react/24/solid";
|
} from "@heroicons/react/24/solid";
|
||||||
|
|
||||||
const networkUseCases = [
|
const networkUseCases = [
|
||||||
@@ -27,46 +27,52 @@ const networkUseCases = [
|
|||||||
{
|
{
|
||||||
title: "Service-to-Service Networking Across Environments",
|
title: "Service-to-Service Networking Across Environments",
|
||||||
description:
|
description:
|
||||||
"Connect applications running across home labs, cloud regions, edge nodes, and data centers all on one address space.",
|
"Connect apps running across home labs, cloud regions, edge nodes, and datacenters — all on one address space.",
|
||||||
ideal: "Ideal for: dev teams, distributed apps, container + K3s workloads",
|
ideal: "Ideal for: dev teams, distributed apps, container + K3s workloads",
|
||||||
icon: GlobeAltIcon,
|
icon: GlobeAltIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Resilient Connectivity Across Regions & Outages",
|
title: "Resilient Connectivity Across Regions & Outages",
|
||||||
description:
|
description:
|
||||||
"Connect systems across countries, datacenters, edge locations, and remote deployments — with routing that automatically heals around ISP failures, censorship, and regional outages.",
|
"Automatically routes around ISP failures, censorship, and regional outages using multipath encrypted relays.",
|
||||||
ideal:
|
ideal:
|
||||||
"Ideal for: research networks, cross-border orgs, distributed compute, off-grid / rural deployments",
|
"Ideal for: cross-border orgs, distributed compute, remote/off-grid deployments",
|
||||||
icon: ArrowPathIcon,
|
icon: ArrowPathIcon,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Adaptive Mesh for Mobile & Edge Movement",
|
||||||
|
description:
|
||||||
|
"Devices moving between networks, cities, or countries maintain continuous secure connectivity with no reconnection steps.",
|
||||||
|
ideal: "Ideal for: mobile agents, field teams, robotics, vehicles, IoT",
|
||||||
|
icon: SignalIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Compute Fabric Linking Nodes & Agents",
|
||||||
|
description:
|
||||||
|
"Agents, jobs, and tasks can interact across nodes without exposing private IPs or opening firewalls.",
|
||||||
|
ideal: "Ideal for: agent networks, edge AI workloads, distributed computation",
|
||||||
|
icon: CpuChipIcon,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export function NetworkUsecases() {
|
export function NetworkUsecases() {
|
||||||
const sliderRef = useRef<HTMLUListElement>(null);
|
|
||||||
|
|
||||||
const scrollLeft = () =>
|
|
||||||
sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
|
|
||||||
|
|
||||||
const scrollRight = () =>
|
|
||||||
sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="bg-white w-full max-w-8xl mx-auto">
|
<section className="bg-white w-full max-w-8xl mx-auto">
|
||||||
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-slate-200" />
|
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-slate-200" />
|
||||||
<div className="w-full border-t border-l border-r border-slate-200" />
|
<div className="w-full border-t border-l border-r border-slate-200" />
|
||||||
|
|
||||||
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-slate-200 bg-white overflow-hidden">
|
<div className="mx-auto max-w-7xl border border-t-0 border-b-0 border-slate-200 bg-white">
|
||||||
<ul
|
{/* GRID 3 x 3 */}
|
||||||
ref={sliderRef}
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3">
|
||||||
className="flex overflow-x-auto snap-x snap-mandatory scroll-smooth no-scrollbar"
|
|
||||||
>
|
|
||||||
{networkUseCases.map((item, idx) => (
|
{networkUseCases.map((item, idx) => (
|
||||||
<li
|
<div
|
||||||
key={idx}
|
key={idx}
|
||||||
className={`snap-start shrink-0 w-[85%] sm:w-[50%] lg:w-[33%] border border-slate-200 p-10 relative ${
|
className={`
|
||||||
item.isIntro ? "bg-gray-50/80" : "bg-white"
|
border border-slate-200 p-10 relative
|
||||||
}`}
|
${item.isIntro ? "bg-gray-50/80" : "bg-white"}
|
||||||
|
`}
|
||||||
>
|
>
|
||||||
|
{/* Intro Card */}
|
||||||
{item.isIntro ? (
|
{item.isIntro ? (
|
||||||
<div className="flex flex-col justify-between h-full">
|
<div className="flex flex-col justify-between h-full">
|
||||||
<div>
|
<div>
|
||||||
@@ -81,47 +87,39 @@ export function NetworkUsecases() {
|
|||||||
{item.description}
|
{item.description}
|
||||||
</P>
|
</P>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center gap-x-4 mt-2">
|
|
||||||
<button
|
|
||||||
onClick={scrollLeft}
|
|
||||||
className="h-8 w-8 flex items-center justify-center border border-slate-300 rounded-md hover:border-cyan-500 transition-colors"
|
|
||||||
>
|
|
||||||
<IoArrowBackOutline className="text-gray-600" size={16} />
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
onClick={scrollRight}
|
|
||||||
className="h-8 w-8 flex items-center justify-center border border-slate-300 rounded-md hover:border-cyan-500 transition-colors"
|
|
||||||
>
|
|
||||||
<IoArrowForwardOutline className="text-gray-600" size={16} />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{/* ✅ Icon above title */}
|
{/* Icon */}
|
||||||
{item.icon && (
|
{item.icon && (
|
||||||
<div className="h-10 w-10 flex items-center justify-center rounded-xl bg-gray-100 mb-4">
|
<div className="h-10 w-10 flex items-center justify-center rounded-xl bg-gray-100 mb-4">
|
||||||
<item.icon className="h-6 w-6 text-cyan-600" />
|
<item.icon className="h-6 w-6 text-cyan-600" />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Title */}
|
||||||
<p className="text-lg font-semibold text-gray-900">
|
<p className="text-lg font-semibold text-gray-900">
|
||||||
{item.title}
|
{item.title}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
{/* Description */}
|
||||||
<p className="mt-2 text-gray-600 leading-snug">
|
<p className="mt-2 text-gray-600 leading-snug">
|
||||||
{item.description}
|
{item.description}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
{/* Ideal for */}
|
||||||
<p className="mt-3 text-xs font-medium text-cyan-700">
|
<p className="mt-3 text-xs font-medium text-cyan-700">
|
||||||
{item.ideal}
|
{item.ideal}
|
||||||
</p>
|
</p>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="w-full border-b border-slate-200 bg-white" />
|
||||||
|
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-slate-200" />
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,12 +197,12 @@ export function SecondaryFeatures() {
|
|||||||
|
|
||||||
<Container className="py-12 border border-t-0 border-b-0 border-gray-100">
|
<Container className="py-12 border border-t-0 border-b-0 border-gray-100">
|
||||||
<div className="mx-auto max-w-4xl sm:text-center">
|
<div className="mx-auto max-w-4xl sm:text-center">
|
||||||
<h2 className="text-base/7 font-semibold text-cyan-500">IN ACTIVE EVOLUTION</h2>
|
<h2 className="text-base/7 font-semibold text-cyan-500">FEATURES</h2>
|
||||||
<p className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
|
<p className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
|
||||||
Expanding the Network Layer
|
Core Features
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-6 text-lg text-gray-600">
|
<p className="mt-6 text-lg text-gray-600">
|
||||||
The Mycelium Network is evolving to support richer data movement, identity, and application connectivity across the mesh. These enhancements deepen autonomy and improve real-world usability.
|
The Mycelium Network is evolving with new features to support richer data movement, identity, and application connectivity across the mesh.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<ul
|
<ul
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { NodeProducts } from './NodeProducts';
|
|||||||
import { NodeSpecs } from './NodeSpecs';
|
import { NodeSpecs } from './NodeSpecs';
|
||||||
import { CallToAction } from './CallToAction';
|
import { CallToAction } from './CallToAction';
|
||||||
|
|
||||||
const NodePage: React.FC = () => {
|
const NodesPage: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<NodeHero />
|
<NodeHero />
|
||||||
@@ -19,4 +19,4 @@ const NodePage: React.FC = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default NodePage;
|
export default NodesPage;
|
||||||
Reference in New Issue
Block a user