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') + +