Update from source 75ab636b9
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions

This commit is contained in:
Doxa Maps 2026-09-28 00:56:28 +00:00
parent d9548e5959
commit 0d4f0bf13e
9 changed files with 59 additions and 45 deletions

File diff suppressed because one or more lines are too long

View file

@ -248,7 +248,7 @@ if (failures.length) {
social_source: social.meta?.source?.name || '', social_accessed: social.meta?.source?.accessed || '',
social_measures: social.meta?.measures || '', social_caveat: social.meta?.critical_caveat || '',
},
never_read: 'engagement, workers, teams, agencies: who works where is not shown (a safety default, pending the agent).',
never_read: 'engagement, workers, teams, agencies: who works where is not shown (a safety default, pending a product decision).',
// Rows omit empty fields ('' / null / false / a zero shares_point) to keep the fetch small for
// partner embeds (2.65 MB -> 1.76 MB); `columns` is the full schema, so an absent key means
// "empty", never "unknown column". A reader fills the default; it never guesses a value.

View file

@ -104,6 +104,7 @@ const uiLocale = computed(() => {
})
const uiDir = computed(() => (uiLocale.value === 'ar' ? 'rtl' : 'ltr'))
const tr = (key, params) => translate(uiLocale.value, key, params)
const moreOpen = ref(false) // the phone "More" menu
// The shared controls (Share, Full screen) label themselves through the vue-i18n instance index.js
// installs, which reads only the PAGE language. Inside the Research Gallery the language arrives in
@ -622,6 +623,8 @@ useShadowStyles(
'.pwp-btn:disabled{opacity:.45;cursor:not-allowed}' +
'.pwp-btn.is-danger{color:#8a3b3b;border-color:#e0c4c4}' +
'.pwp-spacer{flex:1}' +
'.pwp-more-btn{display:none}' +
'.pwp-listops{display:contents}' +
'.pwp-count{font-size:12px;color:#6d766e}' +
'.pwp-status{padding:6px 12px;font-size:12px;color:#6d766e;background:#fff;border-bottom:1px solid #d1d4cd}' +
'.pwp-body{position:relative;flex:1;min-height:0;display:flex}' +
@ -651,6 +654,12 @@ useShadowStyles(
'.pwp-btn{white-space:nowrap;padding:8px 12px}' +
'.pwp-spacer{display:none}' +
'.pwp-draw{order:-2}.pwp-print{order:-1}' +
// One row that FITS (Draw, Print, More, count) instead of a sideways scroll with no cue; the
// three list actions open as their own full-width row under it.
'.pwp-toolbar{flex-wrap:wrap;overflow:visible}' +
'.pwp-more-btn{display:inline-flex}' +
'.pwp-listops{display:none;flex-basis:100%;flex-wrap:wrap;gap:6px}' +
'.pwp-listops.is-open{display:flex}' +
'}'
)
</script>
@ -666,16 +675,21 @@ useShadowStyles(
:disabled="drawPoints.length < 3" @click="onFinishClick">
{{ tr('finish', { n: drawPoints.length }) }}
</button>
<button type="button" class="pwp-btn is-danger" :disabled="selectedCount === 0"
@click="onDeleteSelected" :aria-label="tr('deleteSelectedAria')">
{{ tr('deleteSelected') }}
</button>
<button type="button" class="pwp-btn" :disabled="polygons.length === 0" @click="onSelectAll">
{{ tr('selectAll') }}
</button>
<button type="button" class="pwp-btn" :disabled="selectedCount === 0" @click="onClearSelection">
{{ tr('clearSelection') }}
</button>
<!-- PHONE: these three collapse behind "More" (they ran past x=390 in a sideways row with no
scroll cue, rega ka3). Desktop: the toggle is hidden and they sit inline as before. -->
<button type="button" class="pwp-btn pwp-more-btn" :aria-expanded="moreOpen ? 'true' : 'false'" @click="moreOpen = !moreOpen">⋯ {{ tr('more') }}</button>
<div class="pwp-listops" :class="{ 'is-open': moreOpen }" @click="moreOpen = false">
<button type="button" class="pwp-btn is-danger" :disabled="selectedCount === 0"
@click="onDeleteSelected" :aria-label="tr('deleteSelectedAria')">
{{ tr('deleteSelected') }}
</button>
<button type="button" class="pwp-btn" :disabled="polygons.length === 0" @click="onSelectAll">
{{ tr('selectAll') }}
</button>
<button type="button" class="pwp-btn" :disabled="selectedCount === 0" @click="onClearSelection">
{{ tr('clearSelection') }}
</button>
</div>
<div class="pwp-spacer"></div>
<span class="pwp-count">{{ tr('countSelected', { n: selectedCount, total: polygons.length }) }}</span>
<button type="button" class="pwp-btn is-accent pwp-print" :disabled="selectedCount === 0"

View file

@ -12,7 +12,7 @@ export const STRINGS = {
en: {
draw: 'Draw polygon', drawing: 'Drawing… (click map)', finish: 'Finish polygon ({n} pts)',
deleteSelected: 'Delete selected', deleteSelectedAria: 'Delete selected polygons',
selectAll: 'Select all', clearSelection: 'Clear selection', countSelected: '{n} / {total} selected',
more: 'More', selectAll: 'Select all', clearSelection: 'Clear selection', countSelected: '{n} / {total} selected',
printSelected: 'Print selected', printAria: 'Print selected prayer-walking zones',
emptyList: 'No zones yet — draw a polygon on the map to start a prayer-walking plan.',
delete: 'Delete', deleteAria: 'Delete {title}', zone: 'Zone {n}',
@ -31,7 +31,7 @@ export const STRINGS = {
es: {
draw: 'Dibujar polígono', drawing: 'Dibujando… (haz clic en el mapa)', finish: 'Terminar polígono ({n} puntos)',
deleteSelected: 'Eliminar selección', deleteSelectedAria: 'Eliminar los polígonos seleccionados',
selectAll: 'Seleccionar todo', clearSelection: 'Quitar selección', countSelected: '{n} / {total} seleccionadas',
more: 'Más', selectAll: 'Seleccionar todo', clearSelection: 'Quitar selección', countSelected: '{n} / {total} seleccionadas',
printSelected: 'Imprimir selección', printAria: 'Imprimir las zonas de caminata de oración seleccionadas',
emptyList: 'Aún no hay zonas: dibuja un polígono en el mapa para empezar un plan de caminata de oración.',
delete: 'Eliminar', deleteAria: 'Eliminar {title}', zone: 'Zona {n}',
@ -50,7 +50,7 @@ export const STRINGS = {
fr: {
draw: 'Dessiner un polygone', drawing: 'Dessin en cours… (cliquez sur la carte)', finish: 'Terminer le polygone ({n} points)',
deleteSelected: 'Supprimer la sélection', deleteSelectedAria: 'Supprimer les polygones sélectionnés',
selectAll: 'Tout sélectionner', clearSelection: 'Effacer la sélection', countSelected: '{n} / {total} sélectionnées',
more: 'Plus', selectAll: 'Tout sélectionner', clearSelection: 'Effacer la sélection', countSelected: '{n} / {total} sélectionnées',
printSelected: 'Imprimer la sélection', printAria: 'Imprimer les zones de marche de prière sélectionnées',
emptyList: 'Aucune zone pour l’instant — dessinez un polygone sur la carte pour commencer un plan de marche de prière.',
delete: 'Supprimer', deleteAria: 'Supprimer {title}', zone: 'Zone {n}',
@ -69,7 +69,7 @@ export const STRINGS = {
de: {
draw: 'Polygon zeichnen', drawing: 'Zeichnen… (auf die Karte klicken)', finish: 'Polygon abschließen ({n} Punkte)',
deleteSelected: 'Auswahl löschen', deleteSelectedAria: 'Ausgewählte Polygone löschen',
selectAll: 'Alle auswählen', clearSelection: 'Auswahl aufheben', countSelected: '{n} / {total} ausgewählt',
more: 'Mehr', selectAll: 'Alle auswählen', clearSelection: 'Auswahl aufheben', countSelected: '{n} / {total} ausgewählt',
printSelected: 'Auswahl drucken', printAria: 'Ausgewählte Gebetsspaziergang-Zonen drucken',
emptyList: 'Noch keine Zonen — zeichnen Sie ein Polygon auf der Karte, um einen Gebetsspaziergang zu planen.',
delete: 'Löschen', deleteAria: '{title} löschen', zone: 'Zone {n}',
@ -88,7 +88,7 @@ export const STRINGS = {
pt: {
draw: 'Desenhar polígono', drawing: 'Desenhando… (clique no mapa)', finish: 'Concluir polígono ({n} pontos)',
deleteSelected: 'Excluir seleção', deleteSelectedAria: 'Excluir os polígonos selecionados',
selectAll: 'Selecionar tudo', clearSelection: 'Limpar seleção', countSelected: '{n} / {total} selecionadas',
more: 'Mais', selectAll: 'Selecionar tudo', clearSelection: 'Limpar seleção', countSelected: '{n} / {total} selecionadas',
printSelected: 'Imprimir seleção', printAria: 'Imprimir as zonas de caminhada de oração selecionadas',
emptyList: 'Ainda não há zonas — desenhe um polígono no mapa para começar um plano de caminhada de oração.',
delete: 'Excluir', deleteAria: 'Excluir {title}', zone: 'Zona {n}',
@ -107,7 +107,7 @@ export const STRINGS = {
it: {
draw: 'Disegna poligono', drawing: 'Disegno in corso… (clicca sulla mappa)', finish: 'Completa poligono ({n} punti)',
deleteSelected: 'Elimina selezionati', deleteSelectedAria: 'Elimina i poligoni selezionati',
selectAll: 'Seleziona tutto', clearSelection: 'Deseleziona', countSelected: '{n} / {total} selezionate',
more: 'Altro', selectAll: 'Seleziona tutto', clearSelection: 'Deseleziona', countSelected: '{n} / {total} selezionate',
printSelected: 'Stampa selezionate', printAria: 'Stampa le zone di passeggiata di preghiera selezionate',
emptyList: 'Ancora nessuna zona — disegna un poligono sulla mappa per iniziare un piano di passeggiata di preghiera.',
delete: 'Elimina', deleteAria: 'Elimina {title}', zone: 'Zona {n}',
@ -126,7 +126,7 @@ export const STRINGS = {
ro: {
draw: 'Desenează poligon', drawing: 'Se desenează… (dă clic pe hartă)', finish: 'Finalizează poligonul ({n} puncte)',
deleteSelected: 'Șterge selecția', deleteSelectedAria: 'Șterge poligoanele selectate',
selectAll: 'Selectează tot', clearSelection: 'Anulează selecția', countSelected: '{n} / {total} selectate',
more: 'Mai mult', selectAll: 'Selectează tot', clearSelection: 'Anulează selecția', countSelected: '{n} / {total} selectate',
printSelected: 'Tipărește selecția', printAria: 'Tipărește zonele de plimbare de rugăciune selectate',
emptyList: 'Încă nu există zone — desenează un poligon pe hartă pentru a începe un plan de plimbare de rugăciune.',
delete: 'Șterge', deleteAria: 'Șterge {title}', zone: 'Zona {n}',
@ -145,7 +145,7 @@ export const STRINGS = {
ru: {
draw: 'Нарисовать область', drawing: 'Рисование… (щёлкайте по карте)', finish: 'Завершить область (точек: {n})',
deleteSelected: 'Удалить выбранные', deleteSelectedAria: 'Удалить выбранные области',
selectAll: 'Выбрать все', clearSelection: 'Снять выбор', countSelected: 'Выбрано: {n} из {total}',
more: 'Ещё', selectAll: 'Выбрать все', clearSelection: 'Снять выбор', countSelected: 'Выбрано: {n} из {total}',
printSelected: 'Печать выбранных', printAria: 'Печать выбранных зон молитвенной прогулки',
emptyList: 'Зон пока нет — нарисуйте область на карте, чтобы начать план молитвенной прогулки.',
delete: 'Удалить', deleteAria: 'Удалить: {title}', zone: 'Зона {n}',
@ -164,7 +164,7 @@ export const STRINGS = {
ar: {
draw: 'ارسم مضلّعًا', drawing: 'جارٍ الرسم… (انقر على الخريطة)', finish: 'إنهاء المضلّع ({n} نقاط)',
deleteSelected: 'حذف المحدد', deleteSelectedAria: 'حذف المضلّعات المحددة',
selectAll: 'تحديد الكل', clearSelection: 'إلغاء التحديد', countSelected: '{n} / {total} محدد',
more: 'المزيد', selectAll: 'تحديد الكل', clearSelection: 'إلغاء التحديد', countSelected: '{n} / {total} محدد',
printSelected: 'طباعة المحدد', printAria: 'طباعة مناطق جولات الصلاة المحددة',
emptyList: 'لا توجد مناطق بعد — ارسم مضلّعًا على الخريطة لتبدأ خطة جولة صلاة.',
delete: 'حذف', deleteAria: 'حذف {title}', zone: 'المنطقة {n}',
@ -183,7 +183,7 @@ export const STRINGS = {
hi: {
draw: 'बहुभुज बनाएँ', drawing: 'बनाया जा रहा है… (मानचित्र पर क्लिक करें)', finish: 'बहुभुज पूरा करें ({n} बिंदु)',
deleteSelected: 'चयनित हटाएँ', deleteSelectedAria: 'चयनित बहुभुज हटाएँ',
selectAll: 'सभी चुनें', clearSelection: 'चयन हटाएँ', countSelected: '{n} / {total} चयनित',
more: 'और', selectAll: 'सभी चुनें', clearSelection: 'चयन हटाएँ', countSelected: '{n} / {total} चयनित',
printSelected: 'चयनित प्रिंट करें', printAria: 'चयनित प्रार्थना पदयात्रा क्षेत्र प्रिंट करें',
emptyList: 'अभी कोई क्षेत्र नहीं — प्रार्थना पदयात्रा की योजना शुरू करने के लिए मानचित्र पर बहुभुज बनाएँ।',
delete: 'हटाएँ', deleteAria: '{title} हटाएँ', zone: 'क्षेत्र {n}',
@ -202,7 +202,7 @@ export const STRINGS = {
zh: {
draw: '绘制多边形', drawing: '正在绘制…(点击地图)', finish: '完成多边形({n} 个点)',
deleteSelected: '删除所选', deleteSelectedAria: '删除所选多边形',
selectAll: '全选', clearSelection: '清除选择', countSelected: '已选 {n} / {total}',
more: '更多', selectAll: '全选', clearSelection: '清除选择', countSelected: '已选 {n} / {total}',
printSelected: '打印所选', printAria: '打印所选的祷告行走区域',
emptyList: '还没有区域——在地图上绘制一个多边形,开始制定祷告行走计划。',
delete: '删除', deleteAria: '删除{title}', zone: '区域 {n}',

File diff suppressed because one or more lines are too long

View file

@ -1023,7 +1023,7 @@
"bundle": "prayer-walk-planner",
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"output": "dx-maps/prayer-walk-planner/prayer-walk-planner.js",
"integrity": "sha384-vDE4FMYhrLgkHnj6K2nRGEbLyf8EyuV7OUo+F93bGd00+/F+MRpev49x/iXsllFq",
"integrity": "sha384-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs",
"elements": [
"prayer-walk-planner"
],
@ -1041,7 +1041,7 @@
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"embed": {
"iframe": "<iframe src=\"./prayer-walk-planner/prayer-walk-planner/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-vDE4FMYhrLgkHnj6K2nRGEbLyf8EyuV7OUo+F93bGd00+/F+MRpev49x/iXsllFq\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
}
}
]

View file

@ -1023,7 +1023,7 @@
"bundle": "prayer-walk-planner",
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"output": "dx-maps/prayer-walk-planner/prayer-walk-planner.js",
"integrity": "sha384-vDE4FMYhrLgkHnj6K2nRGEbLyf8EyuV7OUo+F93bGd00+/F+MRpev49x/iXsllFq",
"integrity": "sha384-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs",
"elements": [
"prayer-walk-planner"
],
@ -1041,7 +1041,7 @@
"scriptUrl": "./prayer-walk-planner/prayer-walk-planner.js",
"embed": {
"iframe": "<iframe src=\"./prayer-walk-planner/prayer-walk-planner/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-vDE4FMYhrLgkHnj6K2nRGEbLyf8EyuV7OUo+F93bGd00+/F+MRpev49x/iXsllFq\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./prayer-walk-planner/prayer-walk-planner.js\" integrity=\"sha384-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs\" crossorigin=\"anonymous\"></script>\n<prayer-walk-planner profile-config='{\"profile\":\"prayer-walk-planner\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></prayer-walk-planner>"
}
}
]

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <prayer-walk-planner> custom element. -->
<script src="../prayer-walk-planner.js" integrity="sha384-vDE4FMYhrLgkHnj6K2nRGEbLyf8EyuV7OUo+F93bGd00+/F+MRpev49x/iXsllFq" crossorigin="anonymous"></script>
<script src="../prayer-walk-planner.js" integrity="sha384-UCDvNpaBu3n0rFRVD9qVKT+s+x4unDc+UO8ggE2MqAop2SwrrSD+4KKv+FcM2Nfs" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: