P assembly: the last census lines, stated neutrally

The census on the assembled branches still found eleven comments that attributed a choice to a dated
request, quoted it, or spoke in the first person: pplr-data-maps (geocoder, pin card, pin indicator, tree,
families, religion, semantic trees), research-dashboard's ramp note, upg-100-list's funnel note, and two
dated QA tags each in countries-map and research-map. Comments only; behaviour unchanged.
This commit is contained in:
Doxa Maps 2026-10-01 00:57:41 +00:00
parent e7a1c940ef
commit 4de20daed6
11 changed files with 22 additions and 22 deletions

View file

@ -192,7 +192,7 @@ useShadowStyles(`
/* Geocoder column matches the SemanticTreeLegend's .stl-panel — 8px from the START edge (logical, so it
moves right under ar with the legend; a physical left:8px kept it left),
width:380px — so the search bar and the legend stack as one column at
the same x-edge (PPLR alignment, qa: 2026-05-02). */
the same x-edge (PPLR alignment). */
/* Both engines' container class: MapLibre names it .maplibregl-ctrl-top-left, and with only the Mapbox
selector the column got no position or width at all under MapLibre. */
.mapboxgl-ctrl-top-left, .maplibregl-ctrl-top-left { top:12px!important;inset-inline-start:8px!important;width:380px!important;max-width:380px!important;z-index:1200!important; }
@ -548,7 +548,7 @@ const geocoderRef = ref(null)
// 'collapsed' on first visit). Replaces the iter-3 always-collapse-on-
// switch behavior, which the user found jarring — they want returning
// to a tab to restore whatever tier (collapsed / open / fullyOpen) they
// last had it at. qa: 2026-05-02.
// last had it at.
const _tabLegendState = new Map()
watch(() => activeTabId?.value, async (newTabId, oldTabId) => {
if (oldTabId !== undefined && newTabId !== oldTabId) {

View file

@ -227,7 +227,7 @@ useShadowStyles(`
/ --map-font-sm CSS vars are set by applyContainerScale() below. ── */
/* Geocoder column matches the SemanticTreeLegend's .stl-panel — inset-inline-start:8px,
width:380px — so the search bar and the legend stack as one column at
the same x-edge (PPLR alignment, qa: 2026-05-02). */
the same x-edge (PPLR alignment). */
/* The search pill is exactly as wide as the legend below it: both follow --map-legend-width. */
/* ★ LOGICAL, so the search bar and the legend mirror TOGETHER (studio's legend sweep).
This column exists to sit at the same x-edge as SemanticTreeLegend's .stl-panel — that is the
@ -682,7 +682,7 @@ const geocoderRef = ref(null)
// 'collapsed' on first visit). Replaces the iter-3 always-collapse-on-
// switch behavior, which the user found jarring — they want returning
// to a tab to restore whatever tier (collapsed / open / fullyOpen) they
// last had it at. qa: 2026-05-02.
// last had it at.
const _tabLegendState = new Map()
watch(() => activeTabId?.value, async (newTabId, oldTabId) => {
if (oldTabId !== undefined && newTabId !== oldTabId) {

View file

@ -1705,8 +1705,8 @@ async function packetFunnel() {
// allLists(), and summing all 29 gives 2,209 against a total of 2,106, so the deaf lists OVERLAP
// the geographic ones. They are a second, cross-cutting partition, which means "in no list" has no
// single answer until someone says which partition is meant.
// A confident figure I cannot defend is exactly the defect class I have been removing from other
// surfaces all day; this one I put here myself. funnelPage already falls back to the
// A confident figure that cannot be defended is exactly the defect class removed from other
// surfaces; this one was introduced here. funnelPage already falls back to the
// provenance-only footnote when unassigned is absent, so the page simply stops claiming it.
// Carded as a product question: 27 geographic / 29 counting deaf, and whether "Central Asia + Pakistan"
// (55 groups, contiguous, poster-walled as a real region) is a prayer list rather than a residual.

View file

@ -82,7 +82,7 @@ function buildLocalGeocoder() {
if (out.length >= props.localMax) break
}
// Sort priority: BROADER scope first (lower depth = bigger bucket), then
// prefix matches, then population/count desc. Per user 2026-05-02:
// prefix matches, then population/count desc. Found in QA:
// searching "Arabic" was selecting the narrow "Arabic" language node
// (depth 1) instead of the family "Arab (Arabic)" (depth 0) — only some
// Arabic pins showed. Depth-first means picking the top result now
@ -137,7 +137,7 @@ function setup() {
// Wrap entire setup in try/catch — a geocoder failure must NEVER bubble
// out of onMounted, since Vue's "Unhandled error during execution of
// mounted hook" cascades and can prevent sibling components (the map!)
// from mounting. Per user 2026-05-02: map went completely blank when
// from mounting. Without the guard the map went completely blank when
// the geocoder threw on shadow-DOM addTo().
try {
if (isMaplibre) {

View file

@ -34,8 +34,8 @@ const instance = useInstance()
const tr = usePplrT() // not `t`: the names table below is already called t
const pinData = computed(() => props.pin || instance?.pinDetail.value || null)
// All 17 locale names for this PG (n_en, n_hi, n_bn, …). Per user 2026-05-02:
// the popup-style display couldn't show all 17, so we render them as their own
// All 17 locale names for this PG (n_en, n_hi, n_bn, …). The popup-style
// display couldn't show all 17, so they render as their own
// scrollable section in the sidebar with "—" placeholders for missing locales.
// The 17 names no longer ride on every pin (they were two-thirds of the 23 MB points file); they
// load from pg-names.json the first time a card opens, keyed by PG code in LOCALES order.

View file

@ -247,9 +247,9 @@ export function bindFuzzyPinClick(map, layerId, handler, { tolerance = 8 } = {})
/**
* Selected-pin indicator: a Mapbox marker with an SVG pin icon hovering over
* the clicked point. Mirrors the pattern DOXA's research-mfe uses ("the go
* indicator that shows which pin you actually selected" — user feedback
* 2026-05-02). Returns a controller object the profile holds onto.
* the clicked point. Mirrors the pattern DOXA's research-mfe uses (a go
* indicator that shows which pin is actually selected).
* Returns a controller object the profile holds onto.
*
* Usage:
* const indicator = makePinIndicator()

View file

@ -4,7 +4,7 @@ import { usePplrT } from '../composables/usePplrT.js'
/**
* pplr-d3-tree.vue — ROP People-Affinity-Cluster sunburst.
*
* Per user 2026-05-02: capped at depth-2 (Affinity Bloc + Cluster) instead
* Capped at depth-2 (Affinity Bloc + Cluster) instead
* of including the 13k+ People Group leaves at depth 3. SVG sunbursts top
* out around 1k arcs before scroll-zoom gets unresponsive; depth 2 is ~309
* arcs, which keeps wheel-zoom snappy. The PG-level data is still surfaced

View file

@ -81,8 +81,8 @@ const familyColorMap = new Map(FAMILIES.map(f => [f.key, f.color]))
function familyColor(fam) { return familyColorMap.get(fam) || familyColorMap.get('Other') }
// LoadingGlobe stays mounted until pins are added to the map. Flips true after
// setupLayers + family aggregation completes. Per user 2026-05-02: don't drop
// the loader before pins populate.
// setupLayers + family aggregation completes: the loader must not drop
// before pins populate.
const dataReady = ref(false)
function reload() { window.location.reload() }

View file

@ -287,7 +287,7 @@ onMounted(async () => {
pgData.value.features.forEach(f => { const g = f.properties.rg; counts[g] = (counts[g] || 0) + 1 })
religionCounts.value = counts
const dominant = RELIGION_GROUPS.reduce((a, b) => (counts[a.key] || 0) > (counts[b.key] || 0) ? a : b)
// Per user 2026-05-02: drop the "Ready" prefix — it was unclear and chewed up width.
// No "Ready" prefix: it was unclear and chewed up width.
status.value = t('pplr.status.readyReligion', { pins: pgData.value.features.length.toLocaleString(), religion: groupLabel(dominant), count: (counts[dominant.key]||0).toLocaleString() })
// keep the LoadingGlobe up until the pins are actually drawn, not merely added
await whenGeojsonDrawn(map.value)

View file

@ -287,7 +287,7 @@ onBeforeUnmount(() => resizeObs?.disconnect())
</template>
<style scoped>
/* Per user 2026-05-02: all 4 cells must fit in the viewport without scroll.
/* All 4 cells must fit in the viewport without scroll.
.page is now a flex column that fills the profile; .trees-grid takes the
remaining height with two equal rows. Each cell hides overflow so a
text-heavy cell (the discovery "?" cell) cannot make its row taller than
@ -329,7 +329,7 @@ onBeforeUnmount(() => resizeObs?.disconnect())
border-radius: 8px;
padding: 6px 8px;
box-shadow: 0 3px 10px rgba(0,0,0,0.22);
/* Per user 2026-05-02: cells were hiding field columns. Allow per-cell
/* Cells were hiding field columns. Allow per-cell
scrolling instead — full content stays visible inside its tile. */
overflow: auto;
display: flex; flex-direction: column;

View file

@ -473,9 +473,9 @@ function setLiveResize(on) {
// WCAG contrast over the composited Positron ground + Machado CVD matrices).
//
// ── ★ WIDENED 2026-09-23 (card P0, reported) + NAMED RAMP REGISTRY ────────────────────────────
// Reported: the 60-149 red is the same red as the heartbeat zone; the red shades need to be more
// spaced out so it is more easy to tell the distinction — and i need to have grey scale as a
// backdrop from grey to black, just in case i need to swap from red to black scale."
// The 60-149 red was the same red as the heartbeat zone, so the red shades are spaced further
// apart to tell the bands apart, and a grey-to-black scale is registered as a backdrop so the
// ramp can swap from red to black.
//
// ★ THE RAMP WAS ALREADY MATHEMATICALLY EVEN, AND HE WAS STILL RIGHT — that tension is the
// finding, not a contradiction to argue with. Measured in plain sRGB Euclidean distance, the old