Commit graph

60 commits

Author SHA1 Message Date
doxa-maps-88655c70
9e3443333f track html comments so prose backticks stop desyncing the scanner 2026-09-21 06:19:37 +00:00
doxa-maps-88655c70
41d089de10 add a composite-freshness gate for stale nested children 2026-09-21 06:06:29 +00:00
doxa-maps-88655c70
5f0c30b880 catch the extensionless token file by name and by content 2026-09-20 09:57:22 +00:00
doxa-maps-88655c70
bbe8cde47a write the extensionless token path the client actually requests; ignore it too 2026-09-20 09:55:39 +00:00
doxa-maps-88655c70
ab04635e58 add a VCS-independent witness for the read-only DX-life clone 2026-09-20 09:45:25 +00:00
doxa-maps-88655c70
ce870b6923 emit assetsBase and the API-base global into the direct-JS embed snippet 2026-09-20 09:32:37 +00:00
doxa-maps-88655c70
38fd121c70 release the dark load backdrop when a leaf's element mounts 2026-09-20 09:16:46 +00:00
doxa-maps-88655c70
4970059e55 add a label-join gate: fail on any new equality predicate comparing two independently-derived values 2026-09-20 09:05:18 +00:00
doxa-maps-88655c70
0645b78b09 validate @element is a bare tag; warn when an inferred tier contradicts a bundle's complexity 2026-09-20 08:08:01 +00:00
doxa-maps-88655c70
97085f05cd reconcile the 5-caps representatives against the manifest; cap-1 was sampling a cap-2 bundle 2026-09-20 07:46:29 +00:00
doxa-maps-88655c70
a456a0fcd2 warn when the settled tree has outgrown its floors instead of quietly passing 2026-09-20 07:39:47 +00:00
doxa-maps-88655c70
9ca67e1c35 derive the check:drop coverage floor from the manifest instead of hardcoding it 2026-09-20 07:22:07 +00:00
doxa-maps-88655c70
bb5fd9aed4 fix big-picture @element to a bare tag and stop embed-smoke reporting every error as a mount timeout 2026-09-20 07:07:48 +00:00
doxa-maps-88655c70
727e3ee8ad assert scan coverage in check:drop — an empty tree passed with a confident PASS line 2026-09-20 06:48:48 +00:00
doxa-maps-88655c70
924deaeede re-shoot all 12 readme images with real WebGL; fix three defects in the shooter
- add SwiftShader launch args (maps previously shot with no GL context)
- point cap5 and deploy2 at the doxa-maps-spa element, not the gallery page
- serve the deploy1 iframe host page from memory (it never existed; the shot was a 404)
- add a readiness guard before every screenshot plus a non-zero exit on failure
- per-shot minElements and iframe frame-counting for the two legitimate outliers
2026-09-20 06:45:21 +00:00
doxa-maps-88655c70
e4442efd09 document the leaf-deletion blind spot in check:sri and point to the settled-tree leaf-count signal 2026-09-20 06:24:43 +00:00
doxa-maps-88655c70
edb935f46a Settled-tree gate: assert leaf-page count, which per-bundle builds silently delete 2026-09-20 06:05:52 +00:00
doxa-maps-88655c70
85014aad11 Session work: strobe fix, grid layout, stacked tree legend, selection camera, chip bounding, asset inheritance, gates 2026-09-20 04:49:25 +00:00
doxa-maps-88655c70
79d46126de Add 5-capability verification gate: proves every capability level mounts, renders and is error-free 2026-09-20 04:44:07 +00:00
doxa-maps-88655c70
e4be3ee4ee Template-literal guard: print coverage count so scope drift is visible before it breaks a build 2026-09-20 04:34:21 +00:00
doxa-maps-88655c70
e2fae02e46 Template-literal guard: recurse plugin-designs so nested shadow-CSS components are covered 2026-09-20 04:33:46 +00:00
doxa-maps-88655c70
8ed3bbfcbc Map-paint gate: walk nested shadow roots so composites are verified, not false-failed 2026-09-20 03:59:56 +00:00
doxa-maps-88655c70
4c27190641 Add SRI-consistency and settled-tree gates; wire SRI check into the build chain 2026-09-20 03:23:40 +00:00
doxa-maps-88655c70
318147ea52 Add map-paint verification gate; fix template-literal guard false positive on JSDoc; wire guard first in build chain 2026-09-20 02:49:21 +00:00
doxa-maps-88655c70
ea0c47b277 Brand-neutral shared VerticalTabsLayout with lazy nested-element hosting; fix cap-5 prayer tab leaf path; neutralize library identifiers; add Forgejo CI build-gate workflow
Some checks failed
build-gate / build (push) Has been cancelled
2026-09-19 17:24:30 +00:00
84fe1da1ab Bake profile type into manifest; plugin-studio cap-5 element; UPG-100 print+dots 2026-09-19 06:56:27 +00:00
doxa-maps-88655c70
2d64e21fbf Complete app-profiles->plugin-designs sweep across comments/docs; build green; layouts kept at root (load-bearing) 2026-09-17 18:18:19 +00:00
doxa-maps-88655c70
1a3925c6a6 Rename app-profiles -> plugin-designs; build green under new naming (load-bearing paths updated, guards pass) 2026-09-17 18:18:18 +00:00
swift-river542
676d44e7b8 Maps gallery works without a trailing slash; rounded corners reach the map canvas 2026-09-17 01:04:37 -05:00
swift-river542
63067ff7e6 Phones: the attribution watermark sits above the collapsed legend strip; an opened sheet covers it 2026-09-16 22:01:42 -05:00
swift-river542
39b5863236 Phones: one attribution watermark bottom-right; corner controls stay at the map bottom under the open sheet 2026-09-16 21:53:27 -05:00
swift-river542
b7d91e9aca Public data ships without working notes; unused data files stay out of the drop-in
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- data/ tables and the people-groups file: meta blocks reduced to provenance (source, url,
  downloaded, rows, grain, attribution); the link-verification table keeps only state and detail
  per link; generators write the same shape
