From 2e7f434fb5eb05ee03e466f7b2b6616ad5a48aee Mon Sep 17 00:00:00 2001 From: defiQUG Date: Thu, 30 Jul 2026 20:38:04 -0700 Subject: [PATCH] Add GFTD marketplace landing page --- .../marketplace/entitlements/[slug]/page.tsx | 59 +++------ portal/src/app/marketplace/gftd/page.tsx | 125 ++++++++++++++++++ portal/src/lib/gftd-marketplace.ts | 42 +++++- 3 files changed, 183 insertions(+), 43 deletions(-) create mode 100644 portal/src/app/marketplace/gftd/page.tsx diff --git a/portal/src/app/marketplace/entitlements/[slug]/page.tsx b/portal/src/app/marketplace/entitlements/[slug]/page.tsx index 1eeb812..e94d6fb 100644 --- a/portal/src/app/marketplace/entitlements/[slug]/page.tsx +++ b/portal/src/app/marketplace/entitlements/[slug]/page.tsx @@ -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
- {gftdSubscriptionTiers.map((tier) => ( + {gftdMarketplaceSubscriptionTiers.map((tier) => (
{tier.name} @@ -212,7 +185,7 @@ export default function MarketplaceEntitlementPage() { User needs by persona
    - {gftdPersonaNeeds.map((item) => ( + {gftdMarketplacePersonaNeeds.map((item) => (
  • {item}
  • @@ -280,15 +253,19 @@ export default function MarketplaceEntitlementPage() { {isGftd ? ( -

    - GFTD is rights-aware entity intelligence, not legal authority, not a payment rail, and not a - license to republish restricted data. -

    +
    +

    Guardrails

    +
      + {gftdMarketplaceGuardrails.map((item) => ( +
    • - {item}
    • + ))} +
    +
    ) : null}

    - Contract/PO-first billing — automated Stripe checkout is on the roadmap. Operator Keycloak grants - run via grant-marketplace-entitlements-keycloak.sh. + Contract/PO-first billing — automated checkout is on the roadmap. Operator Keycloak grants run via{' '} + grant-marketplace-entitlements-keycloak.sh.

    ); diff --git a/portal/src/app/marketplace/gftd/page.tsx b/portal/src/app/marketplace/gftd/page.tsx new file mode 100644 index 0000000..a90e179 --- /dev/null +++ b/portal/src/app/marketplace/gftd/page.tsx @@ -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 ( +
    + +
    +

    + Sankofa Marketplace +

    +

    GFTD Directory

    +

    + Rights-aware entity intelligence for approved live source lanes, redacted public-safe outputs, + subscription tiers, and bounded observability. +

    + +
    + {[ + { + 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 ( +
    + +

    {item.title}

    +

    {item.text}

    +
    + ); + })} +
    + +
    +

    Subscription tiers

    +
    + {gftdMarketplaceSubscriptionTiers.map((tier) => ( +
    +
    +

    {tier.name}

    +
    +

    {tier.description}

    +

    {tier.limits}

    +
    + ))} +
    +
    + +
    +

    Who it serves

    +
      + {gftdMarketplacePersonaNeeds.map((item) => ( +
    • + {item} +
    • + ))} +
    +
    + +
    +

    Guardrails

    +
      + {gftdMarketplaceGuardrails.map((item) => ( +
    • - {item}
    • + ))} +
    +
    + +
    +

    Next step

    +

    + 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. +

    +
    + + Request subscription + + + View public docs + +
    +
    +
    + +
    + ); +} diff --git a/portal/src/lib/gftd-marketplace.ts b/portal/src/lib/gftd-marketplace.ts index ffd21b1..43efd4e 100644 --- a/portal/src/lib/gftd-marketplace.ts +++ b/portal/src/lib/gftd-marketplace.ts @@ -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', }; -