Introduces a single-slot `dashboards` contribution point (SIP-151
architecture) that lets an extension replace Superset's built-in
dashboard renderer while the host keeps owning data fetching,
hydration, URL/permalink resolution, CSS injection, and theming.
- New `dashboards` namespace in @apache-superset/core defining the
DashboardRenderer descriptor and the Redux-free DashboardRendererProps
contract (dashboard identity/metadata/layout, charts, datasets,
initial dataMask/tabs/anchor, uiConfig, reserved change callbacks).
- Host registry (DashboardRendererProviders) with chat-style singleton
semantics: most recent registration wins, displaced providers are
unregistered with a warning, disposal of a displaced provider is a
no-op.
- DashboardRendererHost resolves the active provider via
useSyncExternalStore (late registration swaps live), wraps custom
renderers in an ErrorBoundary, and always falls back to the built-in
renderer in edit mode or when the EnableExtensions flag is off.
- The built-in stack (DashboardContainer/DashboardBuilder + filter
selectors) moves behind the same contract as DefaultDashboardRenderer,
preserving the lazy DashboardBuilder chunk.
- DashboardPage now builds the contract props from data it already
fetches and renders DashboardRendererHost; hydration and all other
host behavior are unchanged, so the embedded path inherits the seam.
This is the first step toward a fully Redux-decoupled dashboard
renderer and an Embedded SDK that is a thin wrapper over this
extension point.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>