- dropin.exclude in the build config: people_groups.csv, open-doors.json, platform-reachability.json
  and tables/index.json are not shipped (nothing loads them); sync-dropin honours it
- public-hygiene --strict flags note-style meta keys in shipped data
- Rebuilt bundles and gallery
2026-09-16 20:16:08 -05:00
swift-river542
9cefd6faa4 Plugin gallery: one generator for the dev server and the build
- internal/playground → internal/plugin-gallery; playground-smoke → plugin-gallery-smoke;
  generate-spa → generate-gallery (scripts: gallery, smoke:gallery; smoke:playground stays as alias)
- generate-gallery exports renderGallery(model, { mode }) — the dev plugin serves the same page
  at / from the discovered registry (dev mode imports the dev entries, ladder popovers on);
  the build writes public/index.html from the manifest (byte-identical to before)
- Docs and probes use the gallery vocabulary
2026-09-16 20:04:18 -05:00
swift-river542
60ad81bf5f Drop-in destination declared once in the build config (dropin.dest); sync-dropin and deploy:dev read it, DOXA_DROPIN_DEST overrides
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-16 19:20:23 -05:00
swift-river542
3baa0afaf8 Website drop-in destination is public/embed/doxa-maps-build
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-16 18:42:15 -05:00
swift-river542
12d1fee133 Public build folder is three entries: index.html, assets/, doxa-maps/
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- index.html is generated by internal/generate-spa.mjs from doxa-maps/manifest.json: one
  self-contained page that lists every bundle, profile and instance, mounts the chosen one,
  and offers Open page / Copy embed; build ends with `bun run spa` (the material shell is no
  longer installed; nav.js, icons.js, languages.js, pane-wrapper/, external/ and _headers
  leave public/)
- The website drop-in follows the same contract: dropin.include in the build config,
  sync-dropin --from-config --prune, public-hygiene --strict fails on any other root entry
- Production bundles no longer carry CSS comments: a build-only Vite plugin strips them from
  every shadow-style block (about 140 per map bundle, 5% smaller); remaining comments reworded
- Share pages and the pin renderer drop their note-style comments
2026-09-16 18:23:14 -05:00
swift-river542
7f6c2286f9 Legend table columns no longer overlap: numeric columns scale with the type
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- SemanticTreeLegend: the UUPGs/Population columns were a fixed 44px, sized for the old
  9px header / 10.5px numbers; at the desktop scale "POPULATION" collided with "UUPGs"
  and "139.0M" spilled into the neighbouring column. Base column is now 60px, desktop
  76px (header 10px, numbers 13.5px, no wrapping)
