Astro rejects <slot name={dynamic} /> inside a .map() — slot names must be literal at parse time.
constraint: MasterDetail needs to render a different pane per item, but Astro will not compile a dynamic named slot.
Invert the contract: MasterDetail exposes one default slot; callers tag each pane with data-md-key. A small script in MasterDetail toggles visibility based on that attribute. Compile-time error gone, caller-side stays explicit.
<!-- Generic: does not know what goes in each pane -->
<div class="md-grid" data-masterdetail>
<nav>{items.map((it, i) => (
<button data-md-pick={it.key} data-active={i === 0}>{it.label}</button>
))}</nav>
<div><slot /></div> <!-- caller drops <div data-md-key="..."> here -->
</div>
<!-- Caller: explicit, type-safe -->
<MasterDetail items={levels}>
<div data-md-key="context"><MermaidViewer ... /></div>
<div data-md-key="container" class="hidden"><MermaidViewer ... /></div>
</MasterDetail>