diff --git a/plugin-designs/doxa-simple-map/doxa-simple-map.vue b/plugin-designs/doxa-simple-map/doxa-simple-map.vue index 400fc0977..57867f88d 100644 --- a/plugin-designs/doxa-simple-map/doxa-simple-map.vue +++ b/plugin-designs/doxa-simple-map/doxa-simple-map.vue @@ -180,7 +180,7 @@ useShadowStyles(` /* When the geocoder is disabled (FEATURES.geocoder=false), the legend reflows up to fill the freed top slot — matches the geocoder pill - position (top:10px) instead of clearing it (top:54px). qa: 2026-05-06. */ + position (top:10px) instead of clearing it (top:54px). */ .dsm-root.dsm-no-geocoder .legend-container, .dsm-root.dsm-no-geocoder .legend-container.collapsed { top: 10px !important; } .dsm-root.dsm-no-geocoder .stl-panel { top: 10px !important; } @@ -260,7 +260,7 @@ const isRTL = computed(() => RTL_LOCALES.has(locale.value)) // infoButton — "About this map" help modal trigger // overlapDensity — dim non-matched pins to 0.08 when a legend filter is // active (causes overlap-density bleed that can wash out -// orange pins). OFF here per feedback 2026-04-20. +// orange pins). OFF here. // darkPinBorder — dark stroke on active pins in light mode. Previously // needed to compensate for density bleed; irrelevant // without overlapDensity. @@ -269,14 +269,14 @@ const FEATURES = { infoButton: false, // before enabling: the help modal needs role="dialog" + aria-modal + Escape + focus trap/return (A11Y-AUDIT-PRAYER-PROGRESS-CONNECTIVITY.md) overlapDensity: false, darkPinBorder: false, - // Geocoder search bar feature-flagged OFF on simple-map per user request - // (qa: 2026-05-04 — research-map keeps its geocoder; only the simple-map - // pages on home/pray/adopt should NOT show search). Flip to true to - // restore. Wraps the in the template. + // Geocoder search bar feature-flagged OFF on simple-map: research-map keeps + // its geocoder; only the simple-map pages on home/pray/adopt should NOT show + // search. Flip to true to restore. Wraps the in the + // template. geocoder: false, // Disabled: no thicker stroke / enlarged radius / pulse animation when a // legend row is selected. Matched pins stay at base-layer style; non- - // matched pins dim via 'case' opacity (qa: 2026-05-06 user feedback). + // matched pins dim via 'case' opacity. activeOverlayEmphasis: false, } @@ -344,8 +344,8 @@ const mapId = (injectedInstanceId?.value || injectedInstanceId) || ('doxa-simple // Re-provide mapId so children (LegendComponent, etc.) can inject it for window event scoping provide('mapId', mapId) // Resolves the active tab's strategy → color for a given feature, used by -// useSelectedPin.js so the selection-pin matches the underlying dot color -// (qa: 2026-05-06 user feedback). simple-map tab strategyKeys are 'engagement', +// useSelectedPin.js so the selection-pin matches the underlying dot color. +// simple-map tab strategyKeys are 'engagement', // 'adoption', 'prayer' — mapping to COLOR_MODES below. provide('getActivePinColor', (properties) => { const sk = activeTab.value?.colorStrategy @@ -383,7 +383,7 @@ function _flatItemsToStlNodes(items) { } const legendNodes = computed(() => _flatItemsToStlNodes(flatLegend.items.value)) const legendTitle = computed(() => t('legend.titleBar.legend')) -// Prayer progress bar (header of the prayer legend; 2026-09-16). The payload +// Prayer progress bar (header of the prayer legend). The payload // is null on every non-prayer tab → no bar. Passed as a prop to the desktop STL // below AND provide()d so the MOBILE sheet's embedded // (LegendMobile.vue, untouched) picks it up via inject('legendProgress') — one @@ -511,7 +511,7 @@ const { map, isMapReady, initializeMap, destroy } = useMapInstance({ zoom: 1.8, pitch: profileConfig?.value?.pitch ?? mapDefaults.pitch, bearing: profileConfig?.value?.bearing ?? mapDefaults.bearing, - // Per-map zoom constraints (feedback #1 /pray): each map (simple, prayer) + // Per-map zoom constraints: each map (simple, prayer) // defines its own min/max in profile-config so users don't get lost zooming // too far, and precise locations stay obfuscated. Falls back to mapDefaults. minZoom: profileConfig?.value?.minZoom ?? mapDefaults.minZoom, @@ -663,7 +663,7 @@ const KEYLESS_NIGHT_PAINT = [ { layer: 'boundary_country_z0-4', prop: 'line-color', value: '#c95d74' }, { layer: 'boundary_country_z5-', prop: 'line-color', value: '#c95d74' }, // Crisp and opaque: at 0.75 over fiord's blur the rose read as a faint mauve (#5b4659 against - // the reference #934f66, rega's side-by-side). + // the reference #934f66, measured side by side). { layer: 'boundary_country_z0-4', prop: 'line-opacity', value: 1 }, { layer: 'boundary_country_z5-', prop: 'line-opacity', value: 1 }, { layer: 'boundary_country_z0-4', prop: 'line-blur', value: 0 }, @@ -690,8 +690,8 @@ function paintKeylessNight(m) { // reload → pins/glow never wiped, no flash, instant toggle. watch(() => uiStore.theme, () => mapTheme.applyTheme(map.value)) -// Theme-aware data-pin outline (qa: 2026-05-06 user feedback — Joshua Project -// uses a thin near-black outline that's barely visible; reverse-engineered). +// Theme-aware data-pin outline (Joshua Project uses a thin near-black outline +// that's barely visible; reverse-engineered). // In dark mode the outline goes white so pins stay visible against dark // basemaps. Boot style is light-v11, so the initial circle-stroke-color // in addLanguageFamilyLayer is already 'rgba(0,0,0,0.45)' — this watcher @@ -1323,7 +1323,7 @@ async function onMapReady(normalizedPeopleGroups) { // On a DARK boot the theme-watcher (immediate:false) hasn't run — apply the dark // ring (white colour + THICK width) now, else black pins are left with the light // hairline on the night basemap. _applyPinStroke handles both themes + the prayer - // exception. (coder 2026-06-25 reload fix, extended to ring width.) + // exception, and sets the ring width as well as the colour. _applyPinStroke() // SHELVED: idle preloader caused slow startup — re-enable when pray-tools API is active // and only for groups that have confirmed valid image URLs @@ -1388,8 +1388,8 @@ onMounted(async () => { // ★ A PANE RELEASED WHILE ITS MAP IS STILL STARTING IS A CANCEL, NOT A FAILURE. This map is a heavy // gallery tab: switching away empties its slot. initializeMap then returns SILENTLY (useMapInstance's // liveness checks) and leaves map.value null, which this reported as "Map failed to initialize — - // check token and container": a console ERROR blaming the token for a tab switch (measured - // 2026-09-29, a phone in Arabic, switched away 150 and 500 ms in: 2 runs in 10; 0 when the map was + // check token and container": a console ERROR blaming the token for a tab switch (measured on + // a phone in Arabic, switched away 150 and 500 ms in: 2 runs in 10; 0 when the map was // left to start). Nobody is waiting for this map any more, so return quietly. A mounted pane that // really fails still logs. const released = () => !mapContainer.value || !mapContainer.value.isConnected