Commit graph

178 commits

Author SHA1 Message Date
doxa-maps
89ce341c82 /embed-test embeds every web plugin: production first, then every other; desktop-only plugins skipped by their manifest targets 2026-09-28 06:12:41 +00:00
doxa-maps
50dcf627ad Subdomain: every in-page link to /research or /regions goes to the Research Gallery subdomain 2026-09-28 05:19:12 +00:00
driver
0a0bfdf8b3 Subdomain: the menu's Research item links to the Research Gallery subdomain (from config); Research and Regions pages leave the menu 2026-09-28 05:11:10 +00:00
driver
d5d72e8e76 README: the branch is research-gallery-js 2026-09-28 05:10:26 +00:00
driver
6be3662b8a Every map loads as JavaScript from the maps CDN; public/dx-maps removed; /embed-test embeds every production plugin 2026-09-28 05:06:52 +00:00
doxa-maps
087ae5d8a0 Research page defaults to the maps CDN for the dx-maps tree
NUXT_PUBLIC_DX_MAPS_BASE now defaults to https://maps-dev.nuxtbase.app/cdn/dx-maps (the Plugin Studio
container's /cdn). Set it empty to use this site's own public/dx-maps copy; set it to another tree URL to
use that.
2026-09-28 04:11:13 +00:00
doxa-maps
d4daff02b9 Research page: NUXT_PUBLIC_DX_MAPS_BASE loads the dx-maps tree from a maps CDN
Set, the gallery script and its tree-base come from that URL (e.g. https://maps-dev.nuxtbase.app/cdn/dx-maps).
Unset, the page uses this site's own /dx-maps/ copy exactly as before. Both modes proven on the dev
server: 0 console errors, the gallery tabs draw, and every dx-maps request goes to the chosen host.
2026-09-28 03:58:13 +00:00
doxa-maps
bdf1061a28 Research Gallery from dx-maps main 9ce04ffea, previous Research page kept switched off
public/dx-maps is replaced with the dx-maps build tree from doxa-maps main 9ce04ffea (28 bundles);
the gallery's manifest integrity matches the served doxa-maps-spa.js.

The Research page embeds the whole Research Gallery with the JS embed. Every embed URL is built at
runtime from the origin serving the page (tree-base = window.location.origin + /dx-maps), so the same
build works on a laptop, staging or production.

The previous Research page (the "By Region" link, the single research map and the UUPG list) is NOT
deleted: it is back in the page, switched off by SHOW_LEGACY_RESEARCH = false. The two old scripts
public/js/doxa-simple-map.js and doxa-research-map.js are restored too, unused, so nothing DX-life
relied on is removed.
2026-09-28 01:30:48 +00:00
doxa-maps
a61b1e810a Maps: download their three scripts together, and show a spinner until the map is ready
The home, pray and adopt maps ran Mapbox GL, the geocoder and the map bundle one after
another, so on a cold first visit the slot stayed empty while ~1.8 MB downloaded in series.
Preload hints now fetch all three in parallel (they still run in order), and the slot shows a
quiet spinner (aria-busy) until the map element is defined.
2026-09-26 02:56:34 +00:00
doxa-maps
aeb61e64f7 Serve every map from /dx-maps/
The maps' build tree is now public/dx-maps/ (doxa-maps main 09014f8a), replacing
public/doxa-maps/. The Research gallery, the home, pray and adopt maps, /embed/map/ and
/research/doxa-research-map.html all load from it; the old /js/doxa-simple-map.js and
/js/doxa-research-map.js are removed (no aliases). Mapbox GL moves to v3.24.0, the version
the bundles are built with. With no Mapbox token configured, the home, pray and adopt maps
use the keyless MapLibre engine instead of refusing to start. See DX-MAPS-GALLERY.md.
2026-09-25 21:07:46 +00:00
doxa-maps
3f5cf457b3 Research page: the Research Gallery, served from this site
The Research page now shows the Research Gallery (every research map, dashboard and list)
filling the page below the header, on desktop and phone. It replaces the single research
map, the UUPG list and the By Region link.

public/doxa-maps/ is the doxa-maps build tree (doxa-maps main 196ad168), so this site is
the gallery's CDN. The page loads one script and adds one element. It follows the site
language, and without a Mapbox token it uses the keyless MapLibre engine.
See DX-MAPS-GALLERY.md.
2026-09-25 19:00:41 +00:00
Nath
fc4d6228f8 feat: sync arabic translation 2026-09-25 11:34:14 +01:00
Nath
c65b41633c fix: store button alignment; feat: mobile app to have white bg; fix: order language list 2026-09-25 09:08:06 +01:00
Nath
d58700ddff feat: add mobile app sections to /pray and /research/___ pages 2026-09-24 15:57:00 +01:00
Nath
18e61e92c2 draft of mobile section on pray page 2026-09-24 14:39:46 +01:00
Nath
766ab697c5 fix: remove simple path section 2026-09-24 12:04:34 +01:00
Nath
8e4c9285ab feat: add prayer bundle download to general resources 2026-09-23 14:21:28 +01:00
corsacca
80cbfadb85 replace the CMS definitions page with the terminology page
- serve the per-language terminology editions at /about/definitions
  with the About sidebar; /terms redirects there
- title every edition "Definitions" to match the sidebar label
- drop the self-referencing link to the Definitions page
- add an Arabic edition built from the Arabic glossary
- point the add-language and sync-language skills at the new route
2026-09-23 13:14:08 +01:00
Nath
1128823172 refactor: video languages to single source of truth 2026-09-23 12:08:03 +01:00
Nath
0098a69d7e feat: update contact-us form to use the same format as feedback forms 2026-09-23 11:47:12 +01:00
corsacca
b30f3c39f4 format homepage population figures with locale-native magnitudes
- render billions/millions via Intl compact notation so zh groups on 亿
  and hi on करोड़
- drop the {0} Billion / {0} Million strings from every locale
2026-09-23 09:55:49 +01:00
corsacca
87b835e312 remove the feedback widget
- delete the bundle loader composable and the unused slot component
- strip the site-wide embed from app.vue, leaving the layout shell
- drop the runtime config keys, custom element tag and env entries
- remove the login opt-in and the preconnect to the feedback host
2026-09-22 10:27:08 +01:00
corsacca
0262bb4219 sync all ten site languages with the glossary
- site strings, map widget locales and /terms editions for ar, de, es,
  fr, hi, it, pt, ro, ru and zh
- patch the standalone map bundle in place (it has no build profile) and
  rebuild the two profiled bundles from the updated source locales
- fix defects the sweep surfaced: the ru vision headline read "all
  unmarried people will be married by 2033", ro used popor (nation) as
  the people-group label including the homepage h1, and ar inverted
  "moves from unengaged to engaged"
- correct en.ts, which claimed UUPG and WAGF stay unchanged in every
  edition; es ships GENANC/FMAD, pt PNANE and de UVG/VUVG
- render the filter dropdown's empty-state through i18n, so the
  no_options translation it already computed reaches the component
2026-09-22 09:30:34 +01:00
corsacca
fb51cf738a carry glossary acronyms into translation prompts
- a term with an acronym now yields the acronym as its own pair, so a
  bare UUPG in source text takes this language's acronym instead of
  whatever the model invents
- sync-language says the wording never carries the acronym, and names
  the strings that hold a bare one
2026-09-21 13:32:04 +01:00
corsacca
2149a3874a tighten padding on the desktop language dropdown
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 21:08:22 +01:00
corsacca
516620bfa9 finish ro translation 2026-09-18 20:32:35 +01:00
corsacca
86abef3420 update hi ro and ru translations 2026-09-18 19:59:44 +01:00
corsacca
57f35d12b4 add the Chinese site, terms edition and map locale from the glossary
- 300-key zh/common.json, built on 族群 / 未接触 / 已接触 / 认领 and the
  和合本 (CUNPS) wording for Revelation 5:9 and 7:9
- terms/zh.ts with all 20 entries, recording the alternatives rejected and
  why 接触 was kept where the other five languages chose an active-work word
- map locale: 民族群体 → 族群, 参与 → 接触, 亲缘板块 → 亲缘集团, and the
  legend's missing header.default; bundles rebuilt and the profile-less
  pplr-data-maps literals patched to match
- nativeName 简体中文, from the glossary record
- Romanian back to enabled: false — it was switched on with no locale file,
  and the missing common.json crashed the Nuxt build for every language
2026-09-18 16:16:46 +01:00
corsacca
aa2f7dee92 add the Italian site, terms edition and map locale from the glossary
- i18n/locales/it/common.json at key parity with English
- app/utils/terms/it.ts, the same 20 entries in the en.ts order, citing
  the Nuova Riveduta 2006 wherever the choice is Scripture-driven
- map legend and search follow the glossary; both bundles rebuilt and the
  Italian block of the build-less pplr-data-maps.iife.js patched in place
2026-09-18 15:53:02 +01:00
corsacca
55b21dcd80 Enable all languages 2026-09-18 15:50:26 +01:00
corsacca
ce33af390f render CMS navigation in the requested locale
- translate the German step-card titles, nav home link and signup heading
- build the sidebar tree and category cards from the requested locale
  instead of the body's resolved one, so a category landing with no
  translated page of its own no longer drops the whole menu to English
2026-09-18 14:31:45 +01:00
corsacca
9d05a039f8 remove the one-shot WordPress migration scripts
The importer and menu-order sync wrote pages.parent_slug, dropped in
migration 010; the scraper fed the importer and read the site being
replaced; po-to-json rebuilt the locale JSON from the WP theme's .po
files, which the glossary now owns. Content lives in the database and
is edited through the doxa-cms MCP server.
2026-09-18 10:09:38 +01:00
corsacca
a994baec4f read the glossary from pray.doxa.life instead of a vendored file
config/glossaries.ts was generated from the retired translation repo's DeepL
TSVs, so it had no source left and only the German, Spanish and Portuguese
rows had been hand-patched. Both it and its build script are gone.

- fetch GET /api/glossary/{lang} at runtime, cached ten minutes, serving the
  last good answer when the request fails and an empty one when it never
  succeeded. A reviewer's correction now reaches auto-translate without a
  deploy here
- carry the glossary's notes as well as its terms: register, acronym policy
  and number format, placed after the term list so a rule about inflection
  governs the pairs above it
- glossary_used on the MCP translate tool now means the locale's terminology
  was available, and reads false for a language whose glossary has not been
  started
- add /add-language and /sync-language skills for the site strings, the map
  widget locales and bundles, the /terms edition, and the CMS pages
2026-09-18 10:06:13 +01:00
corsacca
10f63df2eb align the Portuguese site with the reviewed glossary
- site locale: glossary terms plus the DeepL defects the reviewer never saw
- map legend locales and the three bundles: Não engajado/Engajado, Grupo étnico, PNANEs
- MT glossary pt rows regenerated; Portuguese /terms edition added
2026-09-17 15:38:35 +01:00
corsacca
743714b21a align the Spanish site with the reviewed glossary
- glossary terms only, on top of the human-reviewed Spanish: unengaged is
  "no comprometido", UUPG "GENANC", under-engaged "poco comprometido",
  frontier "grupo fronterizo", cross-cultural workers "obreros
  transculturales", gospel access "acceso al evangelio", champion "defensor"
- fix DeepL leftovers the reviewer never saw: "personas solteras" for
  unengaged, "Reza por ellos", "Alianza Global para los No Comprometidos",
  "DOXA Vida", "Aprobado" for adopted, "iglesia de acogida", "Si"
- add the Spanish /terms edition and register it
- update the Spanish map legend and rebuild the two active bundles; the
  legacy research bundle has no build profile, so its literals are patched
- regenerate the Spanish rows of the machine-translation glossary
2026-09-17 13:50:21 +01:00
corsacca
0418c1e8b7 fix the French name of the WAGF: Fraternité, not Association
- the /terms French edition now lists "Fraternité Mondiale des Assemblées
  de Dieu (WAGF)" and demotes "Association mondiale…" to a rejected
  alternative, with the rationale that "fraternité" renders "fellowship"
- same row in the French machine-translation glossary so auto-translated
  content uses the right name; the source TSV in the translation repo
  still needs the matching edit before the glossary is next regenerated
- the three live French CMS pages that name the WAGF (about, statement of
  faith, vision) were corrected through the CMS and are not in git
2026-09-17 13:06:45 +01:00
corsacca
873c0c9cea fix lint style errors in the language config 2026-09-17 12:20:33 +01:00
corsacca
5651aac6fd show German in the public language switcher 2026-09-17 12:19:42 +01:00
corsacca
ab1244a230 align the German site with the reviewed glossary
- glossary terms only, on top of the human-reviewed German: unengaged is
  "unberührt", UUPG "völlig unerreichte Volksgruppe (VUVG)", under-engaged
  "am wenigsten erreicht", engagement "missionarische Arbeit vor Ort",
  intercessors "Fürbitter/innen", people group "Volksgruppe" everywhere
- fix leftovers that were never translation choices: "Über Zúme", "DOXA
  Leben", "unverheiratet" for unengaged, "Gebetsberichterstattung"
- add the German /terms edition and replace the retired 24-hour prayer
  coverage entry with daily prayer in the English and French editions
- update the German map legend and rebuild the two active bundles; the
  legacy research bundle has no build profile, so its literals are patched
- regenerate the German rows of the machine-translation glossary
2026-09-17 12:16:25 +01:00
corsacca
2994ccd541 Remove people group location field references 2026-09-17 09:32:33 +01:00
corsacca
ca2addcfac
add embeddable map page for iframes (#24)
- serves at /embed/map with tab, lang, map and utm_source query params
- fetches the mapbox token at load and points the bundle at the prayer api
- strips the bundle's source tag from prayer links and applies utm_source
2026-09-15 15:28:54 +01:00
corsacca
cea9583792 guard people group cards against missing region, rop1 and country fields 2026-09-15 14:57:16 +01:00
corsacca
4dfee08d13 replace mailgun with sendgrid for transactional email
- send through the sendgrid v3 json api via direct fetch with a
  manually cleared abort timeout; mailhog stays for development
- drop nodemailer-mailgun-transport and its types
- swap MAILGUN_* runtime config and env example for SENDGRID_API_KEY
  and optional SENDGRID_HOST
2026-09-15 11:16:44 +01:00
corsacca
f9d53d5524 refresh homepage statistics on the client 2026-09-14 12:17:12 +01:00
corsacca
93128d4eff add submit updates button to people group profile 2026-09-08 12:24:32 +01:00
corsacca
b94df99297 restore source edge whitespace on translated fragments
Formatting splits a sentence across text nodes mid-phrase, and no model
reliably reproduces a fragment's leading or trailing whitespace — a dropped
edge space glues two words together once the fragments are concatenated
back into the document. The source fragment now decides the edges.
2026-09-07 16:56:39 +01:00
corsacca
7dfad0ee07 replace deepl with llm translation via openrouter
- translateText/translateTexts call OpenRouter chat-completions; glossary
  terms are prompt-injected from config/glossaries.ts, generated from the
  translation repo's TSVs by scripts/build-glossaries.ts
- model resolution: per-language override in config/languages.ts →
  translation.model site setting (new admin field) → TRANSLATION_MODEL env
  → anthropic/claude-opus-5, at low reasoning effort
- blank fragments are held back from the model, which drops them and breaks
  the one-translation-per-fragment count the caller maps results back on
- OpenRouter failures map to a typed error with a human-readable message;
  an unrecoverable one (no credits, bad key, rejected model) stops the run
  instead of repeating the same call for every remaining locale
- machine translations record source 'auto-translate'; 'deepl' stays
  readable for snapshots written before the switch
2026-09-07 16:30:48 +01:00
corsacca
050708084b switch feedback destination 2026-09-07 13:25:04 +01:00
corsacca
bbddd6c2d2 add dashboard links to region cards and move regions after resources
- end each region card with a "See <region> dashboard" link, translated
  in all eight locales
- stack the people-group and country count on its own line under the
  region title in the card header
- move the Regions entry in the hamburger menu to after Resources
2026-09-07 12:11:08 +01:00
corsacca
eae6143be1
Replace country pages with region dashboards (#23)
* replace country pages with region dashboards

- move /countries to /regions, with 301 redirects from the old URLs in
  every locale
- add a region dashboard: a map of the region's countries with pins
  coloured by prayer coverage, headline figures, and prayer, adoption and
  engagement progress against the DOXA goals, plus a per-country table
- roll up progress stats per country and region in the shared summary
  and serve them from /api/regions
- frame region maps with antimeridian-aware bounds
- add Regions to the hamburger menu and translate the new strings in all
  eight locales

* put each region on the regions index in a card with a header band

The region name links to its dashboard with the site's chevron icon, and
the people-group and country counts sit centred beside it on a brand-green
header; the country list is the padded white card body.
2026-09-07 11:49:24 +01:00