diff --git a/data/posters/country-abw.webp b/data/posters/country-abw.webp
index cd7a1b14f..477c531b5 100644
Binary files a/data/posters/country-abw.webp and b/data/posters/country-abw.webp differ
diff --git a/data/posters/country-afg.webp b/data/posters/country-afg.webp
index f63d712dd..bf255019a 100644
Binary files a/data/posters/country-afg.webp and b/data/posters/country-afg.webp differ
diff --git a/data/posters/country-ago.webp b/data/posters/country-ago.webp
index 0c7025052..6305becc7 100644
Binary files a/data/posters/country-ago.webp and b/data/posters/country-ago.webp differ
diff --git a/data/posters/country-alb.webp b/data/posters/country-alb.webp
index e0ab42c65..adf48fc25 100644
Binary files a/data/posters/country-alb.webp and b/data/posters/country-alb.webp differ
diff --git a/data/posters/country-and.webp b/data/posters/country-and.webp
index bf7041c4b..a5cc77f9a 100644
Binary files a/data/posters/country-and.webp and b/data/posters/country-and.webp differ
diff --git a/data/posters/country-are.webp b/data/posters/country-are.webp
index 468f1636b..08b79107c 100644
Binary files a/data/posters/country-are.webp and b/data/posters/country-are.webp differ
diff --git a/data/posters/country-arm.webp b/data/posters/country-arm.webp
index b6710c830..14eed3be5 100644
Binary files a/data/posters/country-arm.webp and b/data/posters/country-arm.webp differ
diff --git a/data/posters/country-asm.webp b/data/posters/country-asm.webp
index 40c1637e9..b5b2b2881 100644
Binary files a/data/posters/country-asm.webp and b/data/posters/country-asm.webp differ
diff --git a/data/posters/country-atg.webp b/data/posters/country-atg.webp
index 0f05690d5..9f789a7ba 100644
Binary files a/data/posters/country-atg.webp and b/data/posters/country-atg.webp differ
diff --git a/data/posters/country-aze.webp b/data/posters/country-aze.webp
index d8305f946..093febed4 100644
Binary files a/data/posters/country-aze.webp and b/data/posters/country-aze.webp differ
diff --git a/data/posters/country-ben.webp b/data/posters/country-ben.webp
index 8e78a6b24..4df6f2a57 100644
Binary files a/data/posters/country-ben.webp and b/data/posters/country-ben.webp differ
diff --git a/data/posters/country-bfa.webp b/data/posters/country-bfa.webp
index 3053be865..d51bcae36 100644
Binary files a/data/posters/country-bfa.webp and b/data/posters/country-bfa.webp differ
diff --git a/data/posters/country-bgd.webp b/data/posters/country-bgd.webp
index 7e5ded1dd..bb111fe7b 100644
Binary files a/data/posters/country-bgd.webp and b/data/posters/country-bgd.webp differ
diff --git a/data/posters/country-bgr.webp b/data/posters/country-bgr.webp
index c960fd8af..59c813555 100644
Binary files a/data/posters/country-bgr.webp and b/data/posters/country-bgr.webp differ
diff --git a/data/posters/country-bhr.webp b/data/posters/country-bhr.webp
index 72e899d3d..6ad8ff493 100644
Binary files a/data/posters/country-bhr.webp and b/data/posters/country-bhr.webp differ
diff --git a/data/posters/country-bhs.webp b/data/posters/country-bhs.webp
index 0ce8f7e7b..4e1839aef 100644
Binary files a/data/posters/country-bhs.webp and b/data/posters/country-bhs.webp differ
diff --git a/data/posters/country-bih.webp b/data/posters/country-bih.webp
index ad93e20a6..65716a9a5 100644
Binary files a/data/posters/country-bih.webp and b/data/posters/country-bih.webp differ
diff --git a/data/posters/country-blm.webp b/data/posters/country-blm.webp
index 00de104b6..97a7344ff 100644
Binary files a/data/posters/country-blm.webp and b/data/posters/country-blm.webp differ
diff --git a/data/posters/country-blr.webp b/data/posters/country-blr.webp
index 6040a050e..f8a28d013 100644
Binary files a/data/posters/country-blr.webp and b/data/posters/country-blr.webp differ
diff --git a/data/posters/country-bmu.webp b/data/posters/country-bmu.webp
index 9aaaf9af3..5932f595e 100644
Binary files a/data/posters/country-bmu.webp and b/data/posters/country-bmu.webp differ
diff --git a/data/posters/country-bol.webp b/data/posters/country-bol.webp
index ab26a190e..b56f48dc9 100644
Binary files a/data/posters/country-bol.webp and b/data/posters/country-bol.webp differ
diff --git a/data/posters/country-bra.webp b/data/posters/country-bra.webp
index 72bbe7cca..b6dddc178 100644
Binary files a/data/posters/country-bra.webp and b/data/posters/country-bra.webp differ
diff --git a/data/posters/country-brb.webp b/data/posters/country-brb.webp
index d86b06a4f..7987658f8 100644
Binary files a/data/posters/country-brb.webp and b/data/posters/country-brb.webp differ
diff --git a/data/posters/country-brn.webp b/data/posters/country-brn.webp
index 3c4d7f356..b624dfc8a 100644
Binary files a/data/posters/country-brn.webp and b/data/posters/country-brn.webp differ
diff --git a/data/posters/country-btn.webp b/data/posters/country-btn.webp
index e8a68858f..96700b67a 100644
Binary files a/data/posters/country-btn.webp and b/data/posters/country-btn.webp differ
diff --git a/data/posters/country-caf.webp b/data/posters/country-caf.webp
index af0223dda..3df55fd59 100644
Binary files a/data/posters/country-caf.webp and b/data/posters/country-caf.webp differ
diff --git a/data/posters/country-cck.webp b/data/posters/country-cck.webp
index 23c8cf636..8d26a3e03 100644
Binary files a/data/posters/country-cck.webp and b/data/posters/country-cck.webp differ
diff --git a/data/posters/country-civ.webp b/data/posters/country-civ.webp
index 67bc93813..3cf64c4a4 100644
Binary files a/data/posters/country-civ.webp and b/data/posters/country-civ.webp differ
diff --git a/data/posters/country-cmr.webp b/data/posters/country-cmr.webp
index 43dbd75bc..e239e2141 100644
Binary files a/data/posters/country-cmr.webp and b/data/posters/country-cmr.webp differ
diff --git a/data/posters/country-cod.webp b/data/posters/country-cod.webp
index 2b04856ab..385ee45e9 100644
Binary files a/data/posters/country-cod.webp and b/data/posters/country-cod.webp differ
diff --git a/data/posters/country-cog.webp b/data/posters/country-cog.webp
index edf9cbc83..0dcff4f3a 100644
Binary files a/data/posters/country-cog.webp and b/data/posters/country-cog.webp differ
diff --git a/data/posters/country-cok.webp b/data/posters/country-cok.webp
index 21a33ca99..ff1372c31 100644
Binary files a/data/posters/country-cok.webp and b/data/posters/country-cok.webp differ
diff --git a/data/posters/country-col.webp b/data/posters/country-col.webp
index a980bbf89..054e361d3 100644
Binary files a/data/posters/country-col.webp and b/data/posters/country-col.webp differ
diff --git a/data/posters/country-com.webp b/data/posters/country-com.webp
index 0f6b42246..857bb4ee6 100644
Binary files a/data/posters/country-com.webp and b/data/posters/country-com.webp differ
diff --git a/data/posters/country-cub.webp b/data/posters/country-cub.webp
index 7ca3fd6a1..18ccba98e 100644
Binary files a/data/posters/country-cub.webp and b/data/posters/country-cub.webp differ
diff --git a/data/posters/country-cuw.webp b/data/posters/country-cuw.webp
index 0b13ca7d8..3f8bdff79 100644
Binary files a/data/posters/country-cuw.webp and b/data/posters/country-cuw.webp differ
diff --git a/data/posters/country-cxr.webp b/data/posters/country-cxr.webp
index cea7fbbf7..97dcb665c 100644
Binary files a/data/posters/country-cxr.webp and b/data/posters/country-cxr.webp differ
diff --git a/data/posters/country-cym.webp b/data/posters/country-cym.webp
index 3e16450aa..f64f68a40 100644
Binary files a/data/posters/country-cym.webp and b/data/posters/country-cym.webp differ
diff --git a/data/posters/country-cyp.webp b/data/posters/country-cyp.webp
index 76dc3cf60..6056322d9 100644
Binary files a/data/posters/country-cyp.webp and b/data/posters/country-cyp.webp differ
diff --git a/data/posters/country-cze.webp b/data/posters/country-cze.webp
index 1385a2635..44b1f6e03 100644
Binary files a/data/posters/country-cze.webp and b/data/posters/country-cze.webp differ
diff --git a/data/posters/country-dji.webp b/data/posters/country-dji.webp
index 57313b7f1..607e67690 100644
Binary files a/data/posters/country-dji.webp and b/data/posters/country-dji.webp differ
diff --git a/data/posters/country-dma.webp b/data/posters/country-dma.webp
index 0d07d81a3..99416ddf5 100644
Binary files a/data/posters/country-dma.webp and b/data/posters/country-dma.webp differ
diff --git a/data/posters/country-dza.webp b/data/posters/country-dza.webp
index 81452ef65..77a89b488 100644
Binary files a/data/posters/country-dza.webp and b/data/posters/country-dza.webp differ
diff --git a/data/posters/country-ecu.webp b/data/posters/country-ecu.webp
index 2788506fb..3e058cfd5 100644
Binary files a/data/posters/country-ecu.webp and b/data/posters/country-ecu.webp differ
diff --git a/data/posters/country-egy.webp b/data/posters/country-egy.webp
index d8d511b5a..900675502 100644
Binary files a/data/posters/country-egy.webp and b/data/posters/country-egy.webp differ
diff --git a/data/posters/country-eri.webp b/data/posters/country-eri.webp
index 7f4c1291d..7173ec934 100644
Binary files a/data/posters/country-eri.webp and b/data/posters/country-eri.webp differ
diff --git a/data/posters/country-esh.webp b/data/posters/country-esh.webp
index 02eaa9303..d35c96e22 100644
Binary files a/data/posters/country-esh.webp and b/data/posters/country-esh.webp differ
diff --git a/data/posters/country-esp.webp b/data/posters/country-esp.webp
index 0f9464d13..24688bb2a 100644
Binary files a/data/posters/country-esp.webp and b/data/posters/country-esp.webp differ
diff --git a/data/posters/country-eth.webp b/data/posters/country-eth.webp
index 5f800cc66..673d59328 100644
Binary files a/data/posters/country-eth.webp and b/data/posters/country-eth.webp differ
diff --git a/data/posters/country-fin.webp b/data/posters/country-fin.webp
index 23162c7b3..b0fd906d6 100644
Binary files a/data/posters/country-fin.webp and b/data/posters/country-fin.webp differ
diff --git a/data/posters/country-fji.webp b/data/posters/country-fji.webp
index 38acf1a7e..184384381 100644
Binary files a/data/posters/country-fji.webp and b/data/posters/country-fji.webp differ
diff --git a/data/posters/country-fro.webp b/data/posters/country-fro.webp
index cb0379c45..29eba956a 100644
Binary files a/data/posters/country-fro.webp and b/data/posters/country-fro.webp differ
diff --git a/data/posters/country-fsm.webp b/data/posters/country-fsm.webp
index c4c3a5c71..0f1e41a83 100644
Binary files a/data/posters/country-fsm.webp and b/data/posters/country-fsm.webp differ
diff --git a/data/posters/country-gab.webp b/data/posters/country-gab.webp
index 876ed5a68..6584c810f 100644
Binary files a/data/posters/country-gab.webp and b/data/posters/country-gab.webp differ
diff --git a/data/posters/country-geo.webp b/data/posters/country-geo.webp
index da8383e69..84c282984 100644
Binary files a/data/posters/country-geo.webp and b/data/posters/country-geo.webp differ
diff --git a/data/posters/country-ggy.webp b/data/posters/country-ggy.webp
index d027c538d..7fb048e13 100644
Binary files a/data/posters/country-ggy.webp and b/data/posters/country-ggy.webp differ
diff --git a/data/posters/country-gha.webp b/data/posters/country-gha.webp
index 43d7890f6..c11abe055 100644
Binary files a/data/posters/country-gha.webp and b/data/posters/country-gha.webp differ
diff --git a/data/posters/country-gib.webp b/data/posters/country-gib.webp
index b8953ea1f..bb9f31b7d 100644
Binary files a/data/posters/country-gib.webp and b/data/posters/country-gib.webp differ
diff --git a/data/posters/country-gin.webp b/data/posters/country-gin.webp
index 72c1858f9..c71b0d1d5 100644
Binary files a/data/posters/country-gin.webp and b/data/posters/country-gin.webp differ
diff --git a/data/posters/country-glp.webp b/data/posters/country-glp.webp
index cb982e874..d0c460705 100644
Binary files a/data/posters/country-glp.webp and b/data/posters/country-glp.webp differ
diff --git a/data/posters/country-gmb.webp b/data/posters/country-gmb.webp
index b66239e4b..49ead492d 100644
Binary files a/data/posters/country-gmb.webp and b/data/posters/country-gmb.webp differ
diff --git a/data/posters/country-gnb.webp b/data/posters/country-gnb.webp
index 25825f7bb..11e72fc0d 100644
Binary files a/data/posters/country-gnb.webp and b/data/posters/country-gnb.webp differ
diff --git a/data/posters/country-gnq.webp b/data/posters/country-gnq.webp
index 08149b69d..41156b7fe 100644
Binary files a/data/posters/country-gnq.webp and b/data/posters/country-gnq.webp differ
diff --git a/data/posters/country-grc.webp b/data/posters/country-grc.webp
index 892c3c30a..1503e593d 100644
Binary files a/data/posters/country-grc.webp and b/data/posters/country-grc.webp differ
diff --git a/data/posters/country-grd.webp b/data/posters/country-grd.webp
index cba72954b..046a470bc 100644
Binary files a/data/posters/country-grd.webp and b/data/posters/country-grd.webp differ
diff --git a/data/posters/country-guf.webp b/data/posters/country-guf.webp
index 81c95ecaf..b48c26f4c 100644
Binary files a/data/posters/country-guf.webp and b/data/posters/country-guf.webp differ
diff --git a/data/posters/country-gum.webp b/data/posters/country-gum.webp
index b026a4e9c..ec6b372ec 100644
Binary files a/data/posters/country-gum.webp and b/data/posters/country-gum.webp differ
diff --git a/data/posters/country-guy.webp b/data/posters/country-guy.webp
index 4b0c06725..e796714a0 100644
Binary files a/data/posters/country-guy.webp and b/data/posters/country-guy.webp differ
diff --git a/data/posters/country-hkg.webp b/data/posters/country-hkg.webp
index a481cd7c6..657009bfc 100644
Binary files a/data/posters/country-hkg.webp and b/data/posters/country-hkg.webp differ
diff --git a/data/posters/country-idn.webp b/data/posters/country-idn.webp
index 0a091ee89..b7b370eeb 100644
Binary files a/data/posters/country-idn.webp and b/data/posters/country-idn.webp differ
diff --git a/data/posters/country-irn.webp b/data/posters/country-irn.webp
index e3c7d6125..bd5119fe9 100644
Binary files a/data/posters/country-irn.webp and b/data/posters/country-irn.webp differ
diff --git a/data/posters/country-irq.webp b/data/posters/country-irq.webp
index 7e4bc9cea..93d18eff0 100644
Binary files a/data/posters/country-irq.webp and b/data/posters/country-irq.webp differ
diff --git a/data/posters/country-isl.webp b/data/posters/country-isl.webp
index 4080c784c..2d2b37be4 100644
Binary files a/data/posters/country-isl.webp and b/data/posters/country-isl.webp differ
diff --git a/data/posters/country-isr.webp b/data/posters/country-isr.webp
index 9d1285c04..aebcf1d00 100644
Binary files a/data/posters/country-isr.webp and b/data/posters/country-isr.webp differ
diff --git a/data/posters/country-jam.webp b/data/posters/country-jam.webp
index c5bf3a91a..f406af298 100644
Binary files a/data/posters/country-jam.webp and b/data/posters/country-jam.webp differ
diff --git a/data/posters/country-jey.webp b/data/posters/country-jey.webp
index ef3431522..7f580d4c5 100644
Binary files a/data/posters/country-jey.webp and b/data/posters/country-jey.webp differ
diff --git a/data/posters/country-jor.webp b/data/posters/country-jor.webp
index ac5ae3386..f59fbc330 100644
Binary files a/data/posters/country-jor.webp and b/data/posters/country-jor.webp differ
diff --git a/data/posters/country-jpn.webp b/data/posters/country-jpn.webp
index 7f872187c..0ad0c6220 100644
Binary files a/data/posters/country-jpn.webp and b/data/posters/country-jpn.webp differ
diff --git a/data/posters/country-kaz.webp b/data/posters/country-kaz.webp
index 123dffc30..eed8d0034 100644
Binary files a/data/posters/country-kaz.webp and b/data/posters/country-kaz.webp differ
diff --git a/data/posters/country-ken.webp b/data/posters/country-ken.webp
index 9eaaec327..a92127234 100644
Binary files a/data/posters/country-ken.webp and b/data/posters/country-ken.webp differ
diff --git a/data/posters/country-kgz.webp b/data/posters/country-kgz.webp
index b975170dc..48e43f356 100644
Binary files a/data/posters/country-kgz.webp and b/data/posters/country-kgz.webp differ
diff --git a/data/posters/country-khm.webp b/data/posters/country-khm.webp
index b6dea61e0..f11f8c4f3 100644
Binary files a/data/posters/country-khm.webp and b/data/posters/country-khm.webp differ
diff --git a/data/posters/country-kir.webp b/data/posters/country-kir.webp
index ae9f04e62..ad0cf4d03 100644
Binary files a/data/posters/country-kir.webp and b/data/posters/country-kir.webp differ
diff --git a/data/posters/country-kos.webp b/data/posters/country-kos.webp
index b812f4a85..3b6f40e39 100644
Binary files a/data/posters/country-kos.webp and b/data/posters/country-kos.webp differ
diff --git a/data/posters/country-kwt.webp b/data/posters/country-kwt.webp
index 16377f9eb..24544b733 100644
Binary files a/data/posters/country-kwt.webp and b/data/posters/country-kwt.webp differ
diff --git a/data/posters/country-lao.webp b/data/posters/country-lao.webp
index 837bc48d6..93c1c0cf4 100644
Binary files a/data/posters/country-lao.webp and b/data/posters/country-lao.webp differ
diff --git a/data/posters/country-lbn.webp b/data/posters/country-lbn.webp
index 42c677f6a..fdad487ae 100644
Binary files a/data/posters/country-lbn.webp and b/data/posters/country-lbn.webp differ
diff --git a/data/posters/country-lbr.webp b/data/posters/country-lbr.webp
index 58978a7e3..676c7d10c 100644
Binary files a/data/posters/country-lbr.webp and b/data/posters/country-lbr.webp differ
diff --git a/data/posters/country-lby.webp b/data/posters/country-lby.webp
index 386631347..6ffc4e8f3 100644
Binary files a/data/posters/country-lby.webp and b/data/posters/country-lby.webp differ
diff --git a/data/posters/country-lca.webp b/data/posters/country-lca.webp
index db8b47708..e3ebb7bc4 100644
Binary files a/data/posters/country-lca.webp and b/data/posters/country-lca.webp differ
diff --git a/data/posters/country-lie.webp b/data/posters/country-lie.webp
index c95691dfb..f4fb2dba4 100644
Binary files a/data/posters/country-lie.webp and b/data/posters/country-lie.webp differ
diff --git a/data/posters/country-lka.webp b/data/posters/country-lka.webp
index 17fbf153f..ef5a35a30 100644
Binary files a/data/posters/country-lka.webp and b/data/posters/country-lka.webp differ
diff --git a/data/posters/country-lux.webp b/data/posters/country-lux.webp
index 099df0546..9b4c1b73f 100644
Binary files a/data/posters/country-lux.webp and b/data/posters/country-lux.webp differ
diff --git a/data/posters/country-mac.webp b/data/posters/country-mac.webp
index 91c5fb133..bd1d941be 100644
Binary files a/data/posters/country-mac.webp and b/data/posters/country-mac.webp differ
diff --git a/data/posters/country-mar.webp b/data/posters/country-mar.webp
index 96c83e7a0..c6df6ed8f 100644
Binary files a/data/posters/country-mar.webp and b/data/posters/country-mar.webp differ
diff --git a/data/posters/country-mco.webp b/data/posters/country-mco.webp
index 543a616b9..c19b643bb 100644
Binary files a/data/posters/country-mco.webp and b/data/posters/country-mco.webp differ
diff --git a/data/posters/country-mdv.webp b/data/posters/country-mdv.webp
index 7f8612b27..e549cd182 100644
Binary files a/data/posters/country-mdv.webp and b/data/posters/country-mdv.webp differ
diff --git a/data/posters/country-mhl.webp b/data/posters/country-mhl.webp
index a5f840cd9..c544bc3f9 100644
Binary files a/data/posters/country-mhl.webp and b/data/posters/country-mhl.webp differ
diff --git a/data/posters/country-mli.webp b/data/posters/country-mli.webp
index 183fbfa8f..9139f6c1b 100644
Binary files a/data/posters/country-mli.webp and b/data/posters/country-mli.webp differ
diff --git a/data/posters/country-mlt.webp b/data/posters/country-mlt.webp
index 07d668aae..732997f42 100644
Binary files a/data/posters/country-mlt.webp and b/data/posters/country-mlt.webp differ
diff --git a/data/posters/country-mmr.webp b/data/posters/country-mmr.webp
index e21048af8..4acaa421a 100644
Binary files a/data/posters/country-mmr.webp and b/data/posters/country-mmr.webp differ
diff --git a/data/posters/country-mne.webp b/data/posters/country-mne.webp
index e42d40be8..20e24409d 100644
Binary files a/data/posters/country-mne.webp and b/data/posters/country-mne.webp differ
diff --git a/data/posters/country-mng.webp b/data/posters/country-mng.webp
index 95ec5d8cb..8e79e278f 100644
Binary files a/data/posters/country-mng.webp and b/data/posters/country-mng.webp differ
diff --git a/data/posters/country-mnp.webp b/data/posters/country-mnp.webp
index 323f763ba..1a28d3c68 100644
Binary files a/data/posters/country-mnp.webp and b/data/posters/country-mnp.webp differ
diff --git a/data/posters/country-moz.webp b/data/posters/country-moz.webp
index 27ea07269..d9d171d88 100644
Binary files a/data/posters/country-moz.webp and b/data/posters/country-moz.webp differ
diff --git a/data/posters/country-mrt.webp b/data/posters/country-mrt.webp
index 6bf7a1fc8..5ec3bc017 100644
Binary files a/data/posters/country-mrt.webp and b/data/posters/country-mrt.webp differ
diff --git a/data/posters/country-msr.webp b/data/posters/country-msr.webp
index dc5691c05..b6063cbd7 100644
Binary files a/data/posters/country-msr.webp and b/data/posters/country-msr.webp differ
diff --git a/data/posters/country-mus.webp b/data/posters/country-mus.webp
index 9982a5b62..e1c49f99c 100644
Binary files a/data/posters/country-mus.webp and b/data/posters/country-mus.webp differ
diff --git a/data/posters/country-mwi.webp b/data/posters/country-mwi.webp
index e97382492..205cd58d9 100644
Binary files a/data/posters/country-mwi.webp and b/data/posters/country-mwi.webp differ
diff --git a/data/posters/country-mys.webp b/data/posters/country-mys.webp
index 1de9b3d05..f8aaecc8d 100644
Binary files a/data/posters/country-mys.webp and b/data/posters/country-mys.webp differ
diff --git a/data/posters/country-myt.webp b/data/posters/country-myt.webp
index 6dfcac727..8d2b38f8c 100644
Binary files a/data/posters/country-myt.webp and b/data/posters/country-myt.webp differ
diff --git a/data/posters/country-nam.webp b/data/posters/country-nam.webp
index 9db3bf6df..0bcc099c8 100644
Binary files a/data/posters/country-nam.webp and b/data/posters/country-nam.webp differ
diff --git a/data/posters/country-ncl.webp b/data/posters/country-ncl.webp
index bdeb77c87..f1b5ab08d 100644
Binary files a/data/posters/country-ncl.webp and b/data/posters/country-ncl.webp differ
diff --git a/data/posters/country-ner.webp b/data/posters/country-ner.webp
index a06ff8d87..5a2f11c10 100644
Binary files a/data/posters/country-ner.webp and b/data/posters/country-ner.webp differ
diff --git a/data/posters/country-nfk.webp b/data/posters/country-nfk.webp
index 4f6f3f699..978729a6e 100644
Binary files a/data/posters/country-nfk.webp and b/data/posters/country-nfk.webp differ
diff --git a/data/posters/country-nga.webp b/data/posters/country-nga.webp
index 56a329dd5..8095e8dd7 100644
Binary files a/data/posters/country-nga.webp and b/data/posters/country-nga.webp differ
diff --git a/data/posters/country-niu.webp b/data/posters/country-niu.webp
index 5c1733c3a..ad71360e0 100644
Binary files a/data/posters/country-niu.webp and b/data/posters/country-niu.webp differ
diff --git a/data/posters/country-npl.webp b/data/posters/country-npl.webp
index fbc26ce6e..69c236a39 100644
Binary files a/data/posters/country-npl.webp and b/data/posters/country-npl.webp differ
diff --git a/data/posters/country-nzl.webp b/data/posters/country-nzl.webp
index b847a9ce6..1a374e8d6 100644
Binary files a/data/posters/country-nzl.webp and b/data/posters/country-nzl.webp differ
diff --git a/data/posters/country-omn.webp b/data/posters/country-omn.webp
index b066d90d5..435f3a921 100644
Binary files a/data/posters/country-omn.webp and b/data/posters/country-omn.webp differ
diff --git a/data/posters/country-pak.webp b/data/posters/country-pak.webp
index 90a764c7f..ac6cae40f 100644
Binary files a/data/posters/country-pak.webp and b/data/posters/country-pak.webp differ
diff --git a/data/posters/country-pan.webp b/data/posters/country-pan.webp
index 2ce8f458f..7dd2abfc3 100644
Binary files a/data/posters/country-pan.webp and b/data/posters/country-pan.webp differ
diff --git a/data/posters/country-per.webp b/data/posters/country-per.webp
index 6c717293f..9abe60433 100644
Binary files a/data/posters/country-per.webp and b/data/posters/country-per.webp differ
diff --git a/data/posters/country-phl.webp b/data/posters/country-phl.webp
index 381ceaf46..eef15051e 100644
Binary files a/data/posters/country-phl.webp and b/data/posters/country-phl.webp differ
diff --git a/data/posters/country-plw.webp b/data/posters/country-plw.webp
index b80244c69..18a8fc6ef 100644
Binary files a/data/posters/country-plw.webp and b/data/posters/country-plw.webp differ
diff --git a/data/posters/country-png.webp b/data/posters/country-png.webp
index 76cc3894b..4840cb8aa 100644
Binary files a/data/posters/country-png.webp and b/data/posters/country-png.webp differ
diff --git a/data/posters/country-prk.webp b/data/posters/country-prk.webp
index c45b3402e..b70c04d95 100644
Binary files a/data/posters/country-prk.webp and b/data/posters/country-prk.webp differ
diff --git a/data/posters/country-pry.webp b/data/posters/country-pry.webp
index 4a471aaeb..56c938e7e 100644
Binary files a/data/posters/country-pry.webp and b/data/posters/country-pry.webp differ
diff --git a/data/posters/country-pse.webp b/data/posters/country-pse.webp
index 320f9e696..e09ea571b 100644
Binary files a/data/posters/country-pse.webp and b/data/posters/country-pse.webp differ
diff --git a/data/posters/country-pyf.webp b/data/posters/country-pyf.webp
index af4962a33..7a4114b46 100644
Binary files a/data/posters/country-pyf.webp and b/data/posters/country-pyf.webp differ
diff --git a/data/posters/country-qat.webp b/data/posters/country-qat.webp
index 3bd1c2e8b..7a33468aa 100644
Binary files a/data/posters/country-qat.webp and b/data/posters/country-qat.webp differ
diff --git a/data/posters/country-rus.webp b/data/posters/country-rus.webp
index ae522d397..57fc7b9a0 100644
Binary files a/data/posters/country-rus.webp and b/data/posters/country-rus.webp differ
diff --git a/data/posters/country-sau.webp b/data/posters/country-sau.webp
index f524e76ce..b67e9782b 100644
Binary files a/data/posters/country-sau.webp and b/data/posters/country-sau.webp differ
diff --git a/data/posters/country-sdn.webp b/data/posters/country-sdn.webp
index cebb182ad..9a855344c 100644
Binary files a/data/posters/country-sdn.webp and b/data/posters/country-sdn.webp differ
diff --git a/data/posters/country-sen.webp b/data/posters/country-sen.webp
index 6e5bc484c..4107502c8 100644
Binary files a/data/posters/country-sen.webp and b/data/posters/country-sen.webp differ
diff --git a/data/posters/country-shn.webp b/data/posters/country-shn.webp
index f32bdb9f7..8d36896ae 100644
Binary files a/data/posters/country-shn.webp and b/data/posters/country-shn.webp differ
diff --git a/data/posters/country-sjm.webp b/data/posters/country-sjm.webp
index 12edcd4e7..ba3845d2d 100644
Binary files a/data/posters/country-sjm.webp and b/data/posters/country-sjm.webp differ
diff --git a/data/posters/country-slb.webp b/data/posters/country-slb.webp
index 9e344b94a..8a5624d48 100644
Binary files a/data/posters/country-slb.webp and b/data/posters/country-slb.webp differ
diff --git a/data/posters/country-sle.webp b/data/posters/country-sle.webp
index 9773c9909..f6fc116f0 100644
Binary files a/data/posters/country-sle.webp and b/data/posters/country-sle.webp differ
diff --git a/data/posters/country-smr.webp b/data/posters/country-smr.webp
index ab49cd90b..db15f66a3 100644
Binary files a/data/posters/country-smr.webp and b/data/posters/country-smr.webp differ
diff --git a/data/posters/country-som.webp b/data/posters/country-som.webp
index 49afcadac..9bed71d3f 100644
Binary files a/data/posters/country-som.webp and b/data/posters/country-som.webp differ
diff --git a/data/posters/country-ssd.webp b/data/posters/country-ssd.webp
index 69fed44a2..6a415a556 100644
Binary files a/data/posters/country-ssd.webp and b/data/posters/country-ssd.webp differ
diff --git a/data/posters/country-stp.webp b/data/posters/country-stp.webp
index 49e2ce7d7..4afd6a0fd 100644
Binary files a/data/posters/country-stp.webp and b/data/posters/country-stp.webp differ
diff --git a/data/posters/country-sur.webp b/data/posters/country-sur.webp
index 087f08bc9..51122d949 100644
Binary files a/data/posters/country-sur.webp and b/data/posters/country-sur.webp differ
diff --git a/data/posters/country-swe.webp b/data/posters/country-swe.webp
index 787f4b4ce..54192581d 100644
Binary files a/data/posters/country-swe.webp and b/data/posters/country-swe.webp differ
diff --git a/data/posters/country-swz.webp b/data/posters/country-swz.webp
index 9a084b4d4..c06e806be 100644
Binary files a/data/posters/country-swz.webp and b/data/posters/country-swz.webp differ
diff --git a/data/posters/country-sxm.webp b/data/posters/country-sxm.webp
index 8c9f3bee0..9dde70a88 100644
Binary files a/data/posters/country-sxm.webp and b/data/posters/country-sxm.webp differ
diff --git a/data/posters/country-syr.webp b/data/posters/country-syr.webp
index 141ea2970..8602b9c40 100644
Binary files a/data/posters/country-syr.webp and b/data/posters/country-syr.webp differ
diff --git a/data/posters/country-tca.webp b/data/posters/country-tca.webp
index 1d008c358..4dd206183 100644
Binary files a/data/posters/country-tca.webp and b/data/posters/country-tca.webp differ
diff --git a/data/posters/country-tcd.webp b/data/posters/country-tcd.webp
index d446e5b22..fb926a4dd 100644
Binary files a/data/posters/country-tcd.webp and b/data/posters/country-tcd.webp differ
diff --git a/data/posters/country-tgo.webp b/data/posters/country-tgo.webp
index bdcca4ba8..dd8fe7e8b 100644
Binary files a/data/posters/country-tgo.webp and b/data/posters/country-tgo.webp differ
diff --git a/data/posters/country-tha.webp b/data/posters/country-tha.webp
index 1a9676ba4..b3dc88f01 100644
Binary files a/data/posters/country-tha.webp and b/data/posters/country-tha.webp differ
diff --git a/data/posters/country-tjk.webp b/data/posters/country-tjk.webp
index 0eef944fd..c12ff8719 100644
Binary files a/data/posters/country-tjk.webp and b/data/posters/country-tjk.webp differ
diff --git a/data/posters/country-tkl.webp b/data/posters/country-tkl.webp
index 9db15ecfb..ee29891a6 100644
Binary files a/data/posters/country-tkl.webp and b/data/posters/country-tkl.webp differ
diff --git a/data/posters/country-ton.webp b/data/posters/country-ton.webp
index b74d62207..8393a02e3 100644
Binary files a/data/posters/country-ton.webp and b/data/posters/country-ton.webp differ
diff --git a/data/posters/country-tun.webp b/data/posters/country-tun.webp
index 4d611ea1c..e1f5f859c 100644
Binary files a/data/posters/country-tun.webp and b/data/posters/country-tun.webp differ
diff --git a/data/posters/country-tur.webp b/data/posters/country-tur.webp
index 6ac019d53..0c6f20e3f 100644
Binary files a/data/posters/country-tur.webp and b/data/posters/country-tur.webp differ
diff --git a/data/posters/country-tza.webp b/data/posters/country-tza.webp
index 981019b99..d7cab1435 100644
Binary files a/data/posters/country-tza.webp and b/data/posters/country-tza.webp differ
diff --git a/data/posters/country-uga.webp b/data/posters/country-uga.webp
index 8c6e36d96..35cb3848e 100644
Binary files a/data/posters/country-uga.webp and b/data/posters/country-uga.webp differ
diff --git a/data/posters/country-usa.webp b/data/posters/country-usa.webp
index 8be1be32c..d39140eb7 100644
Binary files a/data/posters/country-usa.webp and b/data/posters/country-usa.webp differ
diff --git a/data/posters/country-uzb.webp b/data/posters/country-uzb.webp
index dfbf8fb62..d6edb256e 100644
Binary files a/data/posters/country-uzb.webp and b/data/posters/country-uzb.webp differ
diff --git a/data/posters/country-vct.webp b/data/posters/country-vct.webp
index 83943df4b..d8ea9b873 100644
Binary files a/data/posters/country-vct.webp and b/data/posters/country-vct.webp differ
diff --git a/data/posters/country-ven.webp b/data/posters/country-ven.webp
index 12b837ce1..6f0a0d25d 100644
Binary files a/data/posters/country-ven.webp and b/data/posters/country-ven.webp differ
diff --git a/data/posters/country-vgb.webp b/data/posters/country-vgb.webp
index d599cc28e..620d3caa8 100644
Binary files a/data/posters/country-vgb.webp and b/data/posters/country-vgb.webp differ
diff --git a/data/posters/country-vir.webp b/data/posters/country-vir.webp
index ac3ac59e8..39022e434 100644
Binary files a/data/posters/country-vir.webp and b/data/posters/country-vir.webp differ
diff --git a/data/posters/country-vnm.webp b/data/posters/country-vnm.webp
index 1e24513df..fccd7e79c 100644
Binary files a/data/posters/country-vnm.webp and b/data/posters/country-vnm.webp differ
diff --git a/data/posters/country-vut.webp b/data/posters/country-vut.webp
index 28906a854..b45a25a72 100644
Binary files a/data/posters/country-vut.webp and b/data/posters/country-vut.webp differ
diff --git a/data/posters/country-wlf.webp b/data/posters/country-wlf.webp
index d0310f2aa..f3efdbe16 100644
Binary files a/data/posters/country-wlf.webp and b/data/posters/country-wlf.webp differ
diff --git a/data/posters/country-wsm.webp b/data/posters/country-wsm.webp
index e379053d3..b4f0fbb4a 100644
Binary files a/data/posters/country-wsm.webp and b/data/posters/country-wsm.webp differ
diff --git a/data/posters/country-yem.webp b/data/posters/country-yem.webp
index 82838ecd0..4b11f07c6 100644
Binary files a/data/posters/country-yem.webp and b/data/posters/country-yem.webp differ
diff --git a/data/posters/country-zaf.webp b/data/posters/country-zaf.webp
index 9e630212e..78aad3623 100644
Binary files a/data/posters/country-zaf.webp and b/data/posters/country-zaf.webp differ
diff --git a/data/posters/country-zmb.webp b/data/posters/country-zmb.webp
index 37b5be7e3..b792b2dbe 100644
Binary files a/data/posters/country-zmb.webp and b/data/posters/country-zmb.webp differ
diff --git a/data/posters/country-zwe.webp b/data/posters/country-zwe.webp
index 2ac065a19..f64114a10 100644
Binary files a/data/posters/country-zwe.webp and b/data/posters/country-zwe.webp differ
diff --git a/documentation/reference-library-index.md b/documentation/reference-library-index.md
index 3a4a2338b..c037a3d39 100644
--- a/documentation/reference-library-index.md
+++ b/documentation/reference-library-index.md
@@ -74,6 +74,8 @@ and a change here can break other maps.
`import … from '@map/components/map-controls/MapControlButton.vue'`
- **MapControlMenu** — MapControlMenu.vue — the ONE menu every map control opens.
`import … from '@map/components/map-controls/MapControlMenu.vue'`
+- **MapInfoButton** — MapInfoButton.vue — the map's "what can this map do for you?" control, IN the map's control column.
+ `import … from '@map/components/map-controls/MapInfoButton.vue'`
- **MapToolbar** — MapToolbar.vue — Positioned layout shell for map control buttons.
`import … from '@map/components/map-controls/MapToolbar.vue'`
- **ShareButton** — ShareButton.vue — Non-technical share modal for the map toolbar.
diff --git a/internal/check-poster-browser-equiv.mjs b/internal/check-poster-browser-equiv.mjs
index 4bfd5dff4..2b8d8688f 100644
--- a/internal/check-poster-browser-equiv.mjs
+++ b/internal/check-poster-browser-equiv.mjs
@@ -121,7 +121,13 @@ const results = []
const series = { totalGroups: tier.reduce((a, x) => a + (x.count || 0), 0), totalLists: tier.length, index: tier.indexOf(c) + 1 }
results.push({ what: `${c.id} (3x3 poster, generateCountrySheet)`,
browser: await generateCountrySheet({ country: c, records: recs, assetsBase, ISO3_NAME, format: '3x3', series, date: DATE }),
- node: nodeSheet({ COUNTRIES: '1', FORMAT: '3x3', SHEET: '3x3', ONLY: c.id }, `${c.id}.html`) })
+ // SPARSE on the Node side because a POSTER is generated with SPARSE=1 -- that is how the `posters`
+ // script builds every stored thumbnail, and how the browser now draws a poster at the click. This
+ // gate used to compare the dense layout with the dense layout, so it passed while every stored
+ // thumbnail showed the SPARSE header and every print showed the dense one: a check that agreed
+ // with itself and with nothing a reader saw. The packet case above stays dense on both sides,
+ // because packet pages are built without SPARSE.
+ node: nodeSheet({ COUNTRIES: '1', FORMAT: '3x3', SHEET: '3x3', SPARSE: '1', ONLY: c.id }, `${c.id}.html`) })
}
for (const r of results) {
diff --git a/library/components/info/MapInfo.vue b/library/components/info/MapInfo.vue
index 77452351c..68c5d1b25 100644
--- a/library/components/info/MapInfo.vue
+++ b/library/components/info/MapInfo.vue
@@ -26,7 +26,9 @@
* Relative srcs resolve against `assetsBase`, so the same list works in any tree.
*
* ★ THE POINTER GOES FOR GOOD, per map, once its popup has been opened AND closed (opening alone
- * could be a mis-tap). The checkbox in the popup turns the pointer off on EVERY map. Both live in
+ * could be a mis-tap). The checkbox in the popup turns the pointer off on EVERY map. A map given
+ * `pointer-keep` points ONCE PER PAGE LOAD instead, and offers "Keep tooltip turned on" in place of that
+ * box (see the prop). What is stored lives in
* localStorage, read through a guard: private browsing and sandboxed frames throw on access, and a
* hint must never be the thing that breaks a page. The button itself always stays.
*
@@ -43,7 +45,7 @@
* Usage (one per map, inside a positioned container):
*
*/
-import { ref, reactive, nextTick, onMounted, onBeforeUnmount } from 'vue'
+import { ref, reactive, nextTick, onMounted, onBeforeUnmount, watch } from 'vue'
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
import { useOptionalT } from '@map/composables/useOptionalT.js'
import { tStatic, getRuntimeLocale } from '@map/i18n/index.js'
@@ -68,6 +70,21 @@ const props = defineProps({
placement: { type: String, default: 'top-right', validator: (v) => ['top-right', 'top-left'].includes(v) },
/** The host's current locale, when it tracks one. */
locale: { type: String, default: '' },
+ /**
+ * 'floating' (default): this component draws its own button and pointer over its container.
+ * 'control': the map draws the button in its own control column (map-controls/MapInfoButton.vue) and
+ * this component answers it. Its own button stays as the FALLBACK, shown whenever that control is not
+ * actually on screen (see "control mode" below).
+ */
+ trigger: { type: String, default: 'floating', validator: (v) => ['floating', 'control'].includes(v) },
+ /**
+ * The pointer model of a map that offers "Keep tooltip turned on" (IN PLACE OF the every-map "don't
+ * point again" box). Its pointer shows ONCE PER PAGE LOAD: the first time the map is on screen in that
+ * load. Opening the popup hides it for the rest of that load only, and the next full load shows it
+ * again: page-load memory (pointerDoneThisLoad, below), never storage. The box, off by default, keeps it
+ * showing after the popup closes and on every appearance; that preference IS stored, per map.
+ */
+ pointerKeep: { type: Boolean, default: false },
})
// ── locale and text ──────────────────────────────────────────────────────────────────────────────
@@ -86,19 +103,37 @@ const isRtl = () => lang() === 'ar'
// ── storage, guarded ─────────────────────────────────────────────────────────────────────────────
const SEEN = 'dxmaps.mapInfo.seen.'
const OFF = 'dxmaps.mapInfo.pointer'
+const KEEP = 'dxmaps.mapInfo.keep.'
const OFF_EVENT = 'dxmaps:mapinfo-pointer-off'
function readStore(k) { try { return window.localStorage.getItem(k) } catch { return null } }
function writeStore(k, v) { try { window.localStorage.setItem(k, v) } catch { /* private mode: in-memory only */ } }
const pointing = ref(false)
const pointerOff = ref(false)
+const keep = ref(false)
function refreshPointer() {
pointerOff.value = readStore(OFF) === 'off'
+ if (props.pointerKeep) {
+ keep.value = readStore(KEEP + props.storageKey) === '1'
+ pointing.value = keep.value || !pointerDoneThisLoad.has(props.storageKey)
+ return
+ }
pointing.value = !pointerOff.value && readStore(SEEN + props.storageKey) !== '1'
}
-// Another map on the page (same document) or another tab (storage event) turned the pointer off.
-function onPointerOff() { refreshPointer() }
-function onStorage(e) { if (!e || e.key === OFF || e.key === SEEN + props.storageKey) refreshPointer() }
+// Another map on the page (same document) or another tab (storage event) turned the pointer off. A
+// page-load pointer answers only its own keep box: the every-map switch is not offered beside it, and a
+// switch the reader cannot see on this map must not silently take its pointer away.
+function onPointerOff() { if (!props.pointerKeep) refreshPointer() }
+function onStorage(e) {
+ if (props.pointerKeep) {
+ if (!e || e.key === KEEP + props.storageKey) {
+ keep.value = readStore(KEEP + props.storageKey) === '1'
+ if (keep.value) pointing.value = true
+ }
+ return
+ }
+ if (!e || e.key === OFF || e.key === SEEN + props.storageKey) refreshPointer()
+}
onMounted(() => {
refreshPointer()
window.addEventListener(OFF_EVENT, onPointerOff)
@@ -114,6 +149,10 @@ function setPointerOff(off) {
pointing.value = !off && readStore(SEEN + props.storageKey) !== '1'
try { window.dispatchEvent(new CustomEvent(OFF_EVENT)) } catch { /* no window */ }
}
+function setKeep(on) {
+ keep.value = on
+ writeStore(KEEP + props.storageKey, on ? '1' : '0')
+}
// ── open / close ─────────────────────────────────────────────────────────────────────────────────
const open = ref(false)
@@ -124,16 +163,125 @@ const failed = reactive({})
async function show() {
opens.value++
open.value = true
+ // A page-load pointer is done for this load once the popup has been opened (in memory only).
+ if (props.pointerKeep) pointerDoneThisLoad.add(props.storageKey)
await nextTick()
closeEl.value?.focus()
}
async function hide() {
open.value = false
- writeStore(SEEN + props.storageKey, '1')
- pointing.value = false
+ if (!props.pointerKeep) writeStore(SEEN + props.storageKey, '1')
+ pointing.value = props.pointerKeep && keep.value
await nextTick()
- btnEl.value?.focus()
+ // Back to whichever button the reader can see: the map's own control when it is on screen, else ours.
+ const back = props.trigger === 'control' && controlShown.value && control.value ? control.value : btnEl.value
+ back?.focus()
}
+
+// ── control mode ─────────────────────────────────────────────────────────────────────────────────
+// ★ FAIL-OPEN: THERE IS ALWAYS EXACTLY ONE ⓘ. The map's control (MapInfoButton) announces itself and asks
+// for the popup with composed events that bubble out of the plugin's shadow root to the pane this
+// component sits in. Our own button is hidden ONLY while that control is MEASURED to be usable:
+// connected, a non-zero rect on screen, and in no inert subtree (the composite marks its inactive pane
+// inert, and an inert pane keeps its rects). It is re-measured by IntersectionObserver and ResizeObserver
+// on the control, and by a slow fallback timer. It is NEVER inferred from an unmount event: a detached
+// element cannot bubble anything to the pane. So on the UPG-100 wall (no map on screen), on a tab being
+// switched away and back, or with the column hidden, our button is the one that shows.
+const rootEl = ref(null)
+const control = ref(null)
+const controlShown = ref(false)
+let pane = null, io = null, ro = null, timer = null
+function inert(el) {
+ for (let n = el; n; n = n.parentNode || n.host) {
+ if (n.nodeType === 1 && (n.hasAttribute('inert') || n.getAttribute('aria-hidden') === 'true')) return true
+ }
+ return false
+}
+function measureControl() {
+ const c = control.value
+ let shown = false
+ if (c && c.isConnected && !inert(c)) {
+ const r = c.getBoundingClientRect()
+ shown = r.width > 0 && r.height > 0 && r.bottom > 0 && r.right > 0 && r.top < window.innerHeight && r.left < window.innerWidth
+ if (shown) {
+ const n = placeBeside(r), o = ctlAt.value
+ if (!n || !o || n.side !== o.side || n.top !== o.top || n.left !== o.left || n.right !== o.right) ctlAt.value = n
+ }
+ }
+ controlShown.value = shown
+}
+// ★ THE POINTER FOLLOWS THE CONTROL, WHEREVER THE MAP PUT IT. The floating pointer is anchored to our
+// own button by CSS; the control lives in the map's shadow root, so its place is MEASURED, against the
+// box our absolutely-placed pointer is laid out in (our offsetParent, the pane, which scrolls: hence
+// scrollTop). It goes on the control's physical inner side: a right-to-left map mirrors its column to
+// the left edge, and that is read from where the control IS, never assumed from the page's direction.
+const GAP = 10
+function placeBeside(r) {
+ const cb = rootEl.value && rootEl.value.offsetParent
+ if (!cb) return null
+ const b = cb.getBoundingClientRect()
+ const x0 = b.left + cb.clientLeft, y0 = b.top + cb.clientTop
+ const top = Math.round(r.top - y0 + cb.scrollTop + r.height / 2)
+ return (r.left + r.width / 2) > (x0 + cb.clientWidth / 2)
+ ? { side: 'right', top, right: Math.round(x0 + cb.clientWidth - r.left + GAP) }
+ : { side: 'left', top, left: Math.round(r.right - x0 + GAP) }
+}
+const ctlAt = ref(null)
+const ctlStyle = () => {
+ const p = ctlAt.value
+ return p.side === 'right' ? { top: p.top + 'px', right: p.right + 'px' } : { top: p.top + 'px', left: p.left + 'px' }
+}
+const onResize = () => measureControl()
+function adopt(el) {
+ if (!el || el === control.value) { measureControl(); return }
+ try { io?.disconnect(); ro?.disconnect() } catch { /* already gone */ }
+ control.value = el
+ try { io = new IntersectionObserver(measureControl); io.observe(el) } catch { io = null }
+ try { ro = new ResizeObserver(measureControl); ro.observe(el) } catch { ro = null }
+ el.setAttribute('aria-expanded', String(open.value))
+ measureControl()
+}
+// Only events that travelled through OUR pane; they stop here, so an outer host never sees them twice.
+const ours = (e) => !!pane && typeof e.composedPath === 'function' && e.composedPath().includes(pane)
+function onControl(e) {
+ if (!ours(e)) return
+ e.stopPropagation()
+ if (e.detail) e.detail.ack = true
+ adopt(e.detail && e.detail.el)
+}
+function onOpenRequest(e) {
+ if (!ours(e)) return
+ e.stopPropagation()
+ adopt(e.detail && e.detail.el)
+ if (!open.value) show()
+}
+onMounted(() => {
+ if (props.trigger !== 'control') return
+ pane = rootEl.value && rootEl.value.parentElement
+ if (!pane) return
+ pane.addEventListener('dxmaps:mapinfo-control', onControl)
+ pane.addEventListener('dxmaps:mapinfo-open', onOpenRequest)
+ timer = window.setInterval(measureControl, 1500)
+ window.addEventListener('resize', onResize)
+ // A control that mounted before we did asked into the void; tell it to ask again.
+ try { window.dispatchEvent(new CustomEvent('dxmaps:mapinfo-host')) } catch { /* no CustomEvent */ }
+})
+onBeforeUnmount(() => {
+ if (pane) {
+ pane.removeEventListener('dxmaps:mapinfo-control', onControl)
+ pane.removeEventListener('dxmaps:mapinfo-open', onOpenRequest)
+ }
+ try { io?.disconnect(); ro?.disconnect() } catch { /* already gone */ }
+ if (timer) window.clearInterval(timer)
+ window.removeEventListener('resize', onResize)
+})
+watch(open, (v) => { control.value?.setAttribute('aria-expanded', String(v)) })
+const floatingShown = () => props.trigger !== 'control' || !controlShown.value
+// The pointer beside the control has been on screen: this page load has pointed once, so a remount (the
+// gallery rebuilds a heavy tab on every switch back) does not point again. Marked on SCREEN, not on mount:
+// a tab's MapInfo can mount inside a hidden pane.
+watch(() => props.pointerKeep && pointing.value && !open.value && !floatingShown() && !!ctlAt.value,
+ (on) => { if (on) pointerDoneThisLoad.add(props.storageKey) }, { immediate: true })
// ★ aria-modal PROMISES THE READER THAT TAB STAYS INSIDE, so keep it there: Tab from the last control
// wraps to the first, Shift+Tab from the first to the last. The active element is read from the shadow
// root (document.activeElement would be the host element). Hidden controls are skipped.
@@ -200,6 +348,16 @@ useShadowStyles(`
.mi-pointer svg{ width:16px; height:16px; flex:none; }
@keyframes mi-nudge{ 0%,100%{ transform:translateX(0) } 50%{ transform:translateX(6px) } }
@keyframes mi-nudge-left{ 0%,100%{ transform:translateX(0) } 50%{ transform:translateX(-6px) } }
+ /* Control mode: top/left/right come from placeBeside (inline), centred on the control by translate,
+ which composes with the nudge's transform. Laid out left-to-right on purpose: the arrow's side is the
+ control's PHYSICAL side, measured, so the page direction must not flip the row, the glyph or the
+ nudge (the span keeps the text's own direction). (0,3,0) so the 1200px rule below does not hide it:
+ that rule measured the floating pointer crossing each tab's top strip, and this one is placed and
+ measured beside one map's own control instead. */
+ .mi .mi-pointer.mi-ctl{ display:flex; direction:ltr; translate:0 -50%; }
+ .mi .mi-pointer.mi-ctl-left{ flex-direction:row-reverse; animation-name:mi-nudge-left; }
+ .mi .mi-pointer.mi-ctl-right{ animation-name:mi-nudge; }
+ .mi[dir="rtl"] .mi-pointer.mi-ctl svg{ transform:none; }
/* z-index above every map's own top layer: PinHint's first-visit pill sits at 2147482000, so at 1000 it
floated bright and clickable over the dimmed backdrop (gospel). The dialog is a child of this fixed,
@@ -301,14 +459,21 @@ useShadowStyles(`
/* This component animates (the pointer's nudge), so it carries its own reduced-motion rule where its
styles are injected: a page-level rule cannot reach into a shadow root. */
@media (prefers-reduced-motion: reduce){
- .mi-pointer{ animation:none; }
+ .mi-pointer, .mi .mi-pointer.mi-ctl{ animation:none; }
}
`, 'map-info')
+
+
-