Add GFTD marketplace landing page

This commit is contained in:
defiQUG
2026-07-30 20:38:04 -07:00
parent cf4d2ae16b
commit 2e7f434fb5
3 changed files with 183 additions and 43 deletions
@@ -6,7 +6,12 @@ import { signIn, useSession } from 'next-auth/react';
import { useCallback, useEffect, useState } from 'react';
import { partnerStackServices } from '@/lib/corporate-site-data';
import { gftdMarketplaceService } from '@/lib/gftd-marketplace';
import {
gftdMarketplaceGuardrails,
gftdMarketplacePersonaNeeds,
gftdMarketplaceService,
gftdMarketplaceSubscriptionTiers,
} from '@/lib/gftd-marketplace';
type ProductInfo = {
slug: string;
@@ -42,38 +47,6 @@ export default function MarketplaceEntitlementPage() {
const partnerMeta = [...partnerStackServices, gftdMarketplaceService].find((s) => s.href?.includes(slug));
const isGftd = slug === 'phoenix-gftd-directory';
const gftdSubscriptionTiers = [
{
name: 'Preview',
description: 'Evaluators, partners, and early adopters with public-safe demo data only.',
limits: 'No live restricted data, no authority claims, no production SLA.',
},
{
name: 'Professional',
description: 'Operators, integrators, and compliance teams.',
limits: 'Approved sources only, role-based access, bounded query depth, and rate limits.',
},
{
name: 'Institutional',
description: 'Regulated firms, marketplaces, and service providers.',
limits: 'Contractual use terms, approval gates, and stricter access control.',
},
{
name: 'Enterprise',
description: 'Market operators and platform teams.',
limits: 'Custom SLAs, tenant-specific redaction policies, and governance reporting.',
},
];
const gftdPersonaNeeds = [
'Compliance analyst: rights status, publication boundaries, and audit trails.',
'Integration engineer: stable API, live adapters, and predictable responses.',
'Marketplace operator: packaging, tiers, onboarding, and feature gating.',
'Legal counsel: evidence refs, disclaimers, and approval records.',
'Operations / SRE: health checks, observability snapshots, and runtime limits.',
'Institutional customer: approved data, support, and acceptance artifacts.',
];
const loadProduct = useCallback(async () => {
const res = await fetch(`/api/marketplace/products/${slug}`, {
credentials: 'include',
@@ -195,7 +168,7 @@ export default function MarketplaceEntitlementPage() {
Subscription tiers
</h3>
<div className="mt-4 space-y-3">
{gftdSubscriptionTiers.map((tier) => (
{gftdMarketplaceSubscriptionTiers.map((tier) => (
<div key={tier.name} className="rounded-md border border-white/5 bg-white/5 p-3">
<div className="flex items-center justify-between gap-4">
<span className="font-medium text-white">{tier.name}</span>
@@ -212,7 +185,7 @@ export default function MarketplaceEntitlementPage() {
User needs by persona
</h3>
<ul className="mt-4 space-y-2 text-sm text-sovereign-silver">
{gftdPersonaNeeds.map((item) => (
{gftdMarketplacePersonaNeeds.map((item) => (
<li key={item} className="rounded-md border border-white/5 bg-white/5 px-3 py-2">
{item}
</li>
@@ -280,15 +253,19 @@ export default function MarketplaceEntitlementPage() {
</section>
{isGftd ? (
<p className="mt-8 text-xs text-sovereign-silver">
GFTD is rights-aware entity intelligence, not legal authority, not a payment rail, and not a
license to republish restricted data.
</p>
<div className="mt-8 rounded-xl border border-white/10 bg-black/20 p-5">
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">Guardrails</h3>
<ul className="mt-3 space-y-2 text-sm text-sovereign-silver">
{gftdMarketplaceGuardrails.map((item) => (
<li key={item}>- {item}</li>
))}
</ul>
</div>
) : null}
<p className="mt-8 text-xs text-sovereign-silver">
Contract/PO-first billing automated Stripe checkout is on the roadmap. Operator Keycloak grants
run via <code className="rounded bg-black/30 px-1">grant-marketplace-entitlements-keycloak.sh</code>.
Contract/PO-first billing automated checkout is on the roadmap. Operator Keycloak grants run via{' '}
<code className="rounded bg-black/30 px-1">grant-marketplace-entitlements-keycloak.sh</code>.
</p>
</main>
);
+125
View File
@@ -0,0 +1,125 @@
import { ArrowRight, BookOpen, ShieldCheck, Users } from 'lucide-react';
import Link from 'next/link';
import { CorporateFooter } from '@/components/corporate/CorporateFooter';
import { CorporateHeader } from '@/components/corporate/CorporateHeader';
import {
gftdMarketplaceGuardrails,
gftdMarketplacePersonaNeeds,
gftdMarketplaceSubscriptionTiers,
} from '@/lib/gftd-marketplace';
export const metadata = {
title: 'GFTD Directory — Sankofa Marketplace',
description: 'Rights-aware entity intelligence with live approved source lanes and public-safe redaction.',
};
export default function GftdMarketplacePage() {
return (
<div className="flex min-h-screen flex-col bg-sovereign-obsidian text-sovereign-ivory">
<CorporateHeader />
<main className="mx-auto w-full max-w-6xl flex-1 px-4 py-16 sm:px-6 lg:px-8">
<p className="text-xs font-semibold uppercase tracking-wider text-sovereign-gold">
Sankofa Marketplace
</p>
<h1 className="mt-2 text-3xl font-bold tracking-tight sm:text-4xl">GFTD Directory</h1>
<p className="mt-4 max-w-3xl text-lg text-sovereign-ivory/70">
Rights-aware entity intelligence for approved live source lanes, redacted public-safe outputs,
subscription tiers, and bounded observability.
</p>
<div className="mt-10 grid gap-4 md:grid-cols-3">
{[
{
icon: ShieldCheck,
title: 'Rights-aware by default',
text: 'Public-safe outputs stay redacted, with source-rights and publication boundaries preserved.',
},
{
icon: BookOpen,
title: 'Evidence-backed',
text: 'Live source ingestion and observability stay tied to documented approval and review artifacts.',
},
{
icon: Users,
title: 'Marketplace-ready',
text: 'Subscription tiers and persona-based access are designed for institutional onboarding.',
},
].map((item) => {
const Icon = item.icon;
return (
<article
key={item.title}
className="rounded-lg border border-sovereign-bronze/25 bg-sovereign-midnight/40 p-5"
>
<Icon className="h-6 w-6 text-sovereign-gold" />
<h2 className="mt-3 text-lg font-semibold">{item.title}</h2>
<p className="mt-2 text-sm text-sovereign-ivory/60">{item.text}</p>
</article>
);
})}
</div>
<section className="mt-10 rounded-lg border border-sovereign-bronze/25 bg-sovereign-midnight/30 p-6">
<h2 className="text-xl font-semibold">Subscription tiers</h2>
<div className="mt-4 grid gap-3 md:grid-cols-2">
{gftdMarketplaceSubscriptionTiers.map((tier) => (
<div key={tier.name} className="rounded-md border border-white/10 bg-black/20 p-4">
<div className="flex items-center justify-between gap-4">
<h3 className="font-medium text-white">{tier.name}</h3>
</div>
<p className="mt-2 text-sm text-sovereign-ivory/70">{tier.description}</p>
<p className="mt-2 text-xs text-sovereign-ivory/55">{tier.limits}</p>
</div>
))}
</div>
</section>
<section className="mt-10 rounded-lg border border-sovereign-bronze/25 bg-sovereign-midnight/30 p-6">
<h2 className="text-xl font-semibold">Who it serves</h2>
<ul className="mt-4 grid gap-3 md:grid-cols-2">
{gftdMarketplacePersonaNeeds.map((item) => (
<li key={item} className="rounded-md border border-white/10 bg-black/20 px-4 py-3 text-sm text-sovereign-ivory/70">
{item}
</li>
))}
</ul>
</section>
<section className="mt-10 rounded-lg border border-sovereign-bronze/25 bg-sovereign-midnight/30 p-6">
<h2 className="text-xl font-semibold">Guardrails</h2>
<ul className="mt-4 space-y-2 text-sm text-sovereign-ivory/70">
{gftdMarketplaceGuardrails.map((item) => (
<li key={item}>- {item}</li>
))}
</ul>
</section>
<section className="mt-10 rounded-lg border border-sovereign-gold/30 bg-sovereign-midnight/40 p-6">
<h2 className="text-xl font-semibold">Next step</h2>
<p className="mt-2 max-w-3xl text-sm text-sovereign-ivory/65">
Review the subscription tiers, then request access through the entitlement flow. The listing is
designed to stay rights-aware and public-safe before any operator activation.
</p>
<div className="mt-6 flex flex-col gap-3 sm:flex-row">
<Link
href="/marketplace/entitlements/phoenix-gftd-directory"
className="inline-flex items-center gap-2 rounded-lg bg-sovereign-gold px-5 py-2.5 text-sm font-semibold text-sovereign-obsidian no-underline hover:bg-sovereign-ivory"
>
Request subscription <ArrowRight className="h-4 w-4" aria-hidden />
</Link>
<Link
href="https://gftd.d-bis.org/docs"
className="inline-flex items-center gap-2 rounded-lg border border-sovereign-bronze/40 px-5 py-2.5 text-sm font-semibold text-sovereign-ivory no-underline hover:border-sovereign-gold"
target="_blank"
rel="noopener noreferrer"
>
View public docs
</Link>
</div>
</section>
</main>
<CorporateFooter />
</div>
);
}
+40 -2
View File
@@ -1,11 +1,49 @@
import type { PartnerStackService } from '@/lib/corporate-site-data';
export const gftdMarketplaceSubscriptionTiers = [
{
name: 'Preview',
description: 'Evaluators, partners, and early adopters with public-safe demo data only.',
limits: 'No live restricted data, no authority claims, no production SLA.',
},
{
name: 'Professional',
description: 'Operators, integrators, and compliance teams.',
limits: 'Approved sources only, role-based access, bounded query depth, and rate limits.',
},
{
name: 'Institutional',
description: 'Regulated firms, marketplaces, and service providers.',
limits: 'Contractual use terms, approval gates, and stricter access control.',
},
{
name: 'Enterprise',
description: 'Market operators and platform teams.',
limits: 'Custom SLAs, tenant-specific redaction policies, and governance reporting.',
},
];
export const gftdMarketplacePersonaNeeds = [
'Compliance analyst: rights status, publication boundaries, and audit trails.',
'Integration engineer: stable API, live adapters, and predictable responses.',
'Marketplace operator: packaging, tiers, onboarding, and feature gating.',
'Legal counsel: evidence refs, disclaimers, and approval records.',
'Operations / SRE: health checks, observability snapshots, and runtime limits.',
'Institutional customer: approved data, support, and acceptance artifacts.',
];
export const gftdMarketplaceGuardrails = [
'Rights-aware entity intelligence only.',
'No legal authority claims.',
'No payment rail claims.',
'No redistribution of restricted data without rights approval.',
];
export const gftdMarketplaceService: PartnerStackService = {
name: 'GFTD Directory',
href: '/marketplace/entitlements/phoenix-gftd-directory',
href: '/marketplace/gftd',
description:
'Rights-aware entity intelligence with live approved source lanes, redacted public-safe outputs, subscription tiers, and bounded observability.',
serviceUrl: 'https://gftd.d-bis.org',
category: 'Internet registry & compliance',
};