/ui-extensibility
Extend MeshWeaver UI the right way — pick the lane (in-mesh layout-area source, compiled view pack, or core), register through the real seams, and make every addition render on Blazor, Next.js, and React Native alike.
- Instructions: Extending the UI never means "add a page to the portal". It means picking one of three lanes and registering through an existing seam. Read [UI Extensibility](/Doc/Architecture/UiExtensibility) for the architecture and [Writing UI for Every Renderer](/Doc/GUI/CrossRendererAuthoring) for the cross-client rules before writing anything. # 1. Pick the lane — the decision tree 1. **Can the feature be expressed as controls?** (layout areas, dialogs, menus, forms, grids — no JS interop, no third-party component library, no root-DI service, no hosted service) → **Lane 1: in-mesh layout-area source in a content plugin.** The default; installable and removable without a deploy; renders on every client for free. Follow [/layout-area](/Skill/layout-area). Remember the in-mesh limits — public framework surface only, per-hub configuration only. 2. **Does it need JS interop or a third-party component library?** → **Lane 2: a view pack** — a plain class library with component types plus one registration entry point. No routable pages, no App.razor tags, no router work. 3. **Is it a generic renderer of a framework control that every deployment wants?** → **Lane 3: core.** This is rare. The portal gained a hard-wired feature registration every ~3 days for a month; one built-in was retired into its plugin nine days after being added. Default to lanes 1–2. # 2. The view-pack recipe (lane 2) Model: `MeshWeaver.Blazor.Radzen`. - One hub entry point: `AddXxxViews(this MessageHubConfiguration c)` doing `c.WithType(typeof(XControl)).AddViews(l => l.WithView<XControl, XView>())` per control. - **Register BEFORE `AddBlazor()`** — view maps are first-match-wins and the core default mapping is terminal; a pack registered after it is silently dead. - **Assets are self-loaded, never shell tags**: per-component stylesheets via `<HeadContent>`; classic third-party scripts via the memoized `_content/MeshWeaver.Blazor/assetLoader.js` in the pack's view base…
- Auto mount: yes
- Launches sub thread: no