Add GFTD marketplace landing page
This commit is contained in:
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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',
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user