Initial Phoenix Sankofa Cloud setup
- Complete project structure with Next.js frontend - GraphQL API backend with Apollo Server - Portal application with NextAuth - Crossplane Proxmox provider - GitOps configurations - CI/CD pipelines - Testing infrastructure (Vitest, Jest, Go tests) - Error handling and monitoring - Security hardening - UI component library - Documentation
This commit is contained in:
140
src/app/about/page.tsx
Normal file
140
src/app/about/page.tsx
Normal file
@@ -0,0 +1,140 @@
|
||||
import Link from 'next/link'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
|
||||
|
||||
export default function AboutPage() {
|
||||
return (
|
||||
<main className="min-h-screen bg-studio-black">
|
||||
{/* Header */}
|
||||
<header className="border-b border-studio-medium bg-studio-dark">
|
||||
<div className="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
|
||||
<Link href="/" className="text-2xl font-bold text-white">
|
||||
Phoenix <span className="text-phoenix-fire">Sankofa</span> Cloud
|
||||
</Link>
|
||||
<nav className="flex gap-4">
|
||||
<Link href="/" className="text-gray-400 hover:text-white">
|
||||
Home
|
||||
</Link>
|
||||
<Link href="/products" className="text-gray-400 hover:text-white">
|
||||
Products
|
||||
</Link>
|
||||
<Link href="/manifesto" className="text-gray-400 hover:text-white">
|
||||
Manifesto
|
||||
</Link>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{/* Hero */}
|
||||
<section className="py-24 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h1 className="mb-6 text-5xl font-bold text-white md:text-6xl">
|
||||
The Deeper Meaning
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300">
|
||||
Understanding the Akan philosophy of Sankofa and the Phoenix transformation
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Philosophy Section */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-4xl space-y-12">
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-phoenix-fire">Sankofa and Akan Cosmology</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4 text-gray-300">
|
||||
<p>
|
||||
In Akan cosmology, the universe is circular, not linear; interconnected, not hierarchical;
|
||||
ancestrally governed, not isolated. Sankofa represents the return to origin to complete the cycle.
|
||||
</p>
|
||||
<p>
|
||||
It echoes the Akan belief that life, identity, and destiny (nkrabea) must be aligned with
|
||||
source (kra), ancestral memory (nananom nsamanfoɔ), and lineage (abusua).
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-sankofa-gold">Sankofa and Time</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4 text-gray-300">
|
||||
<p>
|
||||
Western time is linear. Akan time is recursive — events are patterns that return.
|
||||
</p>
|
||||
<p className="text-lg font-semibold text-white">
|
||||
Progress is a spiral, not a straight line.
|
||||
</p>
|
||||
<p>
|
||||
The future is found in the past; the past informs the future. This is why a bird looking
|
||||
back while flying forward is perfect as the symbol.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-neon-cyan">Sankofa and the Soul</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4 text-gray-300">
|
||||
<p>
|
||||
In Akan thought, "Kra" is the divine soul, given by Nyame (Creator). It comes from a
|
||||
spiritual origin place, and its mission is learned by reflecting on where it came from.
|
||||
</p>
|
||||
<p className="text-lg font-semibold text-white">
|
||||
Sankofa is the soul's act of remembering itself.
|
||||
</p>
|
||||
<p>It is spiritual self-retrieval.</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-phoenix-fire">Sankofa as Technology</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4 text-gray-300">
|
||||
<p>
|
||||
Sankofa is an algorithm. A cosmological protocol. A recursive pattern of:
|
||||
</p>
|
||||
<p className="text-2xl font-bold text-center text-white">
|
||||
Remember → Retrieve → Restore → Rise
|
||||
</p>
|
||||
<p>
|
||||
Sankofa is how individuals, families, nations, and civilizations rebuild themselves.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-sankofa-gold">The Phoenix–Sankofa Integration</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4 text-gray-300">
|
||||
<p>
|
||||
<strong className="text-white">Phoenix</strong> = fire, rebirth, immortality
|
||||
</p>
|
||||
<p>
|
||||
<strong className="text-white">Sankofa</strong> = return, reclaim, rise forward
|
||||
</p>
|
||||
<p className="text-xl font-semibold text-center text-white mt-6">
|
||||
Together, they form: <span className="text-phoenix-fire">Rebirth + Ancestral Return = Sovereign Global Power</span>
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<Link href="/manifesto">
|
||||
<Button variant="phoenix" size="lg">Read the Full Manifesto</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
60
src/app/globals.css
Normal file
60
src/app/globals.css
Normal file
@@ -0,0 +1,60 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
:root {
|
||||
--background: 10 10 10;
|
||||
--foreground: 255 255 255;
|
||||
}
|
||||
|
||||
* {
|
||||
@apply border-studio-medium;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-studio-black text-foreground;
|
||||
}
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
.text-balance {
|
||||
text-wrap: balance;
|
||||
}
|
||||
|
||||
.glow-phoenix {
|
||||
box-shadow: 0 0 20px rgba(255, 69, 0, 0.5);
|
||||
}
|
||||
|
||||
.glow-sankofa {
|
||||
box-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
|
||||
}
|
||||
|
||||
.glow-neon {
|
||||
box-shadow: 0 0 20px rgba(0, 255, 209, 0.5);
|
||||
}
|
||||
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.sr-only-focusable:focus {
|
||||
position: static;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: inherit;
|
||||
margin: inherit;
|
||||
overflow: visible;
|
||||
clip: auto;
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
||||
|
||||
32
src/app/layout.tsx
Normal file
32
src/app/layout.tsx
Normal file
@@ -0,0 +1,32 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { Inter } from 'next/font/google'
|
||||
import './globals.css'
|
||||
import { Providers } from './providers'
|
||||
import { ErrorBoundary } from '@/components/error-boundary'
|
||||
|
||||
const inter = Inter({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-inter',
|
||||
})
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'Phoenix Sankofa Cloud',
|
||||
description: 'The sovereign cloud born of fire and ancestral wisdom.',
|
||||
}
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode
|
||||
}) {
|
||||
return (
|
||||
<html lang="en" className="dark">
|
||||
<body className={`${inter.variable} font-sans antialiased`}>
|
||||
<ErrorBoundary>
|
||||
<Providers>{children}</Providers>
|
||||
</ErrorBoundary>
|
||||
</body>
|
||||
</html>
|
||||
)
|
||||
}
|
||||
|
||||
167
src/app/manifesto/page.tsx
Normal file
167
src/app/manifesto/page.tsx
Normal file
@@ -0,0 +1,167 @@
|
||||
import Link from 'next/link'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
|
||||
|
||||
export default function ManifestoPage() {
|
||||
const principles = [
|
||||
{
|
||||
title: 'Sovereignty',
|
||||
description: 'Infrastructure must serve sovereignty, not subvert it. Every region, nation, and community has the right to control its own data, govern its own infrastructure, and determine its own technological destiny.',
|
||||
},
|
||||
{
|
||||
title: 'Ancestral Wisdom',
|
||||
description: 'Technology must remember its origins. The cloud must learn from the past, honor ancestral knowledge, and integrate traditional wisdom with modern innovation.',
|
||||
},
|
||||
{
|
||||
title: 'Identity',
|
||||
description: 'Infrastructure must reflect identity. Technology is not neutral. We build infrastructure that reflects our cultural identity, honors our heritage, and serves our communities.',
|
||||
},
|
||||
{
|
||||
title: 'Recursive Learning',
|
||||
description: 'Progress is a spiral, not a straight line. We build systems that remember what came before, learn from history, and return to origin to complete cycles.',
|
||||
},
|
||||
{
|
||||
title: 'Global Cultural Intelligence',
|
||||
description: 'The cloud must understand culture. Across 325 regions, we build infrastructure that respects cultural contexts, adapts to local needs, and honors diverse traditions.',
|
||||
},
|
||||
{
|
||||
title: 'Rebirth and Transformation',
|
||||
description: 'Like the Phoenix, we rise from fire. We build infrastructure that transforms continuously, renews itself, and emerges stronger from every cycle.',
|
||||
},
|
||||
]
|
||||
|
||||
return (
|
||||
<main className="min-h-screen bg-studio-black">
|
||||
{/* Header */}
|
||||
<header className="border-b border-studio-medium bg-studio-dark">
|
||||
<div className="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
|
||||
<Link href="/" className="text-2xl font-bold text-white">
|
||||
Phoenix <span className="text-phoenix-fire">Sankofa</span> Cloud
|
||||
</Link>
|
||||
<nav className="flex gap-4">
|
||||
<Link href="/" className="text-gray-400 hover:text-white">
|
||||
Home
|
||||
</Link>
|
||||
<Link href="/about" className="text-gray-400 hover:text-white">
|
||||
About
|
||||
</Link>
|
||||
<Link href="/products" className="text-gray-400 hover:text-white">
|
||||
Products
|
||||
</Link>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{/* Hero */}
|
||||
<section className="py-24 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h1 className="mb-6 text-5xl font-bold text-white md:text-6xl">
|
||||
The Sovereign Cloud Manifesto
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300">
|
||||
A declaration of technological sovereignty
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Declaration */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-4xl">
|
||||
<Card className="border-phoenix-fire/50 bg-gradient-to-br from-phoenix-fire/10 to-sankofa-gold/10">
|
||||
<CardContent className="pt-6">
|
||||
<div className="space-y-4 text-lg text-white">
|
||||
<p className="text-2xl font-bold">We declare the right to technological sovereignty.</p>
|
||||
<p className="text-2xl font-bold">We declare the right to infrastructure that reflects our identity.</p>
|
||||
<p className="text-2xl font-bold">We declare the right to cloud computing that honors our ancestors.</p>
|
||||
<p className="text-2xl font-bold">We declare the right to AI that remembers where it came from.</p>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Principles */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-6xl">
|
||||
<h2 className="mb-12 text-center text-4xl font-bold text-white">
|
||||
Principles
|
||||
</h2>
|
||||
<div className="grid gap-8 md:grid-cols-2">
|
||||
{principles.map((principle) => (
|
||||
<Card key={principle.title}>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-phoenix-fire">{principle.title}</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<p className="text-gray-300">{principle.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* The Promise */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-4xl">
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-3xl text-center text-sankofa-gold">The Promise</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-6 pt-6">
|
||||
<p className="text-center text-2xl font-bold text-white">
|
||||
We promise infrastructure that:
|
||||
</p>
|
||||
<div className="space-y-4 text-lg text-gray-300">
|
||||
<p className="flex items-center gap-3">
|
||||
<span className="text-phoenix-fire text-2xl">→</span>
|
||||
<strong className="text-white">Remembers</strong> its origins
|
||||
</p>
|
||||
<p className="flex items-center gap-3">
|
||||
<span className="text-phoenix-fire text-2xl">→</span>
|
||||
<strong className="text-white">Retrieves</strong> ancestral wisdom
|
||||
</p>
|
||||
<p className="flex items-center gap-3">
|
||||
<span className="text-phoenix-fire text-2xl">→</span>
|
||||
<strong className="text-white">Restores</strong> identity and sovereignty
|
||||
</p>
|
||||
<p className="flex items-center gap-3">
|
||||
<span className="text-phoenix-fire text-2xl">→</span>
|
||||
<strong className="text-white">Rises</strong> forward with purpose
|
||||
</p>
|
||||
</div>
|
||||
<p className="mt-8 text-center text-3xl font-bold text-white">
|
||||
Remember → Retrieve → Restore → Rise
|
||||
</p>
|
||||
<p className="text-center text-gray-400">
|
||||
This is the Sankofa cycle. This is the Phoenix transformation.
|
||||
</p>
|
||||
<p className="text-center text-2xl font-bold text-phoenix-fire">
|
||||
This is Phoenix Sankofa Cloud.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h2 className="mb-6 text-3xl font-bold text-white">
|
||||
Join the Movement
|
||||
</h2>
|
||||
<p className="mb-8 text-xl text-gray-400">
|
||||
If you believe in technological sovereignty, ancestral wisdom, and identity-based infrastructure,
|
||||
</p>
|
||||
<p className="mb-8 text-xl font-semibold text-white">
|
||||
Join us. Build with us. Rise with us.
|
||||
</p>
|
||||
<Link href="/">
|
||||
<Button variant="phoenix" size="lg">Get Started</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
34
src/app/page.test.tsx
Normal file
34
src/app/page.test.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { render, screen } from '@/lib/test-utils'
|
||||
import Home from './page'
|
||||
|
||||
describe('Home Page', () => {
|
||||
it('should render the main heading', () => {
|
||||
render(<Home />)
|
||||
expect(screen.getByRole('heading', { level: 1, name: /phoenix.*sankofa.*cloud/i })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render the tagline', () => {
|
||||
render(<Home />)
|
||||
expect(screen.getByText(/the sovereign cloud born of fire and ancestral wisdom/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render the Remember → Retrieve → Restore → Rise text', () => {
|
||||
render(<Home />)
|
||||
expect(screen.getByText(/remember.*retrieve.*restore.*rise/i)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render navigation links', () => {
|
||||
render(<Home />)
|
||||
expect(screen.getByRole('link', { name: /learn more/i })).toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /products/i })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render feature cards', () => {
|
||||
render(<Home />)
|
||||
expect(screen.getByText(/phoenix fire/i)).toBeInTheDocument()
|
||||
expect(screen.getByText(/sankofa memory/i)).toBeInTheDocument()
|
||||
expect(screen.getByText(/sovereign power/i)).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
110
src/app/page.tsx
Normal file
110
src/app/page.tsx
Normal file
@@ -0,0 +1,110 @@
|
||||
import Link from 'next/link'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<main className="min-h-screen bg-studio-black">
|
||||
{/* Hero Section */}
|
||||
<section className="relative flex min-h-screen flex-col items-center justify-center overflow-hidden px-4">
|
||||
<div className="absolute inset-0 bg-gradient-to-br from-phoenix-fire/20 via-transparent to-sankofa-gold/20" />
|
||||
|
||||
<div className="relative z-10 max-w-4xl text-center">
|
||||
<h1 className="mb-6 text-5xl font-bold tracking-tight text-white md:text-7xl">
|
||||
Phoenix{' '}
|
||||
<span className="bg-gradient-to-r from-phoenix-fire to-sankofa-gold bg-clip-text text-transparent">
|
||||
Sankofa
|
||||
</span>{' '}
|
||||
Cloud
|
||||
</h1>
|
||||
|
||||
<p className="mb-8 text-xl text-gray-300 md:text-2xl">
|
||||
The sovereign cloud born of fire and ancestral wisdom.
|
||||
</p>
|
||||
|
||||
<p className="mb-12 text-lg text-gray-400">
|
||||
Remember → Retrieve → Restore → Rise
|
||||
</p>
|
||||
|
||||
<div className="flex flex-col gap-4 sm:flex-row sm:justify-center">
|
||||
<Link href="/about">
|
||||
<Button variant="phoenix" size="lg">Learn More</Button>
|
||||
</Link>
|
||||
<Link href="/products">
|
||||
<Button variant="outline" size="lg">Products</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Features Section */}
|
||||
<section className="py-24 px-4">
|
||||
<div className="mx-auto max-w-6xl">
|
||||
<h2 className="mb-12 text-center text-4xl font-bold text-white">
|
||||
Sovereign. Ancestral. Transformative.
|
||||
</h2>
|
||||
|
||||
<div className="grid gap-8 md:grid-cols-3">
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-phoenix-fire">Phoenix Fire</CardTitle>
|
||||
<CardDescription>
|
||||
Rebirth through transformation
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<p className="text-gray-300">
|
||||
Infrastructure that continuously transforms and renews, rising from every challenge like the Phoenix.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-sankofa-gold">Sankofa Memory</CardTitle>
|
||||
<CardDescription>
|
||||
Return to origin, rise forward
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<p className="text-gray-300">
|
||||
Systems that remember their origins, retrieve ancestral wisdom, and rise forward with purpose.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-neon-cyan">Sovereign Power</CardTitle>
|
||||
<CardDescription>
|
||||
True technological sovereignty
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<p className="text-gray-300">
|
||||
Complete control over infrastructure, data, and destiny across 325 global regions.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="py-24 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h2 className="mb-6 text-4xl font-bold text-white">
|
||||
Join the Sovereign Cloud Movement
|
||||
</h2>
|
||||
<p className="mb-8 text-xl text-gray-400">
|
||||
Build infrastructure that honors identity and serves sovereignty.
|
||||
</p>
|
||||
<Link href="/manifesto">
|
||||
<Button variant="phoenix" size="lg">Read the Manifesto</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
134
src/app/products/page.tsx
Normal file
134
src/app/products/page.tsx
Normal file
@@ -0,0 +1,134 @@
|
||||
import Link from 'next/link'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||
|
||||
export default function ProductsPage() {
|
||||
const products = [
|
||||
{
|
||||
category: 'Compute',
|
||||
items: [
|
||||
{ name: 'PhoenixCore Compute', description: 'Core compute engine powered by Phoenix fire' },
|
||||
{ name: 'SankofaEdge Nodes', description: 'Edge nodes that remember and return data' },
|
||||
{ name: 'AkanFire VM Engine', description: 'High-performance VMs with Akan heritage' },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'Storage',
|
||||
items: [
|
||||
{ name: 'OkraVault Storage', description: 'Storage for the soul of your data' },
|
||||
{ name: 'Nananom Archive', description: 'Long-term archival with ancestral memory' },
|
||||
{ name: 'Egg of the Phoenix Object Store', description: 'Object storage for transformation' },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'Networking',
|
||||
items: [
|
||||
{ name: 'SankofaGrid Global Mesh', description: 'Global network mesh that remembers' },
|
||||
{ name: 'AkanSphere Edge Routing', description: 'Edge routing with cultural intelligence' },
|
||||
{ name: 'PhoenixFlight Network Fabric', description: 'High-performance network fabric' },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'AI & Machine Learning',
|
||||
items: [
|
||||
{ name: 'Firebird AI Engine', description: 'AI that transforms like fire' },
|
||||
{ name: 'Sankofa Memory Model', description: 'AI models that remember and learn' },
|
||||
{ name: 'Ancestral Neural Fabric', description: 'Distributed AI with ancestral patterns' },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'Security',
|
||||
items: [
|
||||
{ name: 'Aegis of Akan Shield', description: 'Comprehensive security platform' },
|
||||
{ name: 'PhoenixGuard IAM', description: 'Identity and access management' },
|
||||
{ name: 'Nsamankom Sentinel', description: 'Security monitoring with ancestral protection' },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'Identity',
|
||||
items: [
|
||||
{ name: 'OkraID', description: 'Soul-powered identity framework' },
|
||||
{ name: 'AkanAuth Sovereign Identity Plane', description: 'Sovereign authentication platform' },
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
return (
|
||||
<main className="min-h-screen bg-studio-black">
|
||||
{/* Header */}
|
||||
<header className="border-b border-studio-medium bg-studio-dark">
|
||||
<div className="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
|
||||
<Link href="/" className="text-2xl font-bold text-white">
|
||||
Phoenix <span className="text-phoenix-fire">Sankofa</span> Cloud
|
||||
</Link>
|
||||
<nav className="flex gap-4">
|
||||
<Link href="/" className="text-gray-400 hover:text-white">
|
||||
Home
|
||||
</Link>
|
||||
<Link href="/about" className="text-gray-400 hover:text-white">
|
||||
About
|
||||
</Link>
|
||||
<Link href="/manifesto" className="text-gray-400 hover:text-white">
|
||||
Manifesto
|
||||
</Link>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{/* Hero */}
|
||||
<section className="py-24 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h1 className="mb-6 text-5xl font-bold text-white md:text-6xl">
|
||||
Product Architecture
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300">
|
||||
Infrastructure services themed in Phoenix + Akan cosmology
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Products Grid */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-7xl space-y-16">
|
||||
{products.map((category) => (
|
||||
<div key={category.category}>
|
||||
<h2 className="mb-8 text-3xl font-bold text-white">
|
||||
{category.category}
|
||||
</h2>
|
||||
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
|
||||
{category.items.map((item) => (
|
||||
<Card key={item.name}>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-lg">{item.name}</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-gray-400">
|
||||
{item.description}
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA */}
|
||||
<section className="py-16 px-4">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h2 className="mb-6 text-3xl font-bold text-white">
|
||||
Ready to Build?
|
||||
</h2>
|
||||
<p className="mb-8 text-xl text-gray-400">
|
||||
Start your sovereign cloud journey today.
|
||||
</p>
|
||||
<Link href="/manifesto">
|
||||
<Button variant="phoenix" size="lg">Learn More</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
46
src/app/providers.tsx
Normal file
46
src/app/providers.tsx
Normal file
@@ -0,0 +1,46 @@
|
||||
'use client'
|
||||
|
||||
import { ApolloProvider } from '@apollo/client'
|
||||
import { apolloClient } from '@/lib/graphql/client'
|
||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
||||
import { useState } from 'react'
|
||||
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
|
||||
import { Toaster } from '@/components/ui/toaster'
|
||||
|
||||
export function Providers({ children }: { children: React.ReactNode }) {
|
||||
const [queryClient] = useState(
|
||||
() =>
|
||||
new QueryClient({
|
||||
defaultOptions: {
|
||||
queries: {
|
||||
staleTime: 60 * 1000, // 1 minute
|
||||
refetchOnWindowFocus: false,
|
||||
retry: (failureCount, error) => {
|
||||
// Don't retry on 4xx errors
|
||||
if (error && typeof error === 'object' && 'statusCode' in error) {
|
||||
const statusCode = error.statusCode as number
|
||||
if (statusCode >= 400 && statusCode < 500) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return failureCount < 3
|
||||
},
|
||||
},
|
||||
mutations: {
|
||||
retry: false,
|
||||
},
|
||||
},
|
||||
})
|
||||
)
|
||||
|
||||
return (
|
||||
<ApolloProvider client={apolloClient}>
|
||||
<QueryClientProvider client={queryClient}>
|
||||
{children}
|
||||
{process.env.NODE_ENV === 'development' && <ReactQueryDevtools initialIsOpen={false} />}
|
||||
<Toaster />
|
||||
</QueryClientProvider>
|
||||
</ApolloProvider>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user