From 2d8361a4a08ad770a9d8c7435db7b11480664268 Mon Sep 17 00:00:00 2001
From: doxa-maps-88655c70
<88627970+doxa-maps-88655c70@users.noreply.github.com>
Date: Thu, 24 Sep 2026 04:31:39 +0000
Subject: [PATCH 1/4] feat(country-posters): two-tab element, reusing the
shared view switcher
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Driver: "Country Posters is supposed to have two tabs, structured like the
UPG-100 list."
★ THE CARD'S REAL POINT WAS THE CONTROL, and it was already settled: this is the
THIRD consumer of the SELECT VIEW switcher, and library/components/ViewSelect.vue
already exists precisely because a third hand-rolled copy was imminent — its own
header says a fourth divergent copy is not what the library is for. So this
element imports the shared component rather than adding one, and the whole
feature is one new profile following an established shape.
country-posters-mfe.vue mirrors upg-100-mfe deliberately (index.js already
records that this bundle is "the same shape as my-upg-100-list"): the
pane-wrapper column, each pane under its own ProfileLoader/Pinia, one
ShareButton in the header sharing the COMPOSITE leaf — not a child, which is the
BUG-SHARE-FROM-CAP4-COMPOSITE bug this pattern already paid for.
LIST FIRST, MAP SECOND, per the Driver's principle that maps are a secondary
view: the poster wall is the concrete artefact a newcomer can act on, the map is
where it gets placed. Pane order lives in at[0] and in the array, because
buildPaneColumn sorts by at[0] while ViewSelect renders the array verbatim —
desynchronising them is a recorded trap.
It also CLOSES A DEAD SEAM. country-poster-wall has dispatched
'doxa-country-posters:show-on-map' since it was written, but only the app shell
listened — so in a dropped embed or a nested composite the action fired into a
document with no handler and did nothing. This shell owns the event and swaps to
the map tab, which is what makes the two tabs one element rather than two pages
that share a bundle.
Verified in a browser by the new check:mfe-two-tab: host 900px, tabs
"Country Posters | Map", both panes mounted at 1280x843, exactly one share
affordance, zero page errors. The same gate passes unchanged on upg-100-mfe and
regions-mfe, so the three composites are now held to one contract.
---
.../country-posters-mfe.meta.json | 12 ++
.../country-posters/country-posters-mfe.vue | 200 ++++++++++++++++++
.../country-posters/countries-map/index.html | 2 +-
.../country-poster-wall/index.html | 2 +-
.../country-posters-mfe/index.html | 182 ++++++++++++++++
.../country-posters/country-posters.js | 179 +++++++++++-----
public/doxa-maps/index.html | 2 +-
public/doxa-maps/manifest.json | 98 +++++----
8 files changed, 580 insertions(+), 97 deletions(-)
create mode 100644 plugin-designs/country-posters/country-posters-mfe.meta.json
create mode 100644 plugin-designs/country-posters/country-posters-mfe.vue
create mode 100644 public/doxa-maps/country-posters/country-posters-mfe/index.html
diff --git a/plugin-designs/country-posters/country-posters-mfe.meta.json b/plugin-designs/country-posters/country-posters-mfe.meta.json
new file mode 100644
index 000000000..54f667b46
--- /dev/null
+++ b/plugin-designs/country-posters/country-posters-mfe.meta.json
@@ -0,0 +1,12 @@
+{
+ "type": "nested-elements-mfe",
+ "label": "Country Posters — Wall + Map",
+ "composes": [
+ "country-posters/country-poster-wall",
+ "country-posters/countries-map"
+ ],
+ "note": "The Driver's 2-tab Country Posters element, structured like my-upg-100-list/upg-100-mfe: a SELECT VIEW switcher (the SHARED library/components/ViewSelect.vue — this is its THIRD consumer, which is why it was extracted rather than copied a third time) over Country Posters at [0,0] and Map at [1,0]. LIST FIRST, MAP SECOND per the Driver's principle that maps are a secondary view. The wall already dispatches 'doxa-country-posters:show-on-map' (country-poster-wall.vue:78); until now only the app shell listened, so the action did nothing in a dropped embed — this shell owns it and swaps to the map tab. pinHint:false: the cloned panes carry no coach-mark, and the composite must declare it because a pane's config comes from here, not from the child's own meta. One ShareButton in the header, sharing the COMPOSITE leaf, per the recorded share policy.",
+ "config": {
+ "pinHint": false
+ }
+}
diff --git a/plugin-designs/country-posters/country-posters-mfe.vue b/plugin-designs/country-posters/country-posters-mfe.vue
new file mode 100644
index 000000000..5b9fc0350
--- /dev/null
+++ b/plugin-designs/country-posters/country-posters-mfe.vue
@@ -0,0 +1,200 @@
+
+
+
+