cities-internet, key-cities: neutral source comments

Rewrite code comments to drop quoted directives, person-tied dates,
internal process and role names, and QA run references, keeping each
technical fact intact. Comments only; behaviour unchanged.
This commit is contained in:
Doxa Maps 2026-10-01 00:08:29 +00:00
parent 3f7d489409
commit 35c68048e8
4 changed files with 25 additions and 27 deletions

View file

@ -13,7 +13,7 @@ function setGlobal(name, value) {
* social platform on tap — the connectivity view of where DX people groups can be reached online.
*
* Every country shaded by measured internet penetration, with its NAMED carriers
* and dominant social platform on tap. Brief: "all these are missing maps."
* and dominant social platform on tap. One of the data maps this project adds.
*
* CLONE of gospel-resources/resources-map.vue with the data and bands swapped —
* profiles duplicate, the pattern does not get re-derived. Same mobile-first
@ -131,8 +131,8 @@ const rows = ref([])
const selected = ref(null)
const aiNoticeOpen = ref(true) // dismissible AI-research disclaimer in the detail sheet
const err = ref(null)
// Starts TRUE: the notice must be on screen for the first frame, not switched on after a tick. rega
// measured 7-30s to the first data paint, and for that whole window the map was an empty basemap with
// Starts TRUE: the notice must be on screen for the first frame, not switched on after a tick.
// Measurement showed 7-30s to the first data paint, and for that whole window the map was an empty basemap with
// nothing to say it was still working — indistinguishable from a broken embed.
const loading = ref(true)
@ -181,7 +181,7 @@ const selectedAdm1 = ref(null)
// The DOXA list from pray-tools, the same list Prayer Progress draws. It carries the slug the
// detail panel fetches by. The shared pin table (tables/people-group-pins.json) has no slug,
// so its dots could not open that panel.
// Dark slate with a white ring (2026-09-28: the red dots looked wrong on the mostly green
// Dark slate with a white ring (red dots looked wrong on the mostly green
// map). A neutral dark reads on every fill here, the green/amber/red/grey bands AND India's pale-to-deep
// blues, and it carries no "good/bad" meaning the way red does on a map whose red means under 25%.
// The white ring keeps it apart from the deepest blue and from the dark basemap.
@ -190,7 +190,7 @@ const uiStore = inject('uiStore', null)
const _lang = (() => { const v = inject('lang', null)?.value; return (v && v !== 'en') ? v : null })()
// The reader's language for the ENGINE'S OWN labels (the canvas's "Map" name, "Zoom in", attribution…).
// This map is built raw, not through useMapInstance, so it must hand the engine that locale itself;
// without it they stayed English under ar on both engines (rega, row 34). Same ladder as
// without it they stayed English under ar on both engines (measured). Same ladder as
// useMapInstance's readerLang: ProfileLoader's lang, then profile-config, then ?lang=, then <html lang>.
const readerLang = () => {
if (_lang) return _lang
@ -302,8 +302,8 @@ function paintGroups(map) {
// installed it, so English from the shipped catalog is the fallback, never a blank or a key.
// Carrier and platform names are data and are not translated.
// C4 wave 3b: the guard is library/composables/useOptionalT.js now, and the fallback resolves through
// tStatic — the RUNTIME LOCALE first, English as the last resort. exp-shepherd's call as this
// plugin's owner (2026-09-26), on the same reasoning gospel-plugin gave: the bundle already carries
// tStatic — the RUNTIME LOCALE first, English as the last resort. This plugin owns that
// choice, on the same reasoning the other map plugins use: the bundle already carries
// all 11 catalogues, so a partner embedding without vue-i18n being served English is a bug, not a
// decision. The old enLookup was English-only, which is exactly what that served.
// The local fill() is gone with the guard: fillParams applies the same interpolation, except it leaves
@ -565,7 +565,7 @@ onMounted(async () => {
paintGroups(map)
const geo = await adm1Loaded
if (geo && !unmounted) paintAdm1(map, geo)
// ★ CLEARED HERE, NOT ON 'load'. rega measured 7-30s from mount to the first data paint under
// ★ CLEARED HERE, NOT ON 'load'. Measurement showed 7-30s from mount to the first data paint under
// SwiftShader: the style fires 'load' early, while the shaded countries, the adm1 provinces and
// the 2,105 dots all arrive later. Clearing on 'load' would retire the notice during exactly the
// wait it exists to explain, leaving the reader with an empty basemap and no reason for it.
@ -603,7 +603,7 @@ const groupOpen = computed(() => !!uiStore?.selectedPeopleGroup)
useShadowStyles(
// ⚠ THE MAP MUST FILL ITS HOST, NOT THE VIEWPORT. This element had NO :host rule at all, so a
// custom element defaults to display:inline with no height of its own, and .gm's absolute inset:0
// resolved against whatever ancestor happened to be positioned. rega measured the result in the
// resolved against whatever ancestor happened to be positioned. The result was measured in the
// /embed-test re-shoot at 1440: a 1198x900 canvas inside a 1198x560 embed card — ~340px, the
// attribution among it, drawn below the card and clipped. Same class as the board's, and the same
// fix it already carries: height:100% so a height-bounded slot decides, min-height as a floor so an
@ -612,7 +612,7 @@ useShadowStyles(
// .gm below is position:absolute;inset:0, and absolute positioning resolves against the nearest
// POSITIONED ancestor — which :host was not. So on a partner page .gm resolved against whatever the
// PARTNER happened to have positioned, and the map sized itself to that rather than to this element.
// rega measured it in the hostbox run on ca07fc3c8: the element was CORRECT at 420px in a 420px box,
// It was measured in a host-box run: the element was CORRECT at 420px in a 420px box,
// while the canvas inside it stayed 900px and painted the pill and the attribution 478px below the
// box (538px in a 360px box), over the partner's own text. Giving the host a HEIGHT without making it
// a CONTAINING BLOCK fixes the box and not what is drawn inside it.
@ -635,7 +635,7 @@ useShadowStyles(
// control rail by construction: MapToolbar is inset-inline-end:3px with 32px
// buttons, so ANY box reaching right:8px intersects it at every viewport. The
// rail's z-index:10 beats this z-index:4, so the buttons stayed clickable and
// the defect read as "the legend underlaps the controls" — reported 3x.
// the defect read as "the legend underlaps the controls".
// The fix imitates the shared SemanticTreeLegend, which has always done it
// correctly: `left:8px; width:var(--map-legend-width,380px)`. Bounded and
// left-anchored cannot reach the right rail, so the two can never overlap

View file

@ -5,15 +5,14 @@
* @description Four validated research tables, one tab each, with sortable and filterable columns, CSV and JSON
* export, and each table's caveats rendered in the UI rather than hidden in a footnote.
*
* Four validated Tabulator tables from the flight's research corpora, each with
* Four validated Tabulator tables from the research corpora, each with
* sortable/filterable columns, CSV+JSON export, and its caveats rendered IN the UI.
*
* > design note 2026-08-01: "all the tabulator data and trees for all the multiple
* > various tabulator tables for all this data all organized in list format with
* > full granularity."
* Design intent: present all the tabulator data and trees for the various tables
* in list format, at full granularity.
*
* The tables are produced by library/scripts/research/build-tabulator-tables.mjs
* (the M+V of IEMV) — flat scalar rows, one row per fact, validated before write.
* — flat scalar rows, one row per fact, validated before write.
*
* WHY THE CAVEATS RENDER: a list view strips context. Someone reading
* "Internet 12.6%" needs to know it is a NATIONAL figure, and someone reading a
@ -37,14 +36,14 @@ const assetsBase = computed(() => resolveAssetsBase(profileConfig.value))
// i18n is OPTIONAL: useI18n() throws on a host that never installed it, so English from the
// shipped catalog is the fallback, never a blank or a key. Region and country names are data.
// C4 wave 3b: the guard is library/composables/useOptionalT.js now, and the fallback resolves through
// tStatic — the RUNTIME LOCALE first, English as the last resort. exp-shepherd's call as this
// plugin's owner (2026-09-26), on the same reasoning gospel-plugin gave: the bundle already carries
// tStatic — the RUNTIME LOCALE first, English as the last resort. This plugin owns that
// choice, on the same reasoning the other map plugins use: the bundle already carries
// all 11 catalogues, so a partner embedding without vue-i18n being served English is a bug, not a
// decision. The old enLookup was English-only, which is exactly what that served.
// The local fill() is gone with the guard: fillParams applies the same interpolation, except it leaves
// a placeholder for a NULL value where this fill() rendered the string "null".
const t = useOptionalT('connectivity')
// NUMERALS ARE HELD fleet-wide (2026-09-26): a locale-following format would switch
// NUMERALS ARE HELD by design: a locale-following format would switch
// 'ar' to Arabic-Indic digits. Until that is decided, numbers keep the browser-default format they
// had before this pass; only the TEXT is translated.
const num = (n) => (Number(n) || 0).toLocaleString()
@ -90,7 +89,7 @@ const table = computed(() => cache.value[current.value?.file] || null)
useShadowStyles(
// ★ THE TABLE MUST STAY INSIDE ITS HOST BOX — the same defect and the same fix as connectivity-list.
// With no :host rule the element is inline with no height, and .ct (position:absolute;inset:0)
// resolved against the partner page's positioned ancestor instead of this element. rega measured
// resolved against the partner page's positioned ancestor instead of this element. Measurement showed
// content painting to y=1,698, which is 1,254px BELOW a 420px host box.
// .ct already has overflow-y:auto, so containing it is enough to make the table scroll in the box.
':host{display:block;position:relative;width:100%;height:100%;min-height:320px}' +

View file

@ -3,7 +3,7 @@
* cities-map.vue — THE KEY CITIES GLOBAL MAP.
*
* Every located population centre as a POINT, sized by how many people groups it
* holds. Brief: "all these are missing maps."
* holds. One of the data maps this project adds.
*
* POINTS, NOT COUNTRY SHADING — this is the one dataset with real coordinates
* (1,646 clusters, 277 of them gazetteer-named), so shading a country would throw
@ -86,7 +86,7 @@ async function load() {
const res = await fetch(`${assetsBase.value}/tables/key-cities.json`)
if (!res.ok) throw new Error(`key-cities table not found (${res.status})`)
rows.value = (await res.json()).rows || []
// CITY-STAR LAYER (Brief: "better city display"). Fetched SEPARATELY — never a
// CITY-STAR LAYER (a richer city display). Fetched SEPARATELY — never a
// static import, which would inline the table into the IIFE bundle (that trap
// once took two bundles to 2.0/2.9MB). Failure here must NOT break the base map,
// so it is caught: the city layer is an ENHANCEMENT, not a dependency.

View file

@ -2,15 +2,14 @@
/**
* data-tables.vue — the CITIES DATA list view: every research table, one tab each.
*
* Four validated Tabulator tables from the flight's research corpora, each with
* Four validated Tabulator tables from the research corpora, each with
* sortable/filterable columns, CSV+JSON export, and its caveats rendered IN the UI.
*
* > design note 2026-08-01: "all the tabulator data and trees for all the multiple
* > various tabulator tables for all this data all organized in list format with
* > full granularity."
* Design intent: present all the tabulator data and trees for the various tables
* in list format, at full granularity.
*
* The tables are produced by library/scripts/research/build-tabulator-tables.mjs
* (the M+V of IEMV) — flat scalar rows, one row per fact, validated before write.
* — flat scalar rows, one row per fact, validated before write.
*
* WHY THE CAVEATS RENDER: a list view strips context. Someone reading
* "Internet 12.6%" needs to know it is a NATIONAL figure, and someone reading a