Add GFTD marketplace listing and discovery
This commit is contained in:
@@ -1,7 +1,3 @@
|
||||
[submodule "marketplace/as4-411"]
|
||||
path = marketplace/as4-411
|
||||
url = https://gitea.d-bis.org/d-bis/as4-411.git
|
||||
[submodule "portal/src/data/project-atlas"]
|
||||
path = portal/src/data/project-atlas
|
||||
url = [email protected]:Sankofa_Phoenix/projectAtlas.git
|
||||
branch = main
|
||||
|
||||
@@ -196,6 +196,26 @@
|
||||
"productPath": "/marketplace/products/phoenix-aegis-vault-cti",
|
||||
"managePath": "/marketplace/entitlements/phoenix-aegis-vault-cti"
|
||||
}
|
||||
},
|
||||
{
|
||||
"productSlug": "phoenix-gftd-directory",
|
||||
"displayName": "GFTD Directory",
|
||||
"entitlementKeys": ["GFTD_DIRECTORY_ENTITLED"],
|
||||
"publisher": "phoenix-cloud-services",
|
||||
"category": "INTERNET_REGISTRY",
|
||||
"onboardingRunbook": "docs/marketplace/sovereign-stack/gftd-directory-service.md",
|
||||
"catalogSkus": [
|
||||
"gftd-preview",
|
||||
"gftd-professional",
|
||||
"gftd-institutional",
|
||||
"gftd-enterprise"
|
||||
],
|
||||
"fulfillmentMode": "operator_provisioned",
|
||||
"status": "preview",
|
||||
"surfaces": {
|
||||
"productPath": "/marketplace/products/phoenix-gftd-directory",
|
||||
"managePath": "/marketplace/entitlements/phoenix-gftd-directory"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ interface ServiceDefinition {
|
||||
basePrice?: number
|
||||
currency?: string
|
||||
billingPeriod?: string
|
||||
billingModel?: string
|
||||
quoteRequired?: boolean
|
||||
usageRates?: Record<string, any>
|
||||
freeTier?: {
|
||||
requestsPerMonth?: number
|
||||
@@ -488,7 +490,7 @@ const services: ServiceDefinition[] = [
|
||||
name: 'DBIS B2B Integration Hub',
|
||||
slug: 'phoenix-b2b-integration-hub',
|
||||
category: 'PLATFORM_SERVICES',
|
||||
description: 'Enterprise B2B orchestration for DBIS and OMNL — EDI, file transfer, PEPPOL and EBICS fan-out to CanonicalMessage and Fineract.',
|
||||
description: 'Enterprise B2B orchestration for DBIS and OMNL — EDI, file transfer, PEPPOL, EBICS, and AS4 fan-out to CanonicalMessage and Fineract.',
|
||||
shortDescription: 'B2B orchestration hub for DBIS and OMNL',
|
||||
tags: ['b2b', 'edi', 'integration', 'platform'],
|
||||
featured: true,
|
||||
@@ -538,6 +540,28 @@ const services: ServiceDefinition[] = [
|
||||
quoteRequired: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'DBIS AS4 Gateway',
|
||||
slug: 'phoenix-as4-gateway',
|
||||
category: 'FINANCIAL_MESSAGING',
|
||||
description: 'Standalone AS4/eBMS3 gateway for external B2B document exchange with canonical message handoff into the DBIS B2B Integration Hub.',
|
||||
shortDescription: 'AS4/eBMS3 external gateway',
|
||||
tags: ['as4', 'ebms3', 'b2b', 'financial-messaging'],
|
||||
featured: false,
|
||||
documentationUrl: 'https://docs.sankofa.nexus/marketplace/sovereign-stack/as4-gateway-service',
|
||||
metadata: {
|
||||
architecture: 'docs/marketplace/sovereign-stack/as4-gateway-service.md',
|
||||
entitlement: 'AS4_GATEWAY_ENTITLED',
|
||||
status: 'operator_ready_external_pending'
|
||||
},
|
||||
pricingType: 'SUBSCRIPTION',
|
||||
pricingConfig: {
|
||||
currency: 'USD',
|
||||
billingPeriod: 'MONTHLY',
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Chain 138 Participant Onboarding',
|
||||
slug: 'phoenix-chain138-participant-onboard',
|
||||
@@ -592,6 +616,29 @@ const services: ServiceDefinition[] = [
|
||||
quoteRequired: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'HSM/PKI for PCI and Tokenization',
|
||||
slug: 'phoenix-hsm-pki-pci-tokenization',
|
||||
category: 'SECURITY_SERVICES',
|
||||
description: 'Managed HSM, PKI, key ceremony, certificate lifecycle, PCI key controls, and tokenization enablement for regulated banking tenants.',
|
||||
shortDescription: 'HSM/PKI service for PCI and tokenization',
|
||||
tags: ['hsm', 'pki', 'pci', 'tokenization', 'banking'],
|
||||
featured: false,
|
||||
documentationUrl: 'https://docs.sankofa.nexus/marketplace/sovereign-stack/hsm-pki-pci-tokenization-service',
|
||||
metadata: {
|
||||
architecture: 'docs/marketplace/sovereign-stack/hsm-pki-pci-tokenization-service.md',
|
||||
entitlement: 'HSM_PKI_TOKENIZATION_ENTITLED',
|
||||
targetTenants: ['OMNL', 'zBank', 'NovaBank', 'Ananka Bank'],
|
||||
status: 'planned'
|
||||
},
|
||||
pricingType: 'SUBSCRIPTION',
|
||||
pricingConfig: {
|
||||
currency: 'USD',
|
||||
billingPeriod: 'MONTHLY',
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'OpenPayd Financial Services Connector',
|
||||
slug: 'phoenix-openpayd-connector',
|
||||
@@ -617,6 +664,111 @@ const services: ServiceDefinition[] = [
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'MTN Developer Platform Connector',
|
||||
slug: 'phoenix-mtn-developer-platform',
|
||||
category: 'PLATFORM_SERVICES',
|
||||
description: 'Operator-provisioned MTN connector for Mobile Money, messaging, payment, customer, security, and TMF APIs for Phoenix Financial and Telecom Cloud subscribers.',
|
||||
shortDescription: 'MTN Developer Platform connector for financial and telecom cloud subscribers',
|
||||
tags: ['mtn', 'mobile-money', 'telecom', 'payments', 'messaging', 'oauth', 'platform'],
|
||||
featured: false,
|
||||
documentationUrl: 'https://docs.sankofa.nexus/marketplace/sovereign-stack/mtn-developer-platform-service',
|
||||
metadata: {
|
||||
architecture: 'docs/marketplace/sovereign-stack/mtn-developer-platform-service.md',
|
||||
entitlement: 'MTN_DEVELOPER_PLATFORM_ENTITLED',
|
||||
manifestRef: 'config/mtn-developer-platform-marketplace.v1.json',
|
||||
targetTenants: ['DBIS', 'OMNL', 'zBank', 'NovaBank', 'Ananka Bank'],
|
||||
fulfillmentMode: 'operator_provisioned',
|
||||
status: 'planned_mtn_onboarding_required',
|
||||
gatedCapabilities: ['mobile-money', 'telecom-catalog', 'country-approval-matrix']
|
||||
},
|
||||
pricingType: 'SUBSCRIPTION',
|
||||
pricingConfig: {
|
||||
currency: 'USD',
|
||||
billingPeriod: 'MONTHLY',
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'TRISA Travel Rule Gateway',
|
||||
slug: 'phoenix-trisa-travel-rule',
|
||||
category: 'FINANCIAL_MESSAGING',
|
||||
description: 'Operator-provisioned TRISA and IVMS101 gateway for VASP Travel Rule payload exchange, mTLS identity, peer discovery, and compliance audit evidence in Phoenix Financial Cloud.',
|
||||
shortDescription: 'TRISA and IVMS101 Travel Rule gateway for VASP compliance exchange',
|
||||
tags: ['trisa', 'travel-rule', 'ivms101', 'vasp', 'mtls', 'financial-messaging'],
|
||||
featured: false,
|
||||
documentationUrl: 'https://docs.sankofa.nexus/marketplace/sovereign-stack/trisa-travel-rule-service',
|
||||
metadata: {
|
||||
architecture: 'docs/marketplace/sovereign-stack/trisa-travel-rule-service.md',
|
||||
entitlement: 'TRISA_TRAVEL_RULE_ENTITLED',
|
||||
manifestRef: 'config/trisa-travel-rule-marketplace.v1.json',
|
||||
targetTenants: ['DBIS', 'OMNL', 'zBank', 'NovaBank', 'Ananka Bank'],
|
||||
fulfillmentMode: 'operator_provisioned',
|
||||
status: 'planned_directory_and_compliance_approval_required',
|
||||
gatedCapabilities: ['mainnet_directory', 'production_counterparties', 'asset_movement_handoff']
|
||||
},
|
||||
pricingType: 'SUBSCRIPTION',
|
||||
pricingConfig: {
|
||||
currency: 'USD',
|
||||
billingPeriod: 'MONTHLY',
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'GFTD Directory',
|
||||
slug: 'phoenix-gftd-directory',
|
||||
category: 'INTERNET_REGISTRY',
|
||||
description: 'Rights-aware entity intelligence for approved live source lanes, redacted public-safe views, subscription tiers, and bounded observability through Sankofa Marketplace.',
|
||||
shortDescription: 'Rights-aware entity directory with live source lanes and public-safe redaction',
|
||||
tags: ['gftd', 'directory', 'registry', 'redaction', 'observability', 'subscription', 'marketplace'],
|
||||
featured: false,
|
||||
documentationUrl: 'https://docs.sankofa.nexus/marketplace/sovereign-stack/gftd-directory-service',
|
||||
metadata: {
|
||||
architecture: 'docs/marketplace/sovereign-stack/gftd-directory-service.md',
|
||||
entitlement: 'GFTD_DIRECTORY_ENTITLED',
|
||||
fulfillmentMode: 'operator_provisioned',
|
||||
status: 'preview',
|
||||
subscriptionTiers: ['preview', 'professional', 'institutional', 'enterprise'],
|
||||
personaMatrix: ['compliance-analyst', 'integration-engineer', 'marketplace-operator', 'legal-counsel', 'operations-sre', 'product-owner', 'institutional-customer'],
|
||||
publicValueProposition: 'Rights-aware entity intelligence with redacted public outputs, live approved source lanes, and bounded observability.',
|
||||
gatedCapabilities: ['live_source_lanes', 'redacted_public_views', 'bounded_observability']
|
||||
},
|
||||
pricingType: 'SUBSCRIPTION',
|
||||
pricingConfig: {
|
||||
currency: 'USD',
|
||||
billingPeriod: 'MONTHLY',
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'EAC AppChain',
|
||||
slug: 'phoenix-eac-appchain',
|
||||
category: 'PLATFORM_SERVICES',
|
||||
description: 'Operator-provisioned Universal Enterprise State Network for connectors, canonical state, events, workflows, identity graph, audit, policy, and AI context boundaries.',
|
||||
shortDescription: 'Canonical application fabric and enterprise state network',
|
||||
tags: ['appchain', 'connectors', 'canonical-state', 'workflow', 'ai-runtime', 'audit'],
|
||||
featured: false,
|
||||
documentationUrl: 'https://docs.sankofa.nexus/marketplace/sovereign-stack/eac-appchain-service',
|
||||
metadata: {
|
||||
architecture: 'docs/marketplace/sovereign-stack/eac-appchain-service.md',
|
||||
entitlement: 'EAC_APPCHAIN_ENTITLED',
|
||||
manifestRef: 'config/eac-appchain-marketplace.v1.json',
|
||||
targetTenants: ['DBIS', 'OMNL', 'zBank', 'NovaBank', 'Ananka Bank'],
|
||||
fulfillmentMode: 'operator_provisioned',
|
||||
status: 'planned_sankofa_key_handoff_required',
|
||||
keyHandoff: 'Sankofa returns secret references and key metadata only; no plaintext keys in Marketplace records.'
|
||||
},
|
||||
pricingType: 'SUBSCRIPTION',
|
||||
pricingConfig: {
|
||||
currency: 'USD',
|
||||
billingPeriod: 'MONTHLY',
|
||||
billingModel: 'enterprise_contract',
|
||||
quoteRequired: true,
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -26,6 +26,10 @@ The Sovereign Stack is a comprehensive set of services designed to replace relia
|
||||
8. **[Phoenix Audit Service](./audit-service.md)** - Immutable audit logs and WORM archive
|
||||
9. **[Phoenix Observability Stack](./observability.md)** - Distributed tracing, structured logs, SLOs
|
||||
|
||||
### Registry Services
|
||||
|
||||
10. **[GFTD Directory](./gftd-directory-service.md)** - Rights-aware entity intelligence, redaction, and bounded observability
|
||||
|
||||
## Guiding Principles
|
||||
|
||||
1. **No provider is System of Record (SoR)**
|
||||
@@ -57,7 +61,7 @@ All services follow a consistent architecture pattern:
|
||||
## Getting Started
|
||||
|
||||
1. Browse services in the [Sankofa Marketplace](https://portal.sankofa.nexus/marketplace)
|
||||
2. Review service documentation for integration details
|
||||
2. Review service documentation for integration details, including the GFTD Directory offering
|
||||
3. Subscribe to services via the marketplace
|
||||
4. Use API keys for authentication
|
||||
5. Monitor usage and costs via the billing dashboard
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
# GFTD Directory
|
||||
|
||||
## Summary
|
||||
|
||||
The GFTD Directory is a rights-aware, operator-provisioned Sankofa Marketplace
|
||||
service for teams that need verified entity intelligence, redacted public-safe
|
||||
views, and bounded runtime observability.
|
||||
|
||||
It packages the DBIS Global Financial Trust Directory as a marketplace offering
|
||||
with clear source-rights boundaries, subscription tiers, and persona-specific
|
||||
value.
|
||||
|
||||
## Entitlement
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Product slug | `phoenix-gftd-directory` |
|
||||
| Entitlement flag | `GFTD_DIRECTORY_ENTITLED` |
|
||||
| Fulfillment mode | `operator_provisioned` |
|
||||
| Manage path | `/marketplace/entitlements/phoenix-gftd-directory` |
|
||||
| Marketplace status | `preview` |
|
||||
|
||||
## Subscription Tiers
|
||||
|
||||
| Tier | Who it is for | What it includes | Limits and controls |
|
||||
| --- | --- | --- | --- |
|
||||
| Preview | Evaluators, partners, and early adopters | Public-safe homepage, limited samples, fixture-backed demo data, redaction examples, and basic docs | No live restricted data, no authority claims, no production SLA |
|
||||
| Professional | Operators, integrators, and compliance teams | Live approved source lanes, API access, bounded query depth, refresh alerts, and audit snapshots | Approved sources only, role-based access, and rate limits |
|
||||
| Institutional | Regulated firms, marketplaces, and service providers | Multi-source coverage, evidence pack exports, onboarding and acceptance artifacts, and observability status | Contractual use terms, approval gates, and stricter access control |
|
||||
| Enterprise | Market operators and platform teams | Custom SLAs, dedicated onboarding, tenant-specific redaction policies, integration support, and governance reporting | Bespoke legal and compliance review with scoped deployment |
|
||||
|
||||
## User Needs By Persona
|
||||
|
||||
| Persona | What they need | Why they subscribe | What matters most |
|
||||
| --- | --- | --- | --- |
|
||||
| Compliance analyst | Verified source-rights status, publication boundaries, audit trails | To prove what can and cannot be published | Traceability and redaction correctness |
|
||||
| Integration engineer | Stable API, live source adapters, query-depth controls | To wire GFTD into internal tools | Reliability, docs, predictable responses |
|
||||
| Marketplace operator | Packaging, tiers, onboarding, feature gating | To sell and support the service | Clear commercial segmentation |
|
||||
| Legal counsel | Rights evidence, terms references, disclaimers, approval records | To approve the public surface | Low-risk wording and explicit boundaries |
|
||||
| Operations / SRE | Health checks, observability snapshots, runtime limits | To keep the service safe in production | Monitoring, bounded behavior, incident signals |
|
||||
| Product owner | Value proposition, user segmentation, adoption evidence | To position the offering | Clarity and defensibility |
|
||||
| Institutional customer | Approved data, support, service acceptance | To use it in workflows | Trust, supportability, contractual clarity |
|
||||
|
||||
## Public Homepage Value Proposition
|
||||
|
||||
**Headline**
|
||||
|
||||
GFTD delivers rights-aware, production-safe entity intelligence.
|
||||
|
||||
**Subheadline**
|
||||
|
||||
Access approved live source lanes, redacted public outputs, bounded
|
||||
observability, and evidence-backed operational controls through Sankofa
|
||||
Marketplace.
|
||||
|
||||
**Core benefits**
|
||||
|
||||
- Verified source-rights and publication boundaries.
|
||||
- Live approved data where rights allow it.
|
||||
- Redacted, public-safe outputs by default.
|
||||
- Bounded query depth and operator-safe runtime controls.
|
||||
- Audit-ready evidence and onboarding artifacts.
|
||||
- Marketplace-ready packaging for institutional adoption.
|
||||
|
||||
**What it is not**
|
||||
|
||||
- It is not a claim of legal authority.
|
||||
- It is not a payment rail.
|
||||
- It is not a license to republish restricted data.
|
||||
- It is not a substitute for counsel or compliance review.
|
||||
|
||||
**Call to action**
|
||||
|
||||
- View the public-safe demo.
|
||||
- Review subscription tiers.
|
||||
- Request institutional onboarding.
|
||||
- Explore approved live source coverage.
|
||||
|
||||
## Operator Boundary
|
||||
|
||||
Marketplace listing alone does not grant authority to republish restricted
|
||||
source data, confer banking or payment rights, authorize licensing, or imply
|
||||
source-provider approval beyond the approved rights record.
|
||||
|
||||
The service remains subject to source-rights review, publication and redaction
|
||||
policy, and adoption evidence gates before any restricted or institution-facing
|
||||
surface is enabled.
|
||||
|
||||
## References
|
||||
|
||||
- GFTD live public endpoint: `https://gftd.d-bis.org`
|
||||
- GFTD monorepo: `https://gitea.d-bis.org/Sankofa_Phoenix/gftd-monorepo.git`
|
||||
- Public-safe docs summary: `https://gftd.d-bis.org/docs`
|
||||
- GFTD live source ingestion runbook:
|
||||
`/home/intlc/projects/gftd_monorepo/docs/runbooks/live-source-ingestion.md`
|
||||
- GFTD publication and redaction pack:
|
||||
`/home/intlc/projects/gftd_monorepo/docs/runbooks/publication-redaction-pack.md`
|
||||
Submodule portal/src/data/project-atlas deleted from 7c5d22ad3a
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
repo_root="$(git rev-parse --show-toplevel)"
|
||||
submodule_path="${PROJECT_ATLAS_SUBMODULE_PATH:-portal/src/data/project-atlas}"
|
||||
ssh_key="${PROJECT_ATLAS_SSH_PRIVATE_KEY:-}"
|
||||
key_file="${RUNNER_TEMP:-/tmp}/project-atlas-submodule-key"
|
||||
|
||||
# The Project Atlas submodule lives in Gitea and must be fetched with a
|
||||
# read-only deploy key stored in PROJECT_ATLAS_SSH_PRIVATE_KEY.
|
||||
if git -C "$repo_root" submodule status -- "$submodule_path" | grep -q '^-'; then
|
||||
if [[ -z "$ssh_key" ]]; then
|
||||
echo "PROJECT_ATLAS_SSH_PRIVATE_KEY is required to initialize the private projectAtlas submodule." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
install -d -m 700 "$HOME/.ssh"
|
||||
printf '%s\n' "$ssh_key" > "$key_file"
|
||||
chmod 600 "$key_file"
|
||||
ssh-keyscan -H gitea.d-bis.org >> "$HOME/.ssh/known_hosts"
|
||||
|
||||
git -C "$repo_root" submodule sync -- "$submodule_path"
|
||||
GIT_SSH_COMMAND="ssh -i $key_file -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes" \
|
||||
git -C "$repo_root" submodule update --init --recursive -- "$submodule_path"
|
||||
fi
|
||||
@@ -8,7 +8,7 @@ import { Input } from '@/components/ui/input'
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||
import { Badge } from '@/components/ui/badge'
|
||||
import { ProductCard } from '@/components/marketplace/ProductCard'
|
||||
import { Search, Filter } from 'lucide-react'
|
||||
import { Search, Filter, ArrowRight, ShieldCheck, BookOpen } from 'lucide-react'
|
||||
|
||||
const PRODUCT_CATEGORIES = [
|
||||
{ value: 'COMPUTE', label: 'Compute' },
|
||||
@@ -75,6 +75,48 @@ export default function MarketplacePage() {
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<Card className="mb-8 border-border/60 bg-gradient-to-r from-slate-950 via-slate-900 to-slate-800 text-white">
|
||||
<CardHeader>
|
||||
<div className="flex flex-wrap items-center gap-2 mb-2">
|
||||
<Badge variant="secondary" className="bg-white/10 text-white hover:bg-white/20">
|
||||
New
|
||||
</Badge>
|
||||
<Badge variant="outline" className="border-white/20 text-white">
|
||||
Internet Registry
|
||||
</Badge>
|
||||
</div>
|
||||
<CardTitle className="text-2xl">GFTD Directory</CardTitle>
|
||||
<CardDescription className="text-slate-300">
|
||||
Rights-aware entity intelligence with live approved source lanes, redacted public-safe outputs, and bounded observability.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
|
||||
<div className="flex flex-wrap gap-4 text-sm text-slate-300">
|
||||
<span className="inline-flex items-center gap-2">
|
||||
<ShieldCheck className="h-4 w-4" />
|
||||
Source-rights gated
|
||||
</span>
|
||||
<span className="inline-flex items-center gap-2">
|
||||
<BookOpen className="h-4 w-4" />
|
||||
Subscription tiers available
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex gap-3">
|
||||
<Button variant="outline" className="border-white/20 text-white hover:bg-white/10" asChild>
|
||||
<Link href="/marketplace/products/phoenix-gftd-directory">
|
||||
View GFTD
|
||||
<ArrowRight className="ml-2 h-4 w-4" />
|
||||
</Link>
|
||||
</Button>
|
||||
<Button variant="phoenix" asChild>
|
||||
<Link href="/marketplace/products/phoenix-gftd-directory">
|
||||
Subscribe
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Search and Filters */}
|
||||
<div className="mb-8 space-y-4">
|
||||
<div className="flex gap-4">
|
||||
@@ -153,4 +195,3 @@ export default function MarketplacePage() {
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,10 @@ const CATEGORY_LABELS: Record<string, string> = {
|
||||
AI_LLM_AGENT: 'AI',
|
||||
}
|
||||
|
||||
const CATEGORY_DESCRIPTIONS: Record<string, string> = {
|
||||
INTERNET_REGISTRY: 'Rights-aware registry and entity intelligence',
|
||||
}
|
||||
|
||||
export function ProductCard({ product }: ProductCardProps) {
|
||||
return (
|
||||
<Card className="hover:shadow-lg transition-shadow">
|
||||
@@ -72,6 +76,9 @@ export function ProductCard({ product }: ProductCardProps) {
|
||||
{CATEGORY_LABELS[product.category] || product.category}
|
||||
</Badge>
|
||||
{product.featured && <Badge variant="default">Featured</Badge>}
|
||||
{CATEGORY_DESCRIPTIONS[product.category] && (
|
||||
<Badge variant="outline">{CATEGORY_DESCRIPTIONS[product.category]}</Badge>
|
||||
)}
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
@@ -102,4 +109,3 @@ export function ProductCard({ product }: ProductCardProps) {
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user