{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "status-events",
  "title": "Status Events",
  "description": "Event timeline components for displaying status reports and maintenance updates",
  "dependencies": [
    "@radix-ui/react-slot",
    "date-fns",
    "lucide-react"
  ],
  "registryDependencies": [
    "https://openstatus.dev/r/status-types.json",
    "https://openstatus.dev/r/status-utils.json",
    "https://openstatus.dev/r/status-timestamp.json",
    "https://openstatus.dev/r/status-i18n.json",
    "badge",
    "hover-card",
    "separator",
    "tooltip"
  ],
  "files": [
    {
      "path": "src/components/blocks/status-events.tsx",
      "content": "\"use client\";\n\nimport { useStatusBlocksLabels } from \"@/components/blocks/status-i18n\";\nimport { StatusTimestamp } from \"@/components/blocks/status-timestamp\";\nimport type {\n  StatusReportImpact,\n  StatusReportUpdate,\n} from \"@/components/blocks/status.types\";\nimport { worstStatusReportImpact } from \"@/components/blocks/status.utils\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { Separator } from \"@/components/ui/separator\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { formatDistanceStrict } from \"date-fns\";\nimport { Check } from \"lucide-react\";\n\n// ============================================================================\n// Container Components\n// ============================================================================\n\n/**\n * StatusEventGroup - Root container for status events and incident reports\n *\n * Provides a vertical flex container with consistent spacing (gap-4) for\n * displaying a feed of status events, incident reports, and maintenance notices.\n * The component includes ARIA role=\"feed\" for accessibility.\n *\n * @example\n * ```tsx\n * <StatusEventGroup>\n *   <StatusEvent>\n *     // First incident...\n *   </StatusEvent>\n *   <StatusEvent>\n *     // Second incident...\n *   </StatusEvent>\n * </StatusEventGroup>\n * ```\n *\n * @see StatusEvent - For individual event items\n */\nexport function StatusEventGroup({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event-group\"\n      className={cn(\"flex flex-col gap-4\", className)}\n      role=\"feed\"\n      aria-label=\"Status events and updates\"\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\n/**\n * StatusEvent - Individual event container within StatusEventGroup\n *\n * Container for a single event (incident, report, or maintenance) with relative\n * positioning to support absolutely positioned date aside elements.\n *\n * @example\n * ```tsx\n * <StatusEvent>\n *   <StatusEventAside>\n *     <StatusEventDate date={new Date()} />\n *   </StatusEventAside>\n *   <StatusEventContent>\n *     <StatusEventTitle>API Outage</StatusEventTitle>\n *     // Event details...\n *   </StatusEventContent>\n * </StatusEvent>\n * ```\n */\nexport function StatusEvent({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event\"\n      className={cn(\"relative flex flex-col gap-2\", className)}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\n// ============================================================================\n// Content Components\n// ============================================================================\n\n/**\n * StatusEventContent - Main content container for event details\n *\n * Provides a hoverable container with rounded borders and muted background on hover.\n * The hoverable behavior can be disabled for non-interactive events.\n *\n * @param hoverable - Whether to show hover effects (default: true)\n *\n * @example\n * ```tsx\n * <StatusEventContent>\n *   <StatusEventTitle>Database Maintenance</StatusEventTitle>\n *   <p>Scheduled maintenance from 2-4 AM UTC</p>\n * </StatusEventContent>\n * ```\n */\nexport function StatusEventContent({\n  className,\n  hoverable = true,\n  children,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  hoverable?: boolean;\n}) {\n  return (\n    <div\n      data-slot=\"status-event-content\"\n      data-hoverable={hoverable}\n      className={cn(\n        \"group -mx-3 -my-2 flex flex-col gap-2 rounded-lg border border-transparent px-3 py-2\",\n        \"data-[hoverable=true]:hover:border-border/50 data-[hoverable=true]:hover:bg-muted/50 data-[hoverable=true]:hover:cursor-pointer\",\n        className,\n      )}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\n/**\n * StatusEventTitle - Title for status events\n *\n * Displays the event title in medium-weight font, typically used for incident\n * names or maintenance titles.\n *\n * @example\n * ```tsx\n * <StatusEventTitle>API Gateway Outage</StatusEventTitle>\n * ```\n */\nexport function StatusEventTitle({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event-title\"\n      className={cn(\"font-medium\", className)}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\n/**\n * StatusEventTitleCheck - Resolved status indicator with tooltip\n *\n * Displays a green check icon in a circular badge with a tooltip explaining\n * that the report has been resolved. Typically displayed next to event titles.\n *\n * @example\n * ```tsx\n * <div className=\"flex items-center gap-2\">\n *   <StatusEventTitle>API Outage</StatusEventTitle>\n *   <StatusEventTitleCheck />\n * </div>\n * ```\n */\nexport function StatusEventTitleCheck({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  const labels = useStatusBlocksLabels();\n  return (\n    <div\n      data-slot=\"status-event-title-check\"\n      className={cn(\"flex items-center pl-1\", className)}\n      {...props}\n    >\n      <TooltipProvider>\n        <Tooltip>\n          <TooltipTrigger aria-label={labels.reportResolved}>\n            <div className=\"border-success/20 bg-success/10 text-success rounded-full border p-0.5\">\n              <Check className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n            </div>\n          </TooltipTrigger>\n          <TooltipContent>\n            <p>{labels.reportResolved}</p>\n          </TooltipContent>\n        </Tooltip>\n      </TooltipProvider>\n    </div>\n  );\n}\n\n// ============================================================================\n// Affected Services Components\n// ============================================================================\n\n/**\n * StatusEventAffected - Container for affected service badges\n *\n * Displays a wrapping flex container for StatusEventAffectedBadge components,\n * showing which services were impacted by an incident.\n *\n * @example\n * ```tsx\n * <StatusEventAffected>\n *   <StatusEventAffectedBadge>API</StatusEventAffectedBadge>\n *   <StatusEventAffectedBadge>Database</StatusEventAffectedBadge>\n *   <StatusEventAffectedBadge>CDN</StatusEventAffectedBadge>\n * </StatusEventAffected>\n * ```\n */\nexport function StatusEventAffected({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event-affected\"\n      className={cn(\"flex flex-wrap gap-1\", className)}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\n/**\n * StatusEventAffectedBadge - Badge for individual affected service\n *\n * Displays a small secondary-style badge representing a single affected service.\n * Uses a smaller font size (text-[10px]) for compact display.\n *\n * @example\n * ```tsx\n * <StatusEventAffectedBadge>REST API</StatusEventAffectedBadge>\n * ```\n */\nexport function StatusEventAffectedBadge({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <Badge\n      data-slot=\"status-event-affected-badge\"\n      variant=\"secondary\"\n      className={cn(\"text-[10px]\", className)}\n      {...props}\n    >\n      {children}\n    </Badge>\n  );\n}\n\n// ============================================================================\n// Date/Time Components\n// ============================================================================\n\n/**\n * StatusEventDate - Date display with relative time badge\n *\n * Displays a formatted date with a relative time badge (e.g., \"2 days ago\").\n * For future dates, the badge is highlighted in info color. The layout is\n * responsive: horizontal on mobile (gap-2), vertical on desktop (flex-col).\n *\n * @param date - The event date to display\n *\n * @example\n * ```tsx\n * <StatusEventDate date={new Date(\"2024-01-15\")} />\n * // Displays: \"Jan 15, 2024\" with \"2 days ago\" badge\n * ```\n */\nexport function StatusEventDate({\n  className,\n  date,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  date: Date;\n}) {\n  const labels = useStatusBlocksLabels();\n  const isFuture = date > new Date();\n  const distance = formatDistanceStrict(date, new Date(), { addSuffix: true });\n  return (\n    <div\n      data-slot=\"status-event-date\"\n      className={cn(\"flex gap-2 lg:flex-col\", className)}\n      {...props}\n    >\n      <div className=\"text-foreground font-medium\">\n        {labels.formatDateShort(date)}\n      </div>{\" \"}\n      <Badge\n        data-slot=\"status-event-date-badge\"\n        variant=\"secondary\"\n        className={cn(\n          \"text-[10px]\",\n          isFuture ? \"bg-info text-background dark:text-foreground\" : \"\",\n        )}\n      >\n        {distance}\n      </Badge>\n    </div>\n  );\n}\n\n/**\n * StatusEventAside - Sidebar date container (desktop only)\n *\n * Positions the date to the left of event content on desktop screens (lg breakpoint).\n * On mobile, it appears inline. Uses sticky positioning on desktop to keep dates\n * visible while scrolling through long events.\n *\n * @example\n * ```tsx\n * <StatusEvent>\n *   <StatusEventAside>\n *     <StatusEventDate date={incidentDate} />\n *   </StatusEventAside>\n *   <StatusEventContent>\n *     // Event content...\n *   </StatusEventContent>\n * </StatusEvent>\n * ```\n */\nexport function StatusEventAside({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event-aside\"\n      className=\"border border-transparent lg:absolute lg:top-0 lg:-left-32 lg:h-full\"\n    >\n      <div className={cn(\"lg:sticky lg:top-0 lg:left-0\", className)} {...props}>\n        {children}\n      </div>\n    </div>\n  );\n}\n\nconst impactTextClasses: Record<StatusReportImpact, string> = {\n  operational: \"text-success\",\n  degraded_performance: \"text-warning\",\n  partial_outage: \"text-warning\",\n  major_outage: \"text-destructive\",\n};\n\n/**\n * StatusEventTimelineImpact - Worst impact label for a timeline update\n *\n * Shows the most severe impact among the update's component changes. The label\n * is a hover card trigger listing each component's explicit impact.\n */\nexport function StatusEventTimelineImpact({\n  changes,\n  className,\n  ...props\n}: React.ComponentProps<\"button\"> & {\n  changes: { name: string; impact: StatusReportImpact }[];\n}) {\n  const labels = useStatusBlocksLabels();\n  const worst = worstStatusReportImpact(changes.map((c) => c.impact));\n  return (\n    <HoverCard openDelay={100} closeDelay={100}>\n      <HoverCardTrigger asChild>\n        <button\n          type=\"button\"\n          data-slot=\"status-event-timeline-impact\"\n          className={cn(\n            \"decoration-muted-foreground/30 hover:decoration-muted-foreground/60 font-mono text-xs font-medium underline decoration-dashed underline-offset-4\",\n            impactTextClasses[worst],\n            className,\n          )}\n          {...props}\n        >\n          {labels.componentImpact[worst]}\n        </button>\n      </HoverCardTrigger>\n      <HoverCardContent align=\"start\" className=\"w-auto min-w-48 p-3\">\n        <div className=\"flex flex-col gap-1.5\">\n          {changes.map((change, i) => (\n            <div\n              key={i}\n              className=\"flex items-center justify-between gap-4 text-xs\"\n            >\n              <span className=\"truncate\">{change.name}</span>\n              <span\n                className={cn(\n                  \"shrink-0 font-mono\",\n                  impactTextClasses[change.impact],\n                )}\n              >\n                {labels.componentImpact[change.impact]}\n              </span>\n            </div>\n          ))}\n        </div>\n      </HoverCardContent>\n    </HoverCard>\n  );\n}\n\n// ============================================================================\n// Timeline Components\n// ============================================================================\n\n/**\n * StatusEventTimelineReport - Timeline of incident report updates\n *\n * Displays a chronological timeline of incident updates, sorted from newest to\n * oldest. Each update shows the status (investigating → identified → monitoring → resolved),\n * timestamp, message, and time elapsed between updates.\n *\n * **Automatic Duration Calculation**:\n * - First update (most recent): Shows total time from start to resolution (if resolved)\n * - Other updates: Shows time elapsed since the previous update\n *\n * @param updates - Array of report updates to display\n * @param withDot - Whether to show colored status dots (default: true)\n * @param maxUpdates - Maximum number of updates to display (optional, shows all if not specified)\n *\n * @example\n * ```tsx\n * <StatusEventTimelineReport\n *   updates={[\n *     {\n *       status: \"resolved\",\n *       message: \"All services restored\",\n *       date: new Date(\"2024-01-15T12:00:00Z\")\n *     },\n *     {\n *       status: \"monitoring\",\n *       message: \"Fix deployed, monitoring recovery\",\n *       date: new Date(\"2024-01-15T11:45:00Z\")\n *     },\n *     {\n *       status: \"identified\",\n *       message: \"Root cause identified in database\",\n *       date: new Date(\"2024-01-15T11:15:00Z\")\n *     },\n *     {\n *       status: \"investigating\",\n *       message: \"Investigating API timeouts\",\n *       date: new Date(\"2024-01-15T11:00:00Z\")\n *     }\n *   ]}\n * />\n * // Displays timeline with: \"Resolved (in 1 hour)\" → \"Monitoring (15 minutes earlier)\" → etc.\n * ```\n *\n * @see StatusEventTimelineReportUpdate - For individual update rendering\n */\nexport function StatusEventTimelineReport({\n  className,\n  updates,\n  withDot = true,\n  maxUpdates,\n  renderMessage,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  updates: StatusReportUpdate[];\n  withDot?: boolean;\n  maxUpdates?: number;\n  renderMessage?: (message: string) => React.ReactNode;\n}) {\n  const labels = useStatusBlocksLabels();\n  const sortedUpdates = [...updates].sort(\n    (a, b) => b.date.getTime() - a.date.getTime(),\n  );\n  const displayedUpdates = maxUpdates\n    ? sortedUpdates.slice(0, maxUpdates)\n    : sortedUpdates;\n\n  return (\n    <div\n      data-slot=\"status-event-timeline-report\"\n      className={cn(\"text-muted-foreground text-sm\", className)}\n      {...props}\n    >\n      {/* NOTE: make sure they are sorted by date */}\n      {displayedUpdates.map((update, index) => {\n        const updateDate = new Date(update.date);\n        let durationText: string | undefined;\n\n        if (index === 0) {\n          const startedAt = new Date(\n            sortedUpdates[sortedUpdates.length - 1].date,\n          );\n          const duration = formatDistanceStrict(startedAt, updateDate);\n\n          if (duration !== \"0 seconds\" && update.status === \"resolved\") {\n            durationText = labels.durationIn(duration);\n          }\n        } else {\n          const lastUpdateDate = new Date(displayedUpdates[index - 1].date);\n          const timeFromLast = formatDistanceStrict(updateDate, lastUpdateDate);\n          durationText = labels.durationEarlier(timeFromLast);\n        }\n\n        return (\n          <StatusEventTimelineReportUpdate\n            key={index}\n            report={update}\n            duration={durationText}\n            withSeparator={index !== displayedUpdates.length - 1}\n            withDot={withDot}\n            isLast={index === displayedUpdates.length - 1}\n            renderMessage={renderMessage}\n          />\n        );\n      })}\n    </div>\n  );\n}\n\n/**\n * StatusEventTimelineReportUpdate - Single update entry in incident timeline\n *\n * Displays one update in the incident timeline with:\n * - Colored dot indicator (red=investigating, yellow=identified, blue=monitoring, green=resolved)\n * - Status label and timestamp (with StatusTimestamp for rich hover details)\n * - Duration text (e.g., \"in 1 hour\" or \"15 minutes earlier\")\n * - Update message\n * - Optional vertical separator line connecting to next update\n *\n * @param report - The update data (status, message, date)\n * @param duration - Optional duration text to display\n * @param withSeparator - Whether to show separator line to next update (default: true)\n * @param withDot - Whether to show colored status dot (default: true)\n * @param isLast - Whether this is the last update (affects bottom margin)\n *\n * @example\n * ```tsx\n * <StatusEventTimelineReportUpdate\n *   report={{\n *     status: \"resolved\",\n *     message: \"All systems operational\",\n *     date: new Date()\n *   }}\n *   duration=\"(in 45 minutes)\"\n *   withSeparator={false}\n *   isLast={true}\n * />\n * ```\n *\n * @see StatusEventTimelineDot - For the colored dot indicator\n * @see StatusEventTimelineSeparator - For the connecting line\n */\nexport function StatusEventTimelineReportUpdate({\n  report,\n  duration,\n  withSeparator = true,\n  withDot = true,\n  isLast = false,\n  renderMessage,\n}: {\n  report: StatusReportUpdate;\n  withSeparator?: boolean;\n  duration?: string;\n  withDot?: boolean;\n  isLast?: boolean;\n  renderMessage?: (message: string) => React.ReactNode;\n}) {\n  const labels = useStatusBlocksLabels();\n  return (\n    <div\n      data-slot=\"status-event-timeline-report-update\"\n      data-variant={report.status}\n      className=\"group\"\n    >\n      <div className=\"flex flex-row items-center justify-between gap-2\">\n        <div className=\"flex flex-row gap-4\">\n          {withDot ? (\n            <div className=\"flex flex-col\">\n              <div className=\"flex h-5 flex-col items-center justify-center\">\n                <StatusEventTimelineDot />\n              </div>\n              {withSeparator ? <StatusEventTimelineSeparator /> : null}\n            </div>\n          ) : null}\n          <div className={cn(isLast ? \"mb-0\" : \"mb-2\")}>\n            <StatusEventTimelineTitle>\n              <span>{labels.incidentStatus[report.status]}</span>{\" \"}\n              {report.impactChanges?.length ? (\n                <>\n                  <span className=\"text-muted-foreground/70 mx-0.5\">·</span>{\" \"}\n                  <StatusEventTimelineImpact\n                    changes={report.impactChanges}\n                  />{\" \"}\n                </>\n              ) : null}\n              <span className=\"text-muted-foreground/70 mx-0.5\">·</span>{\" \"}\n              <span className=\"text-muted-foreground font-mono text-xs\">\n                <StatusTimestamp date={report.date} variant=\"rich\" asChild>\n                  <span>{labels.formatDateTime(report.date)}</span>\n                </StatusTimestamp>\n              </span>{\" \"}\n              {duration ? (\n                <span className=\"text-muted-foreground/70 font-mono text-xs\">\n                  {duration}\n                </span>\n              ) : null}\n            </StatusEventTimelineTitle>\n            <StatusEventTimelineMessage>\n              {report.message.trim() === \"\" ? (\n                <span className=\"text-muted-foreground/70\">-</span>\n              ) : renderMessage ? (\n                renderMessage(report.message)\n              ) : (\n                <span>{report.message}</span>\n              )}\n            </StatusEventTimelineMessage>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface StatusMaintenanceUpdate {\n  title: string;\n  message: string;\n  from: Date;\n  to: Date;\n}\n\n/**\n * StatusEventTimelineMaintenance - Timeline entry for maintenance windows\n *\n * Displays a maintenance window with title, date range, duration, and message.\n * Uses a blue dot indicator to distinguish from incident updates.\n *\n * The date range is formatted and split to allow individual StatusTimestamp\n * components for each date, providing rich hover details.\n *\n * @param maintenance - The maintenance data (title, message, from, to dates)\n * @param withDot - Whether to show the blue maintenance dot (default: true)\n *\n * @example\n * ```tsx\n * <StatusEventTimelineMaintenance\n *   maintenance={{\n *     title: \"Database Upgrade\",\n *     message: \"Upgrading to PostgreSQL 15\",\n *     from: new Date(\"2024-01-20T02:00:00Z\"),\n *     to: new Date(\"2024-01-20T04:00:00Z\")\n *   }}\n * />\n * // Displays: [●] Database Upgrade · Jan 20, 2:00 AM - 4:00 AM (for 2 hours)\n * //           Upgrading to PostgreSQL 15\n * ```\n *\n * @see StatusEventTimelineDot - For the colored indicator\n * @see StatusTimestamp - For rich timestamp hover cards\n */\nexport function StatusEventTimelineMaintenance({\n  maintenance,\n  withDot = true,\n  renderMessage,\n}: {\n  maintenance: StatusMaintenanceUpdate;\n  withDot?: boolean;\n  renderMessage?: (message: string) => React.ReactNode;\n}) {\n  const labels = useStatusBlocksLabels();\n  const duration = formatDistanceStrict(maintenance.from, maintenance.to);\n  const { from, to } = labels.formatDateRangeParts(\n    maintenance.from,\n    maintenance.to,\n  );\n  return (\n    <div\n      data-slot=\"status-event-timeline-maintenance\"\n      data-variant=\"maintenance\"\n      className=\"group\"\n    >\n      <div className=\"flex flex-row items-center justify-between gap-2\">\n        <div className=\"flex flex-row gap-4\">\n          {withDot ? (\n            <div className=\"flex flex-col\">\n              <div className=\"flex h-5 flex-col items-center justify-center\">\n                <StatusEventTimelineDot />\n              </div>\n            </div>\n          ) : null}\n          {/* NOTE: is always last, no need for className=\"mb-2\" */}\n          <div>\n            <StatusEventTimelineTitle>\n              <span>{maintenance.title}</span>{\" \"}\n              <span className=\"text-muted-foreground/70\">·</span>{\" \"}\n              <span className=\"text-muted-foreground font-mono text-xs\">\n                <StatusTimestamp date={maintenance.from} variant=\"rich\" asChild>\n                  <span>{from}</span>\n                </StatusTimestamp>\n                {\" - \"}\n                <StatusTimestamp date={maintenance.to} variant=\"rich\" asChild>\n                  <span>{to}</span>\n                </StatusTimestamp>\n              </span>{\" \"}\n              {duration ? (\n                <span className=\"text-muted-foreground/70 font-mono text-xs\">\n                  {labels.durationFor(duration)}\n                </span>\n              ) : null}\n            </StatusEventTimelineTitle>\n            <StatusEventTimelineMessage>\n              {maintenance.message.trim() === \"\" ? (\n                <span className=\"text-muted-foreground/70\">-</span>\n              ) : renderMessage ? (\n                renderMessage(maintenance.message)\n              ) : (\n                maintenance.message\n              )}\n            </StatusEventTimelineMessage>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\n/**\n * StatusEventTimelineTitle - Title line for timeline entries\n *\n * Displays the title line of timeline entries with medium font weight,\n * typically containing status label, timestamp, and duration.\n *\n * @example\n * ```tsx\n * <StatusEventTimelineTitle>\n *   <span>Resolved</span> · <span>Jan 15, 10:30 AM</span>\n * </StatusEventTimelineTitle>\n * ```\n */\nexport function StatusEventTimelineTitle({\n  className,\n  children,\n  asChild,\n  ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot : \"div\";\n  return (\n    <Comp\n      data-slot=\"status-event-timeline-title\"\n      className={cn(\"text-foreground text-sm font-medium\", className)}\n      {...props}\n    >\n      {children}\n    </Comp>\n  );\n}\n\n/**\n * StatusEventTimelineMessage - Message content for timeline entries\n *\n * Displays the update message in monospace font with muted color and\n * consistent padding.\n *\n * @example\n * ```tsx\n * <StatusEventTimelineMessage>\n *   We have identified the root cause and deployed a fix\n * </StatusEventTimelineMessage>\n * ```\n */\nexport function StatusEventTimelineMessage({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event-timeline-message\"\n      className={cn(\n        \"text-muted-foreground py-1.5 font-mono text-sm\",\n        className,\n      )}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\n/**\n * StatusEventTimelineDot - Colored status indicator dot\n *\n * Displays a small circular dot with color based on the parent's data-variant:\n * - investigating: Red (destructive)\n * - identified: Yellow (warning)\n * - monitoring: Blue (info)\n * - resolved: Green (success)\n * - maintenance: Blue (info)\n *\n * @example\n * ```tsx\n * <div data-variant=\"resolved\">\n *   <StatusEventTimelineDot />\n *   // Displays green dot\n * </div>\n * ```\n */\nexport function StatusEventTimelineDot({\n  className,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"status-event-timeline-dot\"\n      className={cn(\n        \"bg-muted size-2.5 shrink-0 rounded-full\",\n        \"group-data-[variant=resolved]:bg-success\",\n        \"group-data-[variant=monitoring]:bg-info\",\n        \"group-data-[variant=identified]:bg-warning\",\n        \"group-data-[variant=investigating]:bg-destructive\",\n        \"group-data-[variant=maintenance]:bg-info\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\n/**\n * StatusEventTimelineSeparator - Vertical line connecting timeline entries\n *\n * Displays a vertical separator line between timeline updates, colored to match\n * the status of the update it's connected to. Uses the same color scheme as\n * StatusEventTimelineDot.\n *\n * @example\n * ```tsx\n * <div data-variant=\"monitoring\">\n *   <StatusEventTimelineDot />\n *   <StatusEventTimelineSeparator />\n *   // Displays blue connecting line\n * </div>\n * ```\n */\nexport function StatusEventTimelineSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof Separator>) {\n  return (\n    <Separator\n      data-slot=\"status-event-timeline-separator\"\n      orientation=\"vertical\"\n      className={cn(\n        \"mx-auto flex-1\",\n        \"group-data-[variant=resolved]:bg-success\",\n        \"group-data-[variant=monitoring]:bg-info\",\n        \"group-data-[variant=identified]:bg-warning\",\n        \"group-data-[variant=investigating]:bg-destructive\",\n        \"group-data-[variant=maintenance]:bg-info\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n",
      "type": "registry:ui",
      "target": "components/blocks/status-events.tsx"
    }
  ],
  "type": "registry:block"
}