import { getTranslations } from 'next-intl/server'; import Reveal from './Reveal'; import styles from './FeatureGrid.module.css'; type FeatureKey = | 'personas' | 'models' | 'harvest' | 'loops' | 'skills' | 'memory_center'; const FEATURES: readonly FeatureKey[] = [ 'personas', 'models', 'harvest', 'loops', 'skills', 'memory_center', ]; /** * Six feature cards, each naming a real subsystem (persona roster, LiteLLM * routing, Harvest, Loops + approval queue, skills/connectors/MCP catalog, * Memory Center). Strings under `landing.features.*`. */ export default async function FeatureGrid() { const t = await getTranslations('landing.features'); return ( {t('eyebrow')} {t('headline')} {FEATURES.map((key, i) => ( {t(`items.${key}.title`)} {t(`items.${key}.body`)} ))} ); } /** Minimal 18px line icons — one per subsystem, stroke inherits currentColor. */ function FeatureIcon({ feature }: { readonly feature: FeatureKey }) { const common = { width: 18, height: 18, viewBox: '0 0 18 18', fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round', } as const; switch (feature) { case 'personas': return ( ); case 'models': return ( ); case 'harvest': return ( ); case 'loops': return ( ); case 'skills': return ( ); case 'memory_center': return ( ); } }
{t('eyebrow')}
{t(`items.${key}.body`)}