diff --git a/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue b/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue index 27afbf32a..3c23fe887 100644 --- a/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue +++ b/plugin-designs/doxa-maps-spa/doxa-maps-spa.vue @@ -216,7 +216,7 @@ import { helpFor } from './src/experimentalHelp.js' import { TAB_INFO } from './src/tabInfo.js' import MapInfo from '@map/components/info/MapInfo.vue' import { loadScriptOnce, whenTagDefined } from '@map/utils/embedScript.js' -import { readViewKeys, writeViewKeys, onAddressChange, urlOwnerOf } from '@map/composables/useViewAddress.js' +import { readViewKeys, writeViewKeys, onAddressChange, urlOwnerOf, ownAddress } from '@map/composables/useViewAddress.js' // THE HOST PAGE'S LANGUAGE, by the same ladder every nested map already uses (library/i18n // detectLocale): ?lang= / ?locale= on the page URL, then . '' when the page says nothing. @@ -1136,6 +1136,9 @@ export default defineComponent({ // would snap a host's fixed `tab` attribute back to the default. The owner is read per event: a host may set // profile-config after mount. this._offAddress = onAddressChange(({ tab }) => { if (urlOwnerOf(this.cfg)) this.openFromAddress(tab) }) + // A nested composite's choice (its open pane, a selected place) reaches the address through this shell, the + // page's one writer, while the page owns its address; a nested element can never switch this shell's tab. + this._offOwn = ownAddress(this.$el, () => urlOwnerOf(this.cfg)) }, // Release the media-query listener. This element is a custom element a host can add and REMOVE at // will (a cap-5 SPA is mounted and unmounted by shells, tabs and the studio), and a live listener @@ -1144,6 +1147,7 @@ export default defineComponent({ if (this._langObs) { this._langObs.disconnect(); this._langObs = null } if (this._onHostedHelp) { this.$el.removeEventListener('doxa:help', this._onHostedHelp); this._onHostedHelp = null } if (this._offAddress) { this._offAddress(); this._offAddress = null } + if (this._offOwn) { this._offOwn(); this._offOwn = null } if (!this._mql || !this._onMedia) return if (this._mql.removeEventListener) this._mql.removeEventListener('change', this._onMedia) else if (this._mql.removeListener) this._mql.removeListener(this._onMedia)