diff --git a/plugin-designs/plugin-studio/plugin-studio.vue b/plugin-designs/plugin-studio/plugin-studio.vue index 5dcd8acbb..7f582659f 100644 --- a/plugin-designs/plugin-studio/plugin-studio.vue +++ b/plugin-designs/plugin-studio/plugin-studio.vue @@ -640,7 +640,14 @@ export default defineComponent({ // never list the studio itself as one of its own tabs if (b.bundle === 'plugin-studio' || STUDIO_HIDDEN.has(b.bundle)) continue for (const p of (b.profiles || [])) { - const tag = p.element || (b.elements && b.elements[0]) || b.bundle + // ★ MOUNT ONLY A TAG THE BUNDLE DEFINES. A profile's `element` is copied from its @element + // JSDoc, and that can name a tag nothing defines: country-posters-mfe's says + // , while the bundle defines only (and gospel's + // did the same until 5418a79c). Trusting it put "never registered" on a working plugin. + // `elements` is what the bundle's index.js actually registers, so it is the authority. + const defined = (b.elements && b.elements.length) ? b.elements : null + const tag = (p.element && (!defined || defined.includes(p.element)) ? p.element : null) + || (defined && defined[0]) || p.element || b.bundle const cap = capFor(p.type || 'single') // A heavy row owns a live WebGL context, so it is torn down on deactivate rather than // hidden. Keyed by tag OR bundle so a bundle whose profiles differ still resolves.