Polish GFTD marketplace access copy

This commit is contained in:
defiQUG
2026-07-30 22:44:54 -07:00
parent ea5da55669
commit ed7b9cbb67
4 changed files with 91 additions and 43 deletions
@@ -186,9 +186,7 @@ export default function MarketplaceEntitlementPage() {
<div className="mt-6 grid gap-4 md:grid-cols-2">
<article className="rounded-lg border border-white/10 bg-black/20 p-4">
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">
Subscription tiers
</h3>
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">Access tiers</h3>
<div className="mt-4 space-y-3">
{gftdMarketplaceSubscriptionTiers.map((tier) => (
<div key={tier.name} className="rounded-md border border-white/5 bg-white/5 p-3">
@@ -203,9 +201,7 @@ export default function MarketplaceEntitlementPage() {
</article>
<article className="rounded-lg border border-white/10 bg-black/20 p-4">
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">
User needs by persona
</h3>
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">Persona needs</h3>
<ul className="mt-4 space-y-2 text-sm text-sovereign-silver">
{gftdMarketplacePersonaNeeds.map((item) => (
<li key={item} className="rounded-md border border-white/5 bg-white/5 px-3 py-2">
@@ -253,14 +249,14 @@ export default function MarketplaceEntitlementPage() {
onClick={() => signIn(undefined, { callbackUrl: `/marketplace/entitlements/${slug}` })}
className="mt-6 rounded-lg bg-teal-600 px-5 py-2.5 text-sm font-medium text-white hover:bg-teal-500"
>
Sign in to subscribe
Sign in to request access
</button>
) : hasActive ? (
<p className="mt-6 text-emerald-400">Active entitlements: {activeKeys.join(', ')}</p>
) : hasPending ? (
<p className="mt-6 text-amber-300">
Pending operator activation. Use the landing page to review the tier and guardrail summary
before the workspace request is approved.
Pending operator activation. Review the access tier and guardrail summary on the listing before the
workspace request is approved.
</p>
) : (
<button
@@ -269,7 +265,7 @@ export default function MarketplaceEntitlementPage() {
onClick={handleSubscribe}
className="mt-6 rounded-lg bg-teal-600 px-5 py-2.5 text-sm font-medium text-white hover:bg-teal-500 disabled:opacity-60"
>
{submitting ? 'Submitting…' : isGftd ? 'Request GFTD access' : 'Request subscription'}
{submitting ? 'Submitting…' : 'Request access'}
</button>
)}
@@ -289,7 +285,7 @@ export default function MarketplaceEntitlementPage() {
) : null}
<p className="mt-8 text-xs text-sovereign-silver">
Contract/PO-first billing automated checkout is on the roadmap. Operator Keycloak grants run via{' '}
Contract/PO-first billing remains in place; 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>
+31 -13
View File
@@ -5,13 +5,14 @@ import { CorporateFooter } from '@/components/corporate/CorporateFooter';
import { CorporateHeader } from '@/components/corporate/CorporateHeader';
import {
gftdMarketplaceGuardrails,
gftdMarketplaceFaq,
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.',
description: 'Institutional entity intelligence with approved live source lanes, public-safe redaction, and bounded access.',
};
export default function GftdMarketplacePage() {
@@ -24,26 +25,26 @@ export default function GftdMarketplacePage() {
</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.
Institutional entity intelligence with approved live source lanes, public-safe redaction,
access tiers, and bounded observability.
</p>
<div className="mt-10 grid gap-4 md:grid-cols-3">
{[
{
icon: ShieldCheck,
title: 'Rights-aware by default',
title: 'Rights-governed by design',
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.',
text: 'Live source ingestion and observability remain tied to documented approval and review artifacts.',
},
{
icon: Users,
title: 'Marketplace-ready',
text: 'Subscription tiers and persona-based access are designed for institutional onboarding.',
text: 'Access tiers and persona-based controls are designed for institutional onboarding.',
},
].map((item) => {
const Icon = item.icon;
@@ -61,7 +62,7 @@ export default function GftdMarketplacePage() {
</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>
<h2 className="text-xl font-semibold">Access 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">
@@ -76,7 +77,7 @@ export default function GftdMarketplacePage() {
</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>
<h2 className="text-xl font-semibold">Intended users</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">
@@ -87,7 +88,7 @@ export default function GftdMarketplacePage() {
</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>
<h2 className="text-xl font-semibold">Publication guardrails</h2>
<ul className="mt-4 space-y-2 text-sm text-sovereign-ivory/70">
{gftdMarketplaceGuardrails.map((item) => (
<li key={item}>- {item}</li>
@@ -95,18 +96,35 @@ export default function GftdMarketplacePage() {
</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">Frequently asked questions</h2>
<div className="mt-4 space-y-3">
{gftdMarketplaceFaq.map((item) => (
<details
key={item.question}
className="rounded-md border border-white/10 bg-black/20 px-4 py-3"
>
<summary className="cursor-pointer list-none text-sm font-semibold text-white">
{item.question}
</summary>
<p className="mt-2 text-sm text-sovereign-ivory/70">{item.answer}</p>
</details>
))}
</div>
</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.
Review the access tiers and frequently asked questions, then request access through the entitlement
workflow. The listing remains rights-governed 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 />
Request access <ArrowRight className="h-4 w-4" aria-hidden />
</Link>
<Link
href="https://gftd.d-bis.org/docs"
@@ -114,7 +132,7 @@ export default function GftdMarketplacePage() {
target="_blank"
rel="noopener noreferrer"
>
View public docs
Review public docs
</Link>
</div>
</section>
+22 -11
View File
@@ -28,14 +28,14 @@ export default function MarketplacePage() {
<p className="text-xs font-semibold uppercase tracking-wider text-sovereign-gold">Phoenix marketplace</p>
<h1 className="mt-2 text-3xl font-bold tracking-tight sm:text-4xl">Sovereign platform catalog</h1>
<p className="mt-4 text-lg text-sovereign-ivory/70">
Subscribe to ledger, identity, registry, wallet, orchestration, and Chain 138 onboarding services.
Sign in to manage entitlements and deployments.
Request access to ledger, identity, registry, wallet, orchestration, and Chain 138 onboarding
services. Sign in to manage entitlements and deployments.
</p>
<Link
href={ECOSYSTEM_SIGN_IN_PATH}
className="mt-8 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"
>
Sign in to subscribe
Sign in to request access
<ArrowRight className="h-4 w-4" aria-hidden />
</Link>
</div>
@@ -111,14 +111,25 @@ export default function MarketplacePage() {
<h3 className="mt-1 text-base font-semibold">{service.name}</h3>
<p className="mt-2 text-sm text-sovereign-ivory/60">{service.description}</p>
{service.href ? (
<Link
href={service.href}
className="mt-4 inline-flex items-center gap-1 text-sm font-medium text-sovereign-gold no-underline hover:text-sovereign-ivory"
{...(service.external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}
>
View offering
<ArrowRight className="h-3.5 w-3.5" aria-hidden />
</Link>
<div className="mt-4 flex flex-wrap gap-3">
<Link
href={service.href}
className="inline-flex items-center gap-1 text-sm font-medium text-sovereign-gold no-underline hover:text-sovereign-ivory"
{...(service.external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}
>
View offering
<ArrowRight className="h-3.5 w-3.5" aria-hidden />
</Link>
{service.name === 'GFTD Directory' ? (
<Link
href="/marketplace/entitlements/phoenix-gftd-directory"
className="inline-flex items-center gap-1 text-sm font-medium text-sovereign-ivory no-underline hover:text-sovereign-gold"
>
Request access
<ArrowRight className="h-3.5 w-3.5" aria-hidden />
</Link>
) : null}
</div>
) : null}
</article>
))}
+31 -8
View File
@@ -7,31 +7,31 @@ export interface GftdMarketplaceService extends PartnerStackService {
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.',
description: 'Evaluators, partners, and early adopters using public-safe demonstration data only.',
limits: 'No live restricted data, no authority claims, and no production SLA.',
},
{
name: 'Professional',
description: 'Operators, integrators, and compliance teams.',
description: 'Operators, integrators, and compliance teams with approved access.',
limits: 'Approved sources only, role-based access, bounded query depth, and rate limits.',
},
{
name: 'Institutional',
description: 'Regulated firms, marketplaces, and service providers.',
description: 'Regulated firms, marketplaces, and service providers operating under review.',
limits: 'Contractual use terms, approval gates, and stricter access control.',
},
{
name: 'Enterprise',
description: 'Market operators and platform teams.',
description: 'Market operators and platform teams requiring tenant-specific governance.',
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.',
'Integration engineer: stable APIs, live adapters, and predictable responses.',
'Marketplace operator: packaging, tiers, onboarding, and feature gating.',
'Legal counsel: evidence refs, disclaimers, and approval records.',
'Legal counsel: evidence references, disclaimers, and approval records.',
'Operations / SRE: health checks, observability snapshots, and runtime limits.',
'Institutional customer: approved data, support, and acceptance artifacts.',
];
@@ -43,12 +43,35 @@ export const gftdMarketplaceGuardrails = [
'No redistribution of restricted data without rights approval.',
];
export const gftdMarketplaceFaq = [
{
question: 'What does GFTD provide?',
answer:
'A rights-aware entity directory with approved live source lanes, public-safe redaction, and bounded observability for institutional use.',
},
{
question: 'Does access grant legal authority or payment rights?',
answer:
'No. Marketplace access only governs use of the service. It does not confer legal authority, licensing, or payment authorization.',
},
{
question: 'What is required before access is activated?',
answer:
'The approved source-rights record, marketplace entitlement review, and operator activation path must all be satisfied.',
},
{
question: 'Can restricted fields be republished?',
answer:
'Only when the relevant rights, publication, and redaction controls explicitly permit it. Public-safe outputs remain redacted by default.',
},
];
export const gftdMarketplaceService: GftdMarketplaceService = {
name: 'GFTD Directory',
href: '/marketplace/gftd',
productSlug: 'phoenix-gftd-directory',
description:
'Rights-aware entity intelligence with live approved source lanes, redacted public-safe outputs, subscription tiers, and bounded observability.',
'Institutional entity intelligence with approved live source lanes, public-safe redaction, access tiers, and bounded observability.',
serviceUrl: 'https://gftd.d-bis.org',
category: 'Internet registry & compliance',
};