import type { ReactNode } from 'react' import { Link } from '@tanstack/react-router' import { Frame, FrameDescription, FrameHeader, FramePanel, FrameTitle, } from '@/components/reui/frame' import { cn } from '@cfdm/ui/lib/utils' import { Item, ItemMedia } from '@cfdm/ui/components/item' export interface OpsKpiCard { id: string typeLabel: string title: string metricLabel: string value: string | number hint?: ReactNode detail?: ReactNode icon: ReactNode iconBg?: string } interface OpsDashboardProps { title?: string description?: string kpiCards: OpsKpiCard[] charts: ReactNode queue: ReactNode } function KpiCardItem({ card }: { card: OpsKpiCard }) { return (
{card.icon}

{card.typeLabel}

{card.title}

{card.metricLabel}

{card.value} {card.hint}
{card.detail ? (

{card.detail}

) : null}
) } export function OpsDashboard({ title = 'Панель управления', description = 'Обзор доменов, групп, сервисов и сертификатов Cloudflare', kpiCards, charts, queue, }: OpsDashboardProps) { return (

{title}

{description}

{kpiCards.map((card) => ( ))}
{charts}
Требуют внимания Истекающие сертификаты и домены без группы {queue}
) } export function OpsDashboardHintLink({ to, search, children, }: { to: string search?: Record children: ReactNode }) { return ( {children} ) }