- The panel follows --map-legend-width like the detail card and the geocoder pill; the
  research map's wide-host legend is 400px so "Full Prayer Coverage" stays on one line
- New probe: `bun run probe:legend-columns` measures cell boxes vs real text extents and
  fails on any spill or overlap (desktop and phone sheet)
2026-09-16 17:34:21 -05:00
swift-river542
271ba0849c Mobile legend sheet: drags follow the finger, every state is reachable, and the Mapbox attribution lifts above the sheet
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- No height transition while dragging; the resize grab zone is the top 44px (and, in detail
  mode, the content when it is scrolled to the top); one geometry source for the JS clamp and
  the CSS max-height; release snaps with hysteresis (open ↔ fullyOpen ↔ collapsed)
- The sheet publishes its height as --legend-sheet-h on the element host; the Mapbox/MapLibre
  bottom controls translate up by it, so the logo and attribution stay visible in every state
- New gate: internal/mobile-sheet-probe.mjs (Firefox, touch) taps a pin, drags the detail
  sheet up/down and checks heights, states and control overlaps
2026-09-16 16:26:10 -05:00
swift-river542
2e8b5f5932 Basemap never flashes light: the night preset travels in the Map constructor and is re-pinned after every style change
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- useMapTheme: basemapConfig() is the single source of truth; bootConfig() hands Mapbox the
  Standard-style config at construction so the very first frame is already night; keepPinned
  re-asserts on style.load and styledata, writing only on drift; MapLibre maps are skipped
- useMapInstance passes that config to new Map() and stores the map in a shallowRef so
  Mapbox internals never run through Vue's reactive proxy
- Simple map's loading cover is dark like the research map's — the last light frame at boot
- New gate: internal/theme-flash-probe.mjs samples canvas luminance through boot, legend rows
  and tabs and fails on any light frame (21 phases, 0 flashes)
2026-09-16 15:08:30 -05:00
swift-river542
7997f3b092 Maps stop running Mapbox's render loop through Vue's reactive proxy; prayer glow throttled
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- The Mapbox Map instance is unwrapped (markRaw) at the profile boundary and the layers
  composable works on the raw map, so Mapbox internals no longer pay Vue's get/set traps on
  every frame; the geocoder control instance is a shallowRef for the same reason
- Prayer glow rings animate at 12 steps/s with paint transitions disabled, constants moved to
  addLayer, and the loop pauses while the map is off-screen — the map can idle again
- New gate: internal/long-frames-probe.mjs measures long animation frames, blocking time and
  DevTools rAF violations per phase (boot / idle / interaction); idle violations on the prayer
  and research maps dropped from ~100 to the no-animation baseline
