{t(`home.${card.id.replace(/-/g, '')}Description`, { defaultValue: card.description, })}
import React from 'react'; import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../../ui/card'; import { Header } from '../../layout/header'; import { Button } from '../../ui/button'; import { FileText } from 'lucide-react'; import { useLocation, useNavigate, Link } from 'react-router-dom'; import { Badge } from '../../ui/badge'; import { PageHeader } from '../../ui/page-header'; import { useOptionalLayout } from '../../../contexts/LayoutContext'; import { SIDEBAR_EXPANDED_WIDTH, SIDEBAR_COLLAPSED_WIDTH } from '../../shared/layout-constants'; import { useFeatureCards } from '../../../features/home'; import { useTranslation } from 'react-i18next'; import { SectionErrorBoundary } from '../../shared/error-boundary'; import { FeatureCardSkeleton } from '../../blocks/card-patterns/FeatureCardSkeleton'; /** * Main dashboard content area for the landing page. * * @description * Fetches feature cards via `useFeatureCards` (React Query). All UI strings are * translated via `useTranslation()` — change language via `LanguageSelector`. * * @ai-rules * 1. Data: Feature cards come from `useFeatureCards()` — never hardcode them here. * 2. i18n: Use `t('home.*')` for all UI strings — never hardcode text in JSX. * 3. Loading: Renders a skeleton card while the query is in-flight. */ export function HomeContent() { const { t } = useTranslation(); const layout = useOptionalLayout(); const sidebarExpanded = layout?.sidebarExpanded ?? false; const sidebarWidth = layout?.sidebarWidth ?? 256; const navigate = useNavigate(); const { data: featureCards = [], isLoading } = useFeatureCards(); return (
{t(`home.${card.id.replace(/-/g, '')}Description`, { defaultValue: card.description, })}