{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "status-i18n",
  "title": "Status Blocks i18n Provider",
  "description": "React context for supplying translated labels and locale-aware date formatters to status blocks. Optional — blocks fall back to defaultStatusBlocksLabels (en-US) when no provider is mounted.",
  "registryDependencies": [
    "https://openstatus.dev/r/status-types.json",
    "https://openstatus.dev/r/status-utils.json"
  ],
  "files": [
    {
      "path": "src/components/blocks/status-i18n.tsx",
      "content": "\"use client\";\n\nimport type {\n  StatusReportImpact,\n  StatusReportUpdateType,\n  StatusType,\n  ThemeValue,\n} from \"@/components/blocks/status.types\";\nimport { defaultStatusBlocksLabels } from \"@/components/blocks/status.utils\";\nimport { createContext, useContext } from \"react\";\n\n/**\n * Labels and locale-aware formatters consumed by block components.\n *\n * Blocks read this via `useStatusBlocksLabels()`. When no provider is mounted,\n * the hook returns `defaultStatusBlocksLabels` (English, \"en-US\" formatting).\n * Apps wanting localized copy should mount `StatusBlocksI18nProvider` and\n * supply translated strings + locale-aware formatters.\n */\nexport type StatusBlocksLabels = {\n  systemStatus: Record<StatusType, { long: string; short: string }>;\n  incidentStatus: Record<StatusReportUpdateType, string>;\n  requestStatus: Record<StatusType, string>;\n  componentImpact: Record<StatusReportImpact, string>;\n\n  today: string;\n  ongoing: string;\n  reportResolved: string;\n  noRecentNotifications: string;\n  noRecentNotificationsDescription: string;\n  noReports: string;\n  noReportsDescription: string;\n  noPublicMonitors: string;\n  noPublicMonitorsDescription: string;\n\n  themeNames: Record<ThemeValue, string>;\n  ariaToggleTheme: string;\n\n  subscribe: string;\n  subscribeRssDescription: string;\n  subscribeAtomDescription: string;\n  subscribeJsonDescription: string;\n  subscribeSlackDescription: string;\n  subscribeSshDescription: string;\n  linkCopiedToClipboard: string;\n  ariaCopyLink: string;\n\n  poweredBy: string;\n  getInTouch: string;\n\n  ariaStatusTracker: string;\n  ariaDayStatus: (n: number) => string;\n  clickAgainToUnpin: string;\n\n  /** Heading shown on the status-calendar block. */\n  calendarTitle: string;\n\n  durationIn: (s: string) => string;\n  durationEarlier: (s: string) => string;\n  durationFor: (s: string) => string;\n  durationAcross: (s: string) => string;\n\n  formatDate: (d: Date) => string;\n  formatDateShort: (d: Date) => string;\n  formatDateTime: (d: Date) => string;\n  formatDateRange: (from?: Date, to?: Date) => string;\n  /**\n   * Returns the start/end of a closed range as separate strings, so callers\n   * can render each side independently (e.g. wrap each in a hovercard)\n   * without re-parsing the joined output of `formatDateRange`.\n   *\n   * Implementations should collapse same-day ranges (date on `from`, time\n   * only on `to`) the same way `formatDateRange` does.\n   *\n   * Closed ranges only — both `from` and `to` are required. For open-ended\n   * cases (`Since …` / `Until …` / `All time`) use `formatDateRange`.\n   */\n  formatDateRangeParts: (from: Date, to: Date) => { from: string; to: string };\n};\n\nconst StatusBlocksLabelsContext = createContext<StatusBlocksLabels | null>(\n  null,\n);\n\nexport function StatusBlocksI18nProvider({\n  value,\n  children,\n}: {\n  value: StatusBlocksLabels;\n  children: React.ReactNode;\n}) {\n  return (\n    <StatusBlocksLabelsContext.Provider value={value}>\n      {children}\n    </StatusBlocksLabelsContext.Provider>\n  );\n}\n\nexport function useStatusBlocksLabels(): StatusBlocksLabels {\n  return useContext(StatusBlocksLabelsContext) ?? defaultStatusBlocksLabels;\n}\n",
      "type": "registry:ui",
      "target": "components/blocks/status-i18n.tsx"
    }
  ],
  "type": "registry:block"
}