{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "media-provider",
  "title": "Media Provider",
  "description": "React context provider for shared media rendering configuration. Provides renderers and priority settings to all nested MediaRouter instances.",
  "files": [
    {
      "path": "registry/outputs/media-provider.tsx",
      "content": "\"use client\";\n\n/**\n * React context provider for shared media rendering configuration.\n *\n * MediaProvider supplies renderers and priority settings to all\n * nested MediaRouter instances. This lets you configure MIME type rendering\n * once at the top of the tree — for example, injecting a widget renderer\n * for `application/vnd.jupyter.widget-view+json` — and have all output\n * components inherit it automatically.\n *\n * @example\n * ```tsx\n * <MediaProvider\n *   renderers={{\n *     \"application/vnd.jupyter.widget-view+json\": ({ data }) => {\n *       const { model_id } = data as { model_id: string };\n *       return <WidgetView modelId={model_id} />;\n *     },\n *   }}\n * >\n *   <OutputArea outputs={cell.outputs} />\n * </MediaProvider>\n * ```\n */\n\nimport { createContext, type ReactNode, useContext } from \"react\";\nimport type { CustomRenderer } from \"./media-router\";\nimport { DEFAULT_PRIORITY } from \"./media-router\";\n\ninterface MediaProviderValue {\n  renderers: Record<string, CustomRenderer>;\n  priority: readonly string[];\n}\n\ninterface MediaProviderProps {\n  children: ReactNode;\n  /**\n   * Custom MIME type renderers, inherited by all nested MediaRouter instances.\n   * Inner providers merge with outer providers (inner wins for same MIME type).\n   */\n  renderers?: Record<string, CustomRenderer>;\n  /**\n   * MIME type priority order, inherited by all nested MediaRouter instances.\n   * Overrides the parent provider's priority entirely if provided.\n   */\n  priority?: readonly string[];\n}\n\nconst MediaContext = createContext<MediaProviderValue | null>(null);\n\n/**\n * Provider component for shared media rendering configuration.\n *\n * Supports nesting: inner providers merge renderers with outer providers\n * (inner wins for same MIME type), and override priority entirely.\n *\n * Without a provider, MediaRouter uses its built-in defaults.\n */\nexport function MediaProvider({\n  children,\n  renderers = {},\n  priority,\n}: MediaProviderProps) {\n  const parent = useContext(MediaContext);\n\n  const value: MediaProviderValue = {\n    // Merge renderers: child overrides parent for same MIME type\n    renderers: { ...parent?.renderers, ...renderers },\n    // Priority: use provided, else inherit from parent, else default\n    priority: priority ?? parent?.priority ?? DEFAULT_PRIORITY,\n  };\n\n  return (\n    <MediaContext.Provider value={value}>{children}</MediaContext.Provider>\n  );\n}\n\n/**\n * Access the media rendering context.\n * Returns null if used outside of MediaProvider.\n */\nexport function useMediaContext(): MediaProviderValue | null {\n  return useContext(MediaContext);\n}\n",
      "type": "registry:component",
      "target": "components/outputs/media-provider.tsx"
    }
  ],
  "type": "registry:component"
}