From 225c3b2c2afb199c6b389f21cc86d90096408ccc Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Sat, 26 Sep 2026 16:53:41 +0000 Subject: [PATCH] Update from source 1a761741 --- documentation/reference-library-index.md | 2 +- internal/check-composite-embed-knobs.mjs | 13 +- library/components/ResearchMapFilterPanel.vue | 2 + library/components/hints/PinHint.vue | 2 + library/components/legends/LegendMobile.vue | 2 + .../components/legends/SemanticTreeLegend.vue | 2 + .../components/search/SearchFilterHeader.vue | 24 +- library/i18n/locales/ar/aria.json | 13 +- library/i18n/locales/ar/dashboard.json | 5 +- library/i18n/locales/ar/gospel.json | 3 +- library/i18n/locales/de/aria.json | 13 +- library/i18n/locales/de/dashboard.json | 5 +- library/i18n/locales/de/gospel.json | 3 +- library/i18n/locales/en/aria.json | 13 +- library/i18n/locales/en/dashboard.json | 5 +- library/i18n/locales/en/gospel.json | 3 +- library/i18n/locales/es/aria.json | 13 +- library/i18n/locales/es/dashboard.json | 5 +- library/i18n/locales/es/gospel.json | 3 +- library/i18n/locales/fr/aria.json | 13 +- library/i18n/locales/fr/dashboard.json | 5 +- library/i18n/locales/fr/gospel.json | 3 +- library/i18n/locales/hi/aria.json | 13 +- library/i18n/locales/hi/dashboard.json | 5 +- library/i18n/locales/hi/gospel.json | 3 +- library/i18n/locales/it/aria.json | 13 +- library/i18n/locales/it/dashboard.json | 5 +- library/i18n/locales/it/gospel.json | 3 +- library/i18n/locales/pt/aria.json | 13 +- library/i18n/locales/pt/dashboard.json | 5 +- library/i18n/locales/pt/gospel.json | 3 +- library/i18n/locales/ro/aria.json | 13 +- library/i18n/locales/ro/dashboard.json | 5 +- library/i18n/locales/ro/gospel.json | 3 +- library/i18n/locales/ru/aria.json | 13 +- library/i18n/locales/ru/dashboard.json | 5 +- library/i18n/locales/ru/gospel.json | 3 +- library/i18n/locales/zh/aria.json | 13 +- library/i18n/locales/zh/dashboard.json | 5 +- library/i18n/locales/zh/gospel.json | 3 +- package.json | 4 + plugin-designs/country-posters/index.js | 15 +- plugin-designs/doxa-research-map/index.js | 15 +- .../doxa-research-map/research-map.vue | 67 +++- .../scripts/check-language-code-link.mjs | 205 +++++++++++++ .../scripts/fixtures/language-codes.json | 1 + plugin-designs/doxa-simple-map/index.js | 17 +- plugin-designs/my-upg-100-list/index.js | 17 +- .../my-upg-100-list/upg-100-list.vue | 192 +++++++++--- plugin-designs/pplr-data-maps/index.js | 11 +- .../src/components/SemanticTreeLegend.vue | 15 +- .../research-dashboard/research-dashboard.vue | 103 ++++++- .../scripts/check-dashboard-filter-a11y.mjs | 285 ++++++++++++++++++ .../check-dashboard-geocoder-provider.mjs | 116 +++++-- .../dashboards/DashboardFilterChips.vue | 51 +++- .../research-map-plus-grid.vue | 50 ++- .../scripts/check-linked-vocabulary.mjs | 14 +- plugin-designs/upg-neighbor/index.js | 11 +- .../all-people-groups/all-people-groups.js | 45 +-- .../all-people-groups/index.html | 2 +- public/dx-maps/big-picture/big-picture.js | 26 +- .../big-picture/big-picture/index.html | 2 +- .../big-picture/frontier/index.html | 2 +- .../big-picture/big-picture/index.html | 2 +- .../cities-internet/cities-internet.js | 53 ++-- .../connectivity-list/index.html | 2 +- .../connectivity-map/index.html | 2 +- .../cities-internet/data-tables/index.html | 2 +- .../country-posters/countries-map/index.html | 2 +- .../country-poster-wall/index.html | 2 +- .../country-posters-mfe/index.html | 2 +- .../country-posters/country-posters.js | 160 +++++----- .../dashboard-plus-grid.js | 62 ++-- .../dashboard-plus-grid/default/index.html | 2 +- .../dashboard-plus-grid/index.html | 2 +- public/dx-maps/demo-map/demo-map.js | 81 ++--- public/dx-maps/demo-map/demo-map/index.html | 2 +- .../demo-map/demo-map/maplibre/index.html | 2 +- public/dx-maps/doxa-maps-spa/manifest.json | 88 +++--- .../doxa-research-map/doxa-research-map.js | 104 ++++--- .../doxa-research-map/research-map/index.html | 2 +- .../research-map/maplibre/index.html | 2 +- .../doxa-simple-map/doxa-simple-map.js | 71 ++--- .../doxa-simple-map/adoption/index.html | 2 +- .../doxa-simple-map/engagement/index.html | 2 +- .../doxa-simple-map/index.html | 2 +- .../doxa-simple-map/prayer/index.html | 2 +- .../gospel-resources/charts/index.html | 2 +- .../gospel-resources/data-tables/index.html | 2 +- .../gospel-dashboard/index.html | 2 +- .../gospel-resources/gospel-resources.js | 43 +-- .../resources-list/index.html | 2 +- .../gospel-resources/resources-map/index.html | 2 +- public/dx-maps/key-cities/key-cities.js | 149 ++++----- public/dx-maps/manifest.json | 88 +++--- .../my-upg-100-list/my-upg-100-list.js | 93 +++--- .../my-upg-100-list/poster-wall/index.html | 2 +- .../my-upg-100-list/upg-100-list/index.html | 2 +- .../my-upg-100-list/upg-100-mfe/index.html | 2 +- .../dx-maps/pplr-data-maps/pplr-data-maps.js | 55 ++-- .../pplr-data-maps/pplr-data-maps/index.html | 2 +- .../region-dashboards/index.html | 2 +- .../regions-dashboard/regions-dashboard.js | 101 ++++--- .../regions-dashboard/regions-list/index.html | 2 +- .../regions-dashboard/regions-mfe/index.html | 2 +- .../research-dashboard/research-dashboard.js | 65 ++-- .../research-dashboard/index.html | 2 +- .../research-map-plus-grid.js | 16 +- .../research-map-plus-grid/default/index.html | 2 +- .../research-map-plus-grid/index.html | 2 +- .../template-bundle/template-bundle.js | 33 +- public/dx-maps/upg-neighbor/upg-neighbor.js | 69 ++--- .../upg-neighbor/bloom-cockpit/index.html | 2 +- .../upg-neighbor/flower-mesh/index.html | 2 +- .../upg-neighbor/upg-neighbor/index.html | 2 +- .../upg-neighbor/lang-cluster/index.html | 2 +- .../upg-neighbor/send-map/index.html | 2 +- .../upg-neighbor/upg-neighbors/index.html | 2 +- .../wall-of-people-groups.js | 35 +-- .../wall-of-people-groups/index.html | 2 +- 120 files changed, 2034 insertions(+), 954 deletions(-) create mode 100644 plugin-designs/doxa-research-map/scripts/check-language-code-link.mjs create mode 100644 plugin-designs/doxa-research-map/scripts/fixtures/language-codes.json create mode 100644 plugin-designs/research-dashboard/scripts/check-dashboard-filter-a11y.mjs diff --git a/documentation/reference-library-index.md b/documentation/reference-library-index.md index 7e1bba4d..2886464b 100644 --- a/documentation/reference-library-index.md +++ b/documentation/reference-library-index.md @@ -28,7 +28,7 @@ and a change here can break other maps. `import … from '@map/components/charts/BarChart.vue'` - **PinHint** — PinHint.vue — the conversion coach-mark (bottom-center of any map). `import … from '@map/components/hints/PinHint.vue'` -- **LegendDesktop** — Async-import the heavier branches so the boot bundle stays lean. +- **LegendDesktop** — This component's chrome, read out of the catalogue. tStatic and not useI18n: these mount inside `import … from '@map/components/legends/LegendDesktop.vue'` - **LegendMobile** — useShadowStyles( `import … from '@map/components/legends/LegendMobile.vue'` diff --git a/internal/check-composite-embed-knobs.mjs b/internal/check-composite-embed-knobs.mjs index 09d68150..d984edae 100644 --- a/internal/check-composite-embed-knobs.mjs +++ b/internal/check-composite-embed-knobs.mjs @@ -42,7 +42,8 @@ * naming the composite and the knob; both restored, both pass. Removing the zero-request assertion * from the provider case makes it pass on a build that ignores the prop, which is what it is for. * - * Exit: 0 pass or SKIP (no built tree, no browser, no baked token to test with) · 1 fail. + * Exit: 0 pass (or SKIP: no built tree / no browser) · 1 fail · 75 NOT MEASURED (every case skipped, e.g. no + * token: set TEST_MAPBOX_TOKEN). */ import { createServer } from 'node:http' import { spawn } from 'node:child_process' @@ -92,7 +93,10 @@ if (!targets.length) { // The token to hand the partner page is the one the tree already bakes into its own leaves: this // gate must not invent a key, and a token that is not this tree's would 401 and look like our bug. -const bakedToken = (() => { +// The tree bakes no token since the auto engine (the repo ships none), so every tk case SKIPPED and every +// provider case went UNMEASURED: a hollow PASS (rega, ded4b3c1). A seat that has a real public token passes +// it as TEST_MAPBOX_TOKEN (as rega's checks do); otherwise a baked one is still used if a tree has it. +const bakedToken = process.env.TEST_MAPBOX_TOKEN || (() => { for (const b of manifest.bundles || []) { for (const p of b.profiles || []) { if (!p.isMap || !p.iframeUrl) continue @@ -227,4 +231,9 @@ if (fails.length) { console.error(' on a partner page — the case the published embed snippet is written for.') process.exit(1) } +// A run in which no case measured anything is NOT MEASURED (exit 75), never a PASS. +if (!lines.some((l) => /^\s*ok\b/.test(l))) { + console.log(`\nCOMPOSITE-EMBED-KNOBS: NOT MEASURED — every case skipped or went unmeasured${bakedToken ? '' : ' (no token: set TEST_MAPBOX_TOKEN to a public pk. token)'}.`) + process.exit(75) +} console.log(`\nCOMPOSITE-EMBED-KNOBS: PASS — the host's token and provider reach every nested map.`) diff --git a/library/components/ResearchMapFilterPanel.vue b/library/components/ResearchMapFilterPanel.vue index 8dfafb87..93f7554a 100644 --- a/library/components/ResearchMapFilterPanel.vue +++ b/library/components/ResearchMapFilterPanel.vue @@ -141,6 +141,8 @@ useShadowStyles(` .rm-pill { background:rgba(124,140,248,0.12);color:#a8b8ff;padding:2px 8px;border-radius:11px;font-size:11px;font-weight:600; } .rm-link-btn { background:none;border:none;color:#7c8cf8;cursor:pointer;font-size:11px;padding:0; } .rm-link-btn:hover { text-decoration:underline; } + /* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */ + .rm-link-btn{position:relative;}.rm-link-btn::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);} /* WCAG 2.5.8 Target Size (Minimum), AA = 24x24 CSS px. Scoped to (pointer:coarse): 2.5.8 governs touch ergonomics, and these are SHARED components sitting on maps this change does not own -- a finger gets the bigger target, the mouse keeps the density diff --git a/library/components/hints/PinHint.vue b/library/components/hints/PinHint.vue index a28f38a5..fd4e67a5 100644 --- a/library/components/hints/PinHint.vue +++ b/library/components/hints/PinHint.vue @@ -357,6 +357,8 @@ useShadowStyles(` .pin-hint-x { pointer-events: auto; border: none; background: none; color: #aeb7c2; font-size: 16px; line-height: 1; cursor: pointer; padding: 0 0 0 2px; } .pin-hint-x:hover { color: #fff; } + /* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */ + .pin-hint-x{position:relative;}.pin-hint-x::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);} /* WCAG 2.5.8 Target Size (Minimum), AA = 24x24 CSS px. Scoped to (pointer:coarse): 2.5.8 governs touch ergonomics, and these are SHARED components sitting on maps this change does not own -- a finger gets the bigger target, the mouse keeps the density diff --git a/library/components/legends/LegendMobile.vue b/library/components/legends/LegendMobile.vue index 68c976a7..7d8b8ac8 100644 --- a/library/components/legends/LegendMobile.vue +++ b/library/components/legends/LegendMobile.vue @@ -93,6 +93,8 @@ useShadowStyles(` those owners designed. min-height states the 24 rather than deriving it from a font. */ @media (pointer:coarse){.mobile-collapse-caret{width:24px;height:24px;}} .mobile-collapse-caret:hover{color:#3b463d;background:rgba(59,70,61,0.12);border-color:#3b463d;} +/* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */ +.mobile-collapse-caret{position:relative;}.mobile-collapse-caret::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);} .legend-mobile-sheet.sheet-dark .mobile-collapse-caret{background:rgba(110,118,129,0.15);border-color:#30363d;color:#8b949e;box-shadow:none;} .legend-mobile-sheet.sheet-dark .mobile-collapse-caret:hover{color:#c9d1d9;background:rgba(59,70,61,0.18);border-color:#73A17F;} diff --git a/library/components/legends/SemanticTreeLegend.vue b/library/components/legends/SemanticTreeLegend.vue index e5defe6c..14b5fca7 100644 --- a/library/components/legends/SemanticTreeLegend.vue +++ b/library/components/legends/SemanticTreeLegend.vue @@ -757,6 +757,8 @@ useShadowStyles(` display: inline-flex; align-items: center; justify-content: center; gap: 3px; } .stl-hdr-num:hover { color: #c9d1d9; } +/* WCAG 2.5.8 at EVERY pointer, not only coarse: a 24x24 hit area that adds no box (the f29b8151 pattern). */ +.stl-hdr-num{position:relative;}.stl-hdr-num::after{content:'';position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%);} /* WCAG 2.5.8 Target Size (Minimum), AA = 24x24 CSS px. Scoped to (pointer:coarse): 2.5.8 governs touch ergonomics, and these are SHARED components sitting on maps this change does not own -- a finger gets the bigger target, the mouse keeps the density diff --git a/library/components/search/SearchFilterHeader.vue b/library/components/search/SearchFilterHeader.vue index e7d16e88..d231acad 100644 --- a/library/components/search/SearchFilterHeader.vue +++ b/library/components/search/SearchFilterHeader.vue @@ -464,8 +464,30 @@ function onClearAll() { emit('clear-all') } padding: 0 8px; font-size: 0.75rem; line-height: 1; white-space: nowrap; height: var(--dx-sel-row-h, 16px); box-sizing: border-box; } -.sfh__chip-x { background: none; border: none; cursor: pointer; font-size: 1.05em; line-height: 1; color: inherit; padding: 0; display: inline-flex; align-items: center; } +.sfh__chip-x { background: none; border: none; cursor: pointer; font-size: 1.05em; line-height: 1; color: inherit; padding: 0; display: inline-flex; align-items: center; + /* ★ A 24px TARGET THAT COSTS ZERO LAYOUT (WCAG 2.5.8). + MEASURED: the chip's box is pinned to --dx-sel-row-h (16px) and this button carries padding:0, + so the only way to remove a filter was a roughly 13x16px glyph. That is the smallest control in + the product, and it is the ONLY way out of a narrowed board — the one place where a miss costs + the user the whole view. + THE ROW HEIGHT IS NOT NEGOTIABLE and must not be touched here: the three comment blocks above + record a measured layout-shift bug (18px vs a 24.25px chipped row walking the map 180 -> 182.25px) + and the agent's "a lot more subtle" instruction that set 16px. Growing the button would reopen + both. + So the HIT AREA grows and the BOX does not. An absolutely-positioned ::after centred on the + button claims 24x24 of pointer/touch surface while contributing nothing to the flex row's + intrinsic size — the chip stays 16px tall, the strip's fixed-height invariant holds, and + nothing moves by a pixel. position:relative scopes the overlay to this button. + 2.5.8 is a TARGET SIZE criterion, not a touch criterion, so this is unconditional — never + behind @media (pointer: coarse). The overlay is transparent and inert to the eye. */ + position: relative; } +.sfh__chip-x::after { content: ''; position: absolute; left: 50%; top: 50%; + width: 24px; height: 24px; transform: translate(-50%, -50%); } .sfh__chip-x:hover { opacity: 0.7; } +/* The chips sit inside an overflow-x strip, so a focused ✕ must be visibly ringed rather than + merely scrolled into view. :focus-visible, not :focus — a mouse click focuses the button too, and + a ring that outlives every click reads as a state the chip does not have. */ +.sfh__chip-x:focus-visible { outline: 2px solid var(--brand, #1a237e); outline-offset: 1px; border-radius: 2px; } /* ★ THE LAST CHIP'S NEIGHBOUR, NOT A PINNED CONTROL (card BUILD-CLEAR-ALL-SITS-BESIDE-THE-SELECTIONS-NOT-FAR-RIGHT — "right next to the selected stuff", and "fancy Nancy", i.e. it should look like a light touch, not a button). diff --git a/library/i18n/locales/ar/aria.json b/library/i18n/locales/ar/aria.json index fa8c3f1b..739a5f56 100644 --- a/library/i18n/locales/ar/aria.json +++ b/library/i18n/locales/ar/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "تحديد كل الصفوف", "deselectAllRows": "إلغاء تحديد كل الصفوف", "rowDetail": "تفاصيل الصف", - "dismissHint": "إخفاء التلميح" + "dismissHint": "إخفاء التلميح", + "resizeFiltersRail": "تغيير حجم شريط عوامل التصفية", + "resizeFiltersRailHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير حجم شريط عوامل التصفية", + "resizeChartsRail": "تغيير حجم شريط الرسوم البيانية", + "resizeChartsRailHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير حجم شريط الرسوم البيانية", + "resizeMapTableSplit": "تغيير نسبة التقسيم بين الخريطة والجدول", + "resizeMapTableSplitHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير نسبة التقسيم بين الخريطة والجدول", + "resizeTable": "تغيير ارتفاع الجدول", + "resizeTableHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير حجم الجدول", + "resizeDashboardHeight": "تغيير ارتفاع لوحة المعلومات", + "resizeDashboardHeightHint": "اسحب أو استخدم مفاتيح الأسهم لتغيير ارتفاع لوحة المعلومات", + "removeFilter": "إزالة عامل التصفية {name}" } diff --git a/library/i18n/locales/ar/dashboard.json b/library/i18n/locales/ar/dashboard.json index 930c58b1..d6fe26fb 100644 --- a/library/i18n/locales/ar/dashboard.json +++ b/library/i18n/locales/ar/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "توسيع الجدول", "collapse_table": "طيّ الجدول — توسيع الخريطة", "group": "مجموعة", - "deselect_all": "إلغاء تحديد الكل" + "deselect_all": "إلغاء تحديد الكل", + "results_live": "عرض {count} من أصل {total} {unit}", + "filters_live": "عوامل التصفية: {list}", + "search_live": "البحث: {term}" } diff --git a/library/i18n/locales/ar/gospel.json b/library/i18n/locales/ar/gospel.json index 09857227..c98994a9 100644 --- a/library/i18n/locales/ar/gospel.json +++ b/library/i18n/locales/ar/gospel.json @@ -44,7 +44,8 @@ "cvd40": "‪40+‬", "onMap": "شعوب دوكسا على هذه الخريطة", "notPlaced": "ضمن القائمة، بلا موقع بعد", - "outOfScope": "لا توجد شعوب دوكسا — غير ملوَّنة" + "outOfScope": "لا توجد شعوب دوكسا — غير ملوَّنة", + "hnrTip": "مجموعات لديها تسجيلات صوتية أو فيلم يسوع أو فيديو كتابي أو «كلمات الحياة»، لكن لم يُعثر لها على نص مكتوب من الكتاب المقدس في المصادر التي فُحصت. ليس ادعاءً بعدم وجوده." }, "tabs": { "groups": "أكبر الشعوب", diff --git a/library/i18n/locales/de/aria.json b/library/i18n/locales/de/aria.json index cdf3dd52..7ae5cc5f 100644 --- a/library/i18n/locales/de/aria.json +++ b/library/i18n/locales/de/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Alle Zeilen auswählen", "deselectAllRows": "Auswahl aller Zeilen aufheben", "rowDetail": "Zeilendetails", - "dismissHint": "Hinweis schließen" + "dismissHint": "Hinweis schließen", + "resizeFiltersRail": "Filterleiste in der Größe ändern", + "resizeFiltersRailHint": "Ziehen oder Pfeiltasten verwenden, um die Filterleiste in der Größe zu ändern", + "resizeChartsRail": "Diagrammleiste in der Größe ändern", + "resizeChartsRailHint": "Ziehen oder Pfeiltasten verwenden, um die Diagrammleiste in der Größe zu ändern", + "resizeMapTableSplit": "Aufteilung zwischen Karte und Tabelle ändern", + "resizeMapTableSplitHint": "Ziehen oder Pfeiltasten verwenden, um die Aufteilung zwischen Karte und Tabelle zu ändern", + "resizeTable": "Tabellenhöhe ändern", + "resizeTableHint": "Ziehen oder Pfeiltasten verwenden, um die Tabelle in der Größe zu ändern", + "resizeDashboardHeight": "Höhe des Dashboards ändern", + "resizeDashboardHeightHint": "Ziehen oder Pfeiltasten verwenden, um die Höhe des Dashboards zu ändern", + "removeFilter": "Filter {name} entfernen" } diff --git a/library/i18n/locales/de/dashboard.json b/library/i18n/locales/de/dashboard.json index 9439fb30..648c63c0 100644 --- a/library/i18n/locales/de/dashboard.json +++ b/library/i18n/locales/de/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Tabelle ausklappen", "collapse_table": "Tabelle einklappen – Karte vergrößern", "group": "Volksgruppe", - "deselect_all": "Auswahl aufheben" + "deselect_all": "Auswahl aufheben", + "results_live": "{count} von {total} {unit} angezeigt", + "filters_live": "Filter: {list}", + "search_live": "Suche: {term}" } diff --git a/library/i18n/locales/de/gospel.json b/library/i18n/locales/de/gospel.json index 529d334a..9d7c350f 100644 --- a/library/i18n/locales/de/gospel.json +++ b/library/i18n/locales/de/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Doxa-Volksgruppen auf dieser Karte", "notPlaced": "auf der Liste, noch nicht verortet", - "outOfScope": "keine Doxa-Volksgruppen — nicht eingefärbt" + "outOfScope": "keine Doxa-Volksgruppen — nicht eingefärbt", + "hnrTip": "Gruppen mit Tonaufnahmen, dem JESUS-Film, einem Bibelvideo oder Words of Life, aber ohne gefundene Bibeltexte in den geprüften Quellen. Keine Behauptung, dass es keine gibt." }, "tabs": { "groups": "Größte Gruppen", diff --git a/library/i18n/locales/en/aria.json b/library/i18n/locales/en/aria.json index d2f64dbc..9b947c5f 100644 --- a/library/i18n/locales/en/aria.json +++ b/library/i18n/locales/en/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Select all rows", "deselectAllRows": "Deselect all rows", "rowDetail": "Row detail", - "dismissHint": "Dismiss hint" + "dismissHint": "Dismiss hint", + "resizeFiltersRail": "Resize filters rail", + "resizeFiltersRailHint": "Drag or use arrow keys to resize the filters rail", + "resizeChartsRail": "Resize charts rail", + "resizeChartsRailHint": "Drag or use arrow keys to resize the charts rail", + "resizeMapTableSplit": "Resize map/table split", + "resizeMapTableSplitHint": "Drag or use arrow keys to resize the map/table split", + "resizeTable": "Resize table height", + "resizeTableHint": "Drag or use arrow keys to resize the table", + "resizeDashboardHeight": "Resize dashboard height", + "resizeDashboardHeightHint": "Drag or use arrow keys to resize the dashboard's height", + "removeFilter": "Remove filter {name}" } diff --git a/library/i18n/locales/en/dashboard.json b/library/i18n/locales/en/dashboard.json index 6dd95d03..a10dc01f 100644 --- a/library/i18n/locales/en/dashboard.json +++ b/library/i18n/locales/en/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Expand table", "collapse_table": "Collapse table — grow the map", "group": "group", - "deselect_all": "Deselect all" + "deselect_all": "Deselect all", + "results_live": "{count} of {total} {unit} shown", + "filters_live": "Filters: {list}", + "search_live": "Search: {term}" } diff --git a/library/i18n/locales/en/gospel.json b/library/i18n/locales/en/gospel.json index dc67d10d..d5a44473 100644 --- a/library/i18n/locales/en/gospel.json +++ b/library/i18n/locales/en/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Doxa people groups on this map", "notPlaced": "on the roster, not yet placed", - "outOfScope": "no Doxa people groups — not coloured" + "outOfScope": "no Doxa people groups — not coloured", + "hnrTip": "Groups with recorded audio, the JESUS Film, a Bible video or Words of Life, but no text Scripture found in the pools checked. Not a claim that none exists." }, "tabs": { "groups": "Largest groups", diff --git a/library/i18n/locales/es/aria.json b/library/i18n/locales/es/aria.json index e93c059f..b98cb0eb 100644 --- a/library/i18n/locales/es/aria.json +++ b/library/i18n/locales/es/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Seleccionar todas las filas", "deselectAllRows": "Deseleccionar todas las filas", "rowDetail": "Detalle de la fila", - "dismissHint": "Descartar la sugerencia" + "dismissHint": "Descartar la sugerencia", + "resizeFiltersRail": "Cambiar el tamaño del panel de filtros", + "resizeFiltersRailHint": "Arrastra o usa las teclas de flecha para cambiar el tamaño del panel de filtros", + "resizeChartsRail": "Cambiar el tamaño del panel de gráficos", + "resizeChartsRailHint": "Arrastra o usa las teclas de flecha para cambiar el tamaño del panel de gráficos", + "resizeMapTableSplit": "Cambiar la división entre el mapa y la tabla", + "resizeMapTableSplitHint": "Arrastra o usa las teclas de flecha para cambiar la división entre el mapa y la tabla", + "resizeTable": "Cambiar la altura de la tabla", + "resizeTableHint": "Arrastra o usa las teclas de flecha para cambiar el tamaño de la tabla", + "resizeDashboardHeight": "Cambiar la altura del panel", + "resizeDashboardHeightHint": "Arrastra o usa las teclas de flecha para cambiar la altura del panel", + "removeFilter": "Quitar el filtro {name}" } diff --git a/library/i18n/locales/es/dashboard.json b/library/i18n/locales/es/dashboard.json index f43a01c1..7cdda8d8 100644 --- a/library/i18n/locales/es/dashboard.json +++ b/library/i18n/locales/es/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Expandir tabla", "collapse_table": "Contraer tabla — ampliar el mapa", "group": "pueblo", - "deselect_all": "Deseleccionar todo" + "deselect_all": "Deseleccionar todo", + "results_live": "Se muestran {count} de {total} {unit}", + "filters_live": "Filtros: {list}", + "search_live": "Búsqueda: {term}" } diff --git a/library/i18n/locales/es/gospel.json b/library/i18n/locales/es/gospel.json index f14cca14..6740aeb8 100644 --- a/library/i18n/locales/es/gospel.json +++ b/library/i18n/locales/es/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Pueblos de Doxa en este mapa", "notPlaced": "en la lista, aún sin ubicar", - "outOfScope": "sin pueblos de Doxa — sin color" + "outOfScope": "sin pueblos de Doxa — sin color", + "hnrTip": "Grupos con audio grabado, la película JESÚS, un video bíblico o Palabras de Vida, pero sin Escritura en texto encontrada en las fuentes revisadas. No afirma que no exista." }, "tabs": { "groups": "Pueblos más grandes", diff --git a/library/i18n/locales/fr/aria.json b/library/i18n/locales/fr/aria.json index 586a9a63..d25bc874 100644 --- a/library/i18n/locales/fr/aria.json +++ b/library/i18n/locales/fr/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Sélectionner toutes les lignes", "deselectAllRows": "Désélectionner toutes les lignes", "rowDetail": "Détail de la ligne", - "dismissHint": "Masquer l'astuce" + "dismissHint": "Masquer l'astuce", + "resizeFiltersRail": "Redimensionner le volet des filtres", + "resizeFiltersRailHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le volet des filtres", + "resizeChartsRail": "Redimensionner le volet des graphiques", + "resizeChartsRailHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le volet des graphiques", + "resizeMapTableSplit": "Redimensionner le partage carte/tableau", + "resizeMapTableSplitHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le partage carte/tableau", + "resizeTable": "Redimensionner la hauteur du tableau", + "resizeTableHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner le tableau", + "resizeDashboardHeight": "Redimensionner la hauteur du tableau de bord", + "resizeDashboardHeightHint": "Faites glisser ou utilisez les touches fléchées pour redimensionner la hauteur du tableau de bord", + "removeFilter": "Supprimer le filtre {name}" } diff --git a/library/i18n/locales/fr/dashboard.json b/library/i18n/locales/fr/dashboard.json index 001337d7..983b5080 100644 --- a/library/i18n/locales/fr/dashboard.json +++ b/library/i18n/locales/fr/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Développer le tableau", "collapse_table": "Réduire le tableau — agrandir la carte", "group": "peuple", - "deselect_all": "Tout désélectionner" + "deselect_all": "Tout désélectionner", + "results_live": "{count} sur {total} {unit} affichés", + "filters_live": "Filtres : {list}", + "search_live": "Recherche : {term}" } diff --git a/library/i18n/locales/fr/gospel.json b/library/i18n/locales/fr/gospel.json index 06aa3308..c969e27e 100644 --- a/library/i18n/locales/fr/gospel.json +++ b/library/i18n/locales/fr/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Peuples Doxa sur cette carte", "notPlaced": "sur la liste, pas encore localisés", - "outOfScope": "aucun peuple Doxa — non coloré" + "outOfScope": "aucun peuple Doxa — non coloré", + "hnrTip": "Groupes disposant d'enregistrements audio, du film JÉSUS, d'une vidéo biblique ou de Paroles de Vie, mais sans Écriture écrite trouvée dans les sources consultées. Ce n'est pas une affirmation qu'il n'en existe pas." }, "tabs": { "groups": "Peuples les plus nombreux", diff --git a/library/i18n/locales/hi/aria.json b/library/i18n/locales/hi/aria.json index 46a6b0df..042ec209 100644 --- a/library/i18n/locales/hi/aria.json +++ b/library/i18n/locales/hi/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "सभी पंक्तियाँ चुनें", "deselectAllRows": "सभी पंक्तियाँ अचयनित करें", "rowDetail": "पंक्ति विवरण", - "dismissHint": "संकेत हटाएँ" + "dismissHint": "संकेत हटाएँ", + "resizeFiltersRail": "फ़िल्टर पट्टी का आकार बदलें", + "resizeFiltersRailHint": "फ़िल्टर पट्टी का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें", + "resizeChartsRail": "चार्ट पट्टी का आकार बदलें", + "resizeChartsRailHint": "चार्ट पट्टी का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें", + "resizeMapTableSplit": "मानचित्र/तालिका विभाजन का आकार बदलें", + "resizeMapTableSplitHint": "मानचित्र/तालिका विभाजन का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें", + "resizeTable": "तालिका की ऊँचाई बदलें", + "resizeTableHint": "तालिका का आकार बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें", + "resizeDashboardHeight": "डैशबोर्ड की ऊँचाई बदलें", + "resizeDashboardHeightHint": "डैशबोर्ड की ऊँचाई बदलने के लिए खींचें या तीर कुंजियों का उपयोग करें", + "removeFilter": "फ़िल्टर {name} हटाएँ" } diff --git a/library/i18n/locales/hi/dashboard.json b/library/i18n/locales/hi/dashboard.json index be70fe33..fc1d188c 100644 --- a/library/i18n/locales/hi/dashboard.json +++ b/library/i18n/locales/hi/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "तालिका विस्तृत करें", "collapse_table": "तालिका संक्षिप्त करें — मानचित्र बड़ा करें", "group": "जनसमूह", - "deselect_all": "सभी अचयनित करें" + "deselect_all": "सभी अचयनित करें", + "results_live": "{total} में से {count} {unit} दिखाए गए", + "filters_live": "फ़िल्टर: {list}", + "search_live": "खोज: {term}" } diff --git a/library/i18n/locales/hi/gospel.json b/library/i18n/locales/hi/gospel.json index ec0a4074..ae1f2b5e 100644 --- a/library/i18n/locales/hi/gospel.json +++ b/library/i18n/locales/hi/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "इस मानचित्र पर दोक्सा जनसमूह", "notPlaced": "सूची में, अभी स्थान नहीं", - "outOfScope": "कोई दोक्सा जनसमूह नहीं — रंग नहीं" + "outOfScope": "कोई दोक्सा जनसमूह नहीं — रंग नहीं", + "hnrTip": "जिन समूहों के पास रिकॉर्ड किया गया ऑडियो, यीशु फ़िल्म, बाइबल वीडियो या जीवन के वचन हैं, पर जाँचे गए स्रोतों में लिखित धर्मशास्त्र नहीं मिला। यह दावा नहीं कि वह मौजूद नहीं है।" }, "tabs": { "groups": "सबसे बड़े जनसमूह", diff --git a/library/i18n/locales/it/aria.json b/library/i18n/locales/it/aria.json index c57d4fcb..4176a0b5 100644 --- a/library/i18n/locales/it/aria.json +++ b/library/i18n/locales/it/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Seleziona tutte le righe", "deselectAllRows": "Deseleziona tutte le righe", "rowDetail": "Dettaglio riga", - "dismissHint": "Ignora il suggerimento" + "dismissHint": "Ignora il suggerimento", + "resizeFiltersRail": "Ridimensiona la barra dei filtri", + "resizeFiltersRailHint": "Trascina o usa i tasti freccia per ridimensionare la barra dei filtri", + "resizeChartsRail": "Ridimensiona la barra dei grafici", + "resizeChartsRailHint": "Trascina o usa i tasti freccia per ridimensionare la barra dei grafici", + "resizeMapTableSplit": "Ridimensiona la divisione mappa/tabella", + "resizeMapTableSplitHint": "Trascina o usa i tasti freccia per ridimensionare la divisione mappa/tabella", + "resizeTable": "Ridimensiona l'altezza della tabella", + "resizeTableHint": "Trascina o usa i tasti freccia per ridimensionare la tabella", + "resizeDashboardHeight": "Ridimensiona l'altezza della dashboard", + "resizeDashboardHeightHint": "Trascina o usa i tasti freccia per ridimensionare l'altezza della dashboard", + "removeFilter": "Rimuovi il filtro {name}" } diff --git a/library/i18n/locales/it/dashboard.json b/library/i18n/locales/it/dashboard.json index 4719497c..4a3f9d45 100644 --- a/library/i18n/locales/it/dashboard.json +++ b/library/i18n/locales/it/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Espandi tabella", "collapse_table": "Comprimi tabella — ingrandisci la mappa", "group": "popolo", - "deselect_all": "Deseleziona tutto" + "deselect_all": "Deseleziona tutto", + "results_live": "{count} di {total} {unit} mostrati", + "filters_live": "Filtri: {list}", + "search_live": "Ricerca: {term}" } diff --git a/library/i18n/locales/it/gospel.json b/library/i18n/locales/it/gospel.json index 6971dbba..aa953b50 100644 --- a/library/i18n/locales/it/gospel.json +++ b/library/i18n/locales/it/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Popoli Doxa su questa mappa", "notPlaced": "in elenco, non ancora collocati", - "outOfScope": "nessun popolo Doxa — non colorato" + "outOfScope": "nessun popolo Doxa — non colorato", + "hnrTip": "Gruppi con audio registrato, il film JESUS, un video biblico o Parole di Vita, ma senza Scrittura scritta trovata nelle fonti controllate. Non significa che non esista." }, "tabs": { "groups": "Popoli più numerosi", diff --git a/library/i18n/locales/pt/aria.json b/library/i18n/locales/pt/aria.json index 99b11a81..30385d5d 100644 --- a/library/i18n/locales/pt/aria.json +++ b/library/i18n/locales/pt/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Selecionar todas as linhas", "deselectAllRows": "Desmarcar todas as linhas", "rowDetail": "Detalhe da linha", - "dismissHint": "Dispensar a dica" + "dismissHint": "Dispensar a dica", + "resizeFiltersRail": "Redimensionar o painel de filtros", + "resizeFiltersRailHint": "Arraste ou use as teclas de seta para redimensionar o painel de filtros", + "resizeChartsRail": "Redimensionar o painel de gráficos", + "resizeChartsRailHint": "Arraste ou use as teclas de seta para redimensionar o painel de gráficos", + "resizeMapTableSplit": "Redimensionar a divisão entre o mapa e a tabela", + "resizeMapTableSplitHint": "Arraste ou use as teclas de seta para redimensionar a divisão entre o mapa e a tabela", + "resizeTable": "Redimensionar a altura da tabela", + "resizeTableHint": "Arraste ou use as teclas de seta para redimensionar a tabela", + "resizeDashboardHeight": "Redimensionar a altura do painel", + "resizeDashboardHeightHint": "Arraste ou use as teclas de seta para redimensionar a altura do painel", + "removeFilter": "Remover o filtro {name}" } diff --git a/library/i18n/locales/pt/dashboard.json b/library/i18n/locales/pt/dashboard.json index a536bb26..34e46366 100644 --- a/library/i18n/locales/pt/dashboard.json +++ b/library/i18n/locales/pt/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Expandir tabela", "collapse_table": "Recolher tabela — ampliar o mapa", "group": "povo", - "deselect_all": "Desmarcar tudo" + "deselect_all": "Desmarcar tudo", + "results_live": "A mostrar {count} de {total} {unit}", + "filters_live": "Filtros: {list}", + "search_live": "Pesquisa: {term}" } diff --git a/library/i18n/locales/pt/gospel.json b/library/i18n/locales/pt/gospel.json index 9f929223..13e03f78 100644 --- a/library/i18n/locales/pt/gospel.json +++ b/library/i18n/locales/pt/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Povos Doxa neste mapa", "notPlaced": "na lista, ainda sem localização", - "outOfScope": "sem povos Doxa — sem cor" + "outOfScope": "sem povos Doxa — sem cor", + "hnrTip": "Grupos com áudio gravado, o filme JESUS, um vídeo bíblico ou Palavras de Vida, mas sem Escritura em texto encontrada nas fontes verificadas. Não é uma afirmação de que não exista." }, "tabs": { "groups": "Maiores povos", diff --git a/library/i18n/locales/ro/aria.json b/library/i18n/locales/ro/aria.json index 5546fe49..92cdbe22 100644 --- a/library/i18n/locales/ro/aria.json +++ b/library/i18n/locales/ro/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Selectează toate rândurile", "deselectAllRows": "Deselectează toate rândurile", "rowDetail": "Detaliu rând", - "dismissHint": "Închide sugestia" + "dismissHint": "Închide sugestia", + "resizeFiltersRail": "Redimensionează bara de filtre", + "resizeFiltersRailHint": "Trage sau folosește tastele săgeată pentru a redimensiona bara de filtre", + "resizeChartsRail": "Redimensionează bara de grafice", + "resizeChartsRailHint": "Trage sau folosește tastele săgeată pentru a redimensiona bara de grafice", + "resizeMapTableSplit": "Redimensionează împărțirea hartă/tabel", + "resizeMapTableSplitHint": "Trage sau folosește tastele săgeată pentru a redimensiona împărțirea hartă/tabel", + "resizeTable": "Redimensionează înălțimea tabelului", + "resizeTableHint": "Trage sau folosește tastele săgeată pentru a redimensiona tabelul", + "resizeDashboardHeight": "Redimensionează înălțimea tabloului de bord", + "resizeDashboardHeightHint": "Trage sau folosește tastele săgeată pentru a redimensiona înălțimea tabloului de bord", + "removeFilter": "Elimină filtrul {name}" } diff --git a/library/i18n/locales/ro/dashboard.json b/library/i18n/locales/ro/dashboard.json index be6644db..9f25b0d0 100644 --- a/library/i18n/locales/ro/dashboard.json +++ b/library/i18n/locales/ro/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Extinde tabelul", "collapse_table": "Restrânge tabelul — mărește harta", "group": "popor", - "deselect_all": "Deselectează tot" + "deselect_all": "Deselectează tot", + "results_live": "{count} din {total} {unit} afișate", + "filters_live": "Filtre: {list}", + "search_live": "Căutare: {term}" } diff --git a/library/i18n/locales/ro/gospel.json b/library/i18n/locales/ro/gospel.json index 5a8e6ca5..604c35f6 100644 --- a/library/i18n/locales/ro/gospel.json +++ b/library/i18n/locales/ro/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Popoare Doxa pe această hartă", "notPlaced": "pe listă, încă nelocalizate", - "outOfScope": "niciun popor Doxa — necolorat" + "outOfScope": "niciun popor Doxa — necolorat", + "hnrTip": "Grupuri cu înregistrări audio, filmul ISUS, un videoclip biblic sau Cuvinte ale Vieții, dar fără Scriptură scrisă găsită în sursele verificate. Nu înseamnă că nu există." }, "tabs": { "groups": "Cele mai mari popoare", diff --git a/library/i18n/locales/ru/aria.json b/library/i18n/locales/ru/aria.json index 612d43d9..45d23751 100644 --- a/library/i18n/locales/ru/aria.json +++ b/library/i18n/locales/ru/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "Выбрать все строки", "deselectAllRows": "Снять выделение со всех строк", "rowDetail": "Подробности строки", - "dismissHint": "Скрыть подсказку" + "dismissHint": "Скрыть подсказку", + "resizeFiltersRail": "Изменить размер панели фильтров", + "resizeFiltersRailHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить размер панели фильтров", + "resizeChartsRail": "Изменить размер панели диаграмм", + "resizeChartsRailHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить размер панели диаграмм", + "resizeMapTableSplit": "Изменить соотношение карты и таблицы", + "resizeMapTableSplitHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить соотношение карты и таблицы", + "resizeTable": "Изменить высоту таблицы", + "resizeTableHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить размер таблицы", + "resizeDashboardHeight": "Изменить высоту панели", + "resizeDashboardHeightHint": "Перетащите или используйте клавиши со стрелками, чтобы изменить высоту панели", + "removeFilter": "Удалить фильтр {name}" } diff --git a/library/i18n/locales/ru/dashboard.json b/library/i18n/locales/ru/dashboard.json index acace4ab..fda4230e 100644 --- a/library/i18n/locales/ru/dashboard.json +++ b/library/i18n/locales/ru/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "Развернуть таблицу", "collapse_table": "Свернуть таблицу — увеличить карту", "group": "народ", - "deselect_all": "Снять выделение" + "deselect_all": "Снять выделение", + "results_live": "Показано {count} из {total} {unit}", + "filters_live": "Фильтры: {list}", + "search_live": "Поиск: {term}" } diff --git a/library/i18n/locales/ru/gospel.json b/library/i18n/locales/ru/gospel.json index 4d85d017..6ceb1539 100644 --- a/library/i18n/locales/ru/gospel.json +++ b/library/i18n/locales/ru/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "Народы Doxa на этой карте", "notPlaced": "в списке, пока без координат", - "outOfScope": "нет народов Doxa — не окрашено" + "outOfScope": "нет народов Doxa — не окрашено", + "hnrTip": "Группы с аудиозаписями, фильмом «Иисус», библейским видео или «Словами жизни», но без письменного Писания в проверенных источниках. Это не утверждение, что его нет." }, "tabs": { "groups": "Крупнейшие народы", diff --git a/library/i18n/locales/zh/aria.json b/library/i18n/locales/zh/aria.json index f5c307a1..e93560da 100644 --- a/library/i18n/locales/zh/aria.json +++ b/library/i18n/locales/zh/aria.json @@ -9,5 +9,16 @@ "selectAllRows": "选择所有行", "deselectAllRows": "取消选择所有行", "rowDetail": "行详情", - "dismissHint": "关闭提示" + "dismissHint": "关闭提示", + "resizeFiltersRail": "调整筛选器栏大小", + "resizeFiltersRailHint": "拖动或使用方向键调整筛选器栏大小", + "resizeChartsRail": "调整图表栏大小", + "resizeChartsRailHint": "拖动或使用方向键调整图表栏大小", + "resizeMapTableSplit": "调整地图与表格的分隔", + "resizeMapTableSplitHint": "拖动或使用方向键调整地图与表格的分隔", + "resizeTable": "调整表格高度", + "resizeTableHint": "拖动或使用方向键调整表格大小", + "resizeDashboardHeight": "调整仪表板高度", + "resizeDashboardHeightHint": "拖动或使用方向键调整仪表板高度", + "removeFilter": "移除筛选条件 {name}" } diff --git a/library/i18n/locales/zh/dashboard.json b/library/i18n/locales/zh/dashboard.json index 84da5364..3b17e6ae 100644 --- a/library/i18n/locales/zh/dashboard.json +++ b/library/i18n/locales/zh/dashboard.json @@ -60,5 +60,8 @@ "expand_table": "展开表格", "collapse_table": "收起表格 — 放大地图", "group": "个民族", - "deselect_all": "取消全选" + "deselect_all": "取消全选", + "results_live": "已显示 {total} 个{unit}中的 {count} 个", + "filters_live": "筛选条件:{list}", + "search_live": "搜索:{term}" } diff --git a/library/i18n/locales/zh/gospel.json b/library/i18n/locales/zh/gospel.json index b7417928..d296200a 100644 --- a/library/i18n/locales/zh/gospel.json +++ b/library/i18n/locales/zh/gospel.json @@ -44,7 +44,8 @@ "cvd40": "40+", "onMap": "本地图上的 Doxa 族群", "notPlaced": "在名单上,尚未定位", - "outOfScope": "没有 Doxa 族群 — 不着色" + "outOfScope": "没有 Doxa 族群 — 不着色", + "hnrTip": "这些群体有录音、《耶稣传》电影、圣经视频或“生命之道”,但在所查资料中未找到文字经文。这并不表示不存在。" }, "tabs": { "groups": "最大的族群", diff --git a/package.json b/package.json index 72cee099..9b419723 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "check:coverage-consistent:poison": "node internal/check-gospel-coverage-consistent.mjs --poison", "check:csv-shape": "node internal/check-csv-export-shape.mjs", "check:csv-shape:self-test": "node internal/check-csv-export-shape.mjs --self-test", + "check:dashboard-filter-a11y": "node plugin-designs/research-dashboard/scripts/check-dashboard-filter-a11y.mjs", "check:dashboard-geocoder-provider": "node plugin-designs/research-dashboard/scripts/check-dashboard-geocoder-provider.mjs", "check:deck-click": "node internal/check-deck-click.mjs", "check:dep-names": "node internal/check-dependency-names.mjs", @@ -99,6 +100,7 @@ "check:i18n-treeshake": "node internal/check-i18n-treeshake.mjs", "check:kpi-unit": "node internal/check-kpi-unit-once.mjs", "check:label-joins": "node internal/check-label-joins.mjs", + "check:language-code-link": "node plugin-designs/doxa-research-map/scripts/check-language-code-link.mjs", "check:leaf-engine-per-provider": "node internal/check-leaf-engine-per-provider.mjs", "check:leaf-english-leaks": "node internal/check-leaf-english-leaks.mjs", "check:leaf-english-leaks:self-test": "node internal/check-leaf-english-leaks.mjs --self-test", @@ -278,6 +280,7 @@ "check:composites-mount": "every capability-4/5 composite's OWN setup() and mounted hooks run without throwing, in en and ar, headless (no browser): vite loads each composite as its bundle entry defines it (configureApp, and ProfileLoader's provides where the entry mounts ProfileLoader), and @vue/runtime-core mounts it on a no-op renderer. Exists because 08f89f55 shipped two composites calling getRuntimeLocale/detectLocale/RTL_LOCALES with no import: the build was green, setup threw a ReferenceError in every locale, and Big Picture and Simple Research rendered nothing. Proves setup runs; cannot prove the children render.", "check:coverage-consistent": "the gospel-resources surfaces must agree: no resource on an ISO RESERVED code (und/mul/mis/zxx), every resourced code NAMED, table reach recounted off the pins, no invented URL, tiers reconcile. Static, sub-second. Self-test: `bun run check:coverage-consistent:poison`, all 12 clauses (A-L) must fail. Clause L is the one that is not about consistency: it fails when the link-verification record goes stale, because 'link checked' is a claim about the present tense. Written after the same drift defect was found by hand three times.", "check:csv-shape": "the export must OPEN as a table: header on line 0, every row matching. Run the `check:csv-shape:self-test` script for the NEGATIVE test (forces the provenance comment back to line 0 IN MEMORY and requires this gate to REJECT it) — the header used to claim 'NEGATIVE-TESTED' with no way to re-run it.", + "check:dashboard-filter-a11y": "the dashboard's cross-filter is operable and audible: every filter chip is a diff --git a/plugin-designs/research-dashboard/scripts/check-dashboard-filter-a11y.mjs b/plugin-designs/research-dashboard/scripts/check-dashboard-filter-a11y.mjs new file mode 100644 index 00000000..dbcad7b8 --- /dev/null +++ b/plugin-designs/research-dashboard/scripts/check-dashboard-filter-a11y.mjs @@ -0,0 +1,285 @@ +#!/usr/bin/env node +/** + * check-dashboard-filter-a11y.mjs — the dashboard's cross-filter must be OPERABLE and AUDIBLE. + * + * THE TWO DEFECTS THIS EXISTS TO PREVENT (both measured on main, 2026-09-26, both shipped). + * + * 1. A FILTER YOU CAN SET BUT CANNOT CLEAR WITHOUT A MOUSE. The filter chips were + * `` with click delegation on the bar. A span is not focusable, carries no + * role, and the browser fires no click for it on Enter or Space. Every control that SETS a + * filter is keyboard-operable (the tree rail's rows, the dropdowns, the geocoder), so a + * keyboard user could walk into a narrowed board with no way out but reloading the page. + * That asymmetry — reachable in, unreachable out — is the defect, not the missing role. + * + * 2. A CROSS-FILTER THAT ANNOUNCES NOTHING. The whole point of brushing-and-linking is that + * acting on ONE control changes a number somewhere ELSE. The element contained exactly one + * role="status" (the table's selection pill) and ZERO aria-live regions, so a sighted user + * watched 2,107 become 693 across six surfaces while a screen-reader user was told nothing + * at all. The filter worked; the feedback did not exist. + * + * PLUS the localization half of the same class: a `role="separator"` resize handle whose + * aria-label is a RAW ENGLISH LITERAL announces itself in English in all 11 locales. Four of the + * five handles read theirs through T(); the map/table one did not, and it survived review because + * each half looks correct on its own — the ternary is right, the strings are right, and only the + * missing T( is wrong. + * + * ★ WHY THIS IS AN AST WALK AND NOT A GREP. grep cannot tell `:aria-label="T(...)"` (a bound + * expression) from `aria-label="T(...)"` (a literal that happens to contain the characters), cannot + * tell a chip that is a