2026-09-16 14:11:55 -05:00
swift-river542
0f9027f592 Public hygiene: sync:dropin excludes staging pages by default; check:public-hygiene gate scans a drop-in for leaks, secrets, source maps, docs and preview surfaces
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-16 13:04:36 -05:00
swift-river542
7b36255dc2 sync:dropin never mirrors documentation into a served folder; protects nothing by default
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
2026-09-16 12:43:56 -05:00
swift-river542
a876e5e97b Host-agnostic share links, token-endpoint chain, dev playground as reusable modules, share/asset gates, validated profile-type vocabulary
- ShareButton resolves its link from where the bundle is hosted (profile-config.shareUrl ->
  embedBaseUrl -> window.MAP_EMBED_BASE_URL -> the bundle's own script URL); profiles pass
  tree-relative embed pages, so links work in the playground, on doxa.life and on any CDN
- Generated leaf pages try token endpoints in order (override -> configured absolute URL ->
  same-origin) and only then offer the paste-once box; build config points at the canonical
  https://doxa.life/api/maps/token
- Dev playground extracted from vite.config.js into internal/playground/{discover,render,dev-plugin}.mjs;
  serves /assets/* like the built site so data-driven maps initialise; passes assetsBase +
  shareUrl to every element; header ladder with a Start-here primer and the five kinds of
  mounting files (single-element, preset-element, multi-view-element, composite-element, app-shell)
- New gates: smoke:playground (every element boots, with status text + data diagnostics),
  smoke:share (Share URL resolves and reopens the same map), sync:dropin (mirror public/ into a
  host checkout, never credentials), deploy:dev (build + sync)
- MapToolbar + ShareButton on every map profile; UPG-100 composite (map + prayer lists) on the
  pane layout; shared --map-radius token consumed by the legend components
- docs/reference.md: profile types table, profile-config assetsBase/shareUrl/embedBaseUrl, gates
2026-09-16 12:10:38 -05:00
doxa-maps
9c521f11d5 Public builds carry zero platform surface + copy-embed on staging
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- Compile-time gate __DOXA_QA__ (default off): the QA corner and every string
  it carries are dead-code-eliminated from public bundles; platform builds
  opt in with DOXA_QA=1. Shell QA becomes ?qa=1 opt-in. Audit: zero platform
  strings across all bundles + shell.
- One Mapbox wordmark per page (first live map claims it; released on destroy).
- Coach-mark points at the need: 'Tap a red dot — someone still needs prayer.'
- Pray-click glow: locally-prayed groups render as Has Prayer for that visitor
  (localStorage, 7-day TTL) — lasting glow comes from the real signup via the API.
- Staging forge gains 'copy embed': snippet built at click time from
  location.href, so it carries the FULL URL of whatever host serves the tree.
2026-09-16 05:13:44 +00:00
doxa-maps
e1d9393227 Every generated embed snippet teaches traffic attribution
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
The one bundler script that generates all the map pages now stamps
?utm_source=YOUR_SOURCE on every copy-paste iframe snippet (profiles AND
instances) and utmSource:"YOUR_SOURCE" in every script snippet — the same
placeholder pattern as YOUR_MAPBOX_TOKEN. A partner replaces it once and every
people-group click-through from their embed attributes to them.
2026-09-16 04:24:32 +00:00
doxa-maps
2f458033b6 MapLibre pages: token-free embeds, no Mapbox peer, no token gate
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
A profile/instance whose config says provider:'maplibre' now generates a page
that loads the MapLibre peer (jsdelivr, same versions as useMapInstance) and
mounts IMMEDIATELY — the token ladder is skipped entirely. Mapbox pages are
unchanged. demo-map (the example vibe coders copy) is now provider-aware via
resolveMapProvider, and ships a 'maplibre' instance as the living token-free
demo. embed-smoke covers instance pages; verified 2/2 with live canvases —
including the maplibre one with NO token anywhere.
2026-09-16 02:53:38 +00:00
doxa-maps
e800f10681 Frame-policy as a real artifact + docs discoverability
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
- The build now emits public/_headers implementing the embeddability split
  (direct-embed pages framable anywhere; staging preview-only) — Netlify/CF
  Pages consume it automatically; serving/traefik-embed-headers.yaml is the
  proxy-side reference. The contract is auditable in-repo, not just documented.
- README: docs table gains how-to, layouts/README (the SPA machinery), and
  docs/architecture; Quickstart gains bun run serve + bun run phone.
2026-09-16 02:37:19 +00:00
doxa-maps
680a714bdc embed-smoke: prove every map embeds (17/17 pages mount cleanly)
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
New permanent harness (bun run smoke:embeds): loads every profile page from the
partner-facing manifest headless (SwiftShader software WebGL — no GPU needed),
asserts the custom element defines + populates its shadow DOM, no ProfileLoader
error card, and a WebGL canvas on map profiles. First full run: 17/17 pass —
8 map profiles paint a canvas, 9 DOM profiles (lists/tables/charts/walls)
populate. Exit 1 on any failure, so CI can gate on it.
2026-09-16 02:25:33 +00:00
doxa-maps
5ef3c01c8d Data out of public/ (phase 2): posters + tables live in data/
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
posters/ (42M webp set the poster walls fetch) and tables/ (the merged served
table set — its index.json is the merge; per-profile data/tables remain the
build-time sources) now live in data/ with build copy-steps. Byte parity
verified; served paths unchanged. public/ is now FULLY regenerable — every
source-of-truth folder has a home outside the web-root.
2026-09-16 01:37:52 +00:00
doxa-maps
eca13ac2ff Data out of public/: sources live in data/, the web-root is generated
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
public/ was confusing because three source-of-truth folders lived ONLY inside it.
They now live in data/ (people-groups, vendor, external-bundles) and the build
copies them into the served tree (same pattern as boundaries), so served paths
are unchanged and public/ is fully regenerable. data/README.md states the law.
2026-09-16 01:24:41 +00:00