doxa-maps/library/composables
Doxa Maps 4a99453cda The packet's list becomes the profile TABLE: picture, description, three boxes
Brief A1 item 1. The 2x10 card grid becomes 20 full-width rows, each one
picture | generated localized description | three prayer checkboxes.

PER_PAGE stays 20, so this changes the layout SHAPE and not the
pagination -- which is what lets check-packet-render's dropped-groups
assertion keep passing unrelaxed. That assertion refuses a +/-1 tolerance
because slack is exactly where a lost list page hides, so a rewrite
needing it loosened would be the wrong rewrite.

The description column is ~1036px. An entire card in the old grid was
683px, so the sentence alone is 50% wider than a whole card was; that is
the point, since a generated sentence needs width a name and two metadata
lines did not.

The geometry closes with ZERO SLACK -- 20 rows plus 19 gutters fill the
sheet to exactly the bottom margin. That is the finding, not the
reassurance: a description wrapping to a third line overflows by ~16px.
Hence FIT BEFORE CLAMP: step 17 -> 15 -> 14px, and truncate at a WHOLE
WORD only as a last resort, because a mid-word cut reads as a rendering
fault rather than an editorial one -- especially inside a people-group's
name, where a reader cannot tell it from a misspelling.

Deterministic by character count, never a DOM measure, because this module
runs under Node for the offline generator as well as in the browser. The
0.52em advance is deliberately wider than Georgia's true ~0.50 so a locale
wider than English is absorbed by the estimate rather than by an overflow.
Measured against the real catalogue, every shipped locale fits at full
size -- German is longest at 178 chars against a 234 budget -- so the
ladder is insurance, not routine.

describeGroup is INJECTED, not imported: its country resolver reaches a
Vite-only alias and imports JSON without an attribute, which would make
every `node internal/check-*.mjs` unrunnable. usePosterPrints composes it
on the browser path and tolerates its absence, so a packet that cannot
resolve a describer still prints, degrading to the metadata line.

check-profile-table.mjs was mutation-tested, and two of my own assertions
were dead. "The rows close on the bottom margin" is a TAUTOLOGY -- the row
height is derived by dividing the page by PER_PAGE, so it holds for any
row count; a 21-row mutant sailed through it. It is replaced by the real
constraint, that a row stays tall enough for its content (fires at 24
rows). And the word-aware check fed 'word word word', where a mid-word cut
is indistinguishable from a clean one; with distinct words it now names the
broken token.
2026-09-28 16:49:01 +00:00
..
legends The packet's generated description, and the language name it prints was index-ordered 2026-09-28 13:56:06 +00:00
poster engineFor(map): build markers, popups and poster maps with the map's OWN engine 2026-09-25 18:38:17 +00:00
.gitkeep doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
host-token-url.js A composite embedded bare dropped tokenUrl, and passed because a ProfileLoader sat above it 2026-09-28 15:52:47 +00:00
printInPlace.js Export poster opens the print dialog on the poster, and downloads nothing 2026-09-28 02:01:46 +00:00
retryableAsyncComponent.js A lazy view that fails to load says so and offers Retry; map controls carry data-control 2026-09-28 11:42:54 +00:00
useAvatarGenerator.js Keep the prayer yellow to the prayer palette; other palettes keep their orange 2026-09-16 21:21:07 -05:00
useCardSurface.js The prayer-progress cards become shared components too 2026-09-27 04:14:31 +00:00
useCountryOutline.js The interactive maps fetch the web-sized boundaries 2026-09-27 03:25:59 +00:00
useCsvExport.js A CSV export honours the typed search, so the file matches the table on screen 2026-09-27 19:01:10 +00:00
useDashboardData.js Kit 4d-2: useDashboardData moves to the library 2026-09-27 06:04:09 +00:00
useDashboardLayout.js RTL drag: the direction probe reads the handle, and two handle margins become logical 2026-09-27 06:42:54 +00:00
useDashboardSearch.js Kit landing 4a: the shared search, because the facet rail cannot move yet 2026-09-27 02:17:35 +00:00
useDocumentFont.js Vendor Oswald, because Bebas Neue cannot render Russian at all 2026-09-24 21:05:12 +00:00
useEdgeScrollAffordance.js doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
useFacetAggregation.js Kit 4c-1: the counting half, and the bucket that said "Other" in every locale 2026-09-27 04:14:13 +00:00
useGeocoderSearch.js 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 2026-09-19 17:24:30 +00:00
useHostTokenUrl.js A composite embedded bare dropped tokenUrl, and passed because a ProfileLoader sat above it 2026-09-28 15:52:47 +00:00
useMapAttribution.js The map credit names the basemap that was actually drawn: OpenFreeMap / OpenMapTiles under MapLibre 2026-09-26 08:51:38 +00:00
useMapClustering.js useMapClustering: no console.log in shipped bundles 2026-09-28 02:01:47 +00:00
useMapData.js The prayer map's legends see the pins it draws 2026-09-27 02:17:35 +00:00
useMapEvents.js Map popups show data as text: a people-group name or country field can no longer run script 2026-09-26 05:50:24 +00:00
useMapFly.js useMapFly's zoomToLegendRow comment names readSourceFeatures, not the engine-private _data 2026-09-28 10:13:29 +00:00
useMapInstance.js Maps start their engine download at setup, and the dashboard's country boundaries download beside the basemap 2026-09-28 02:38:49 +00:00
useMapLayers.js The interactive maps fetch the web-sized boundaries 2026-09-27 03:25:59 +00:00
useMapProvider.js Three maps asked the window which engine drew them; now they ask the map 2026-09-26 17:28:46 +00:00
useMapSelection.js doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
useMapTheme.js Research map: religion joins prayer, adoption and engagement on the night look; only people, regions and languages are monochrome day 2026-09-16 21:01:37 -05:00
useOptionalT.js gospel takes the locale-honouring fallback, and it is their call that made it 2026-09-26 22:06:59 +00:00
usePosterPrints.js The packet's list becomes the profile TABLE: picture, description, three boxes 2026-09-28 16:49:01 +00:00
usePplrInstance.js legend: open on the UPG-100 list, which is what the Driver asked for first 2026-09-24 17:59:57 +00:00
usePrayedLocally.js Public builds carry zero platform surface + copy-embed on staging 2026-09-16 05:13:44 +00:00
usePrayerStatistics.js doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
useSearch.js Religion families follow the reader; the value they filter on does not 2026-09-27 01:57:23 +00:00
useSelectedPin.js engineFor(map): build markers, popups and poster maps with the map's OWN engine 2026-09-25 18:38:17 +00:00
useSelectionBus.js D3: the bus can point at a record without choosing it 2026-09-27 02:17:35 +00:00
useSelectionCamera.js Dashboard kit, landing 3: the camera and the CSV exporter 2026-09-27 01:16:52 +00:00
useShadowStyles.js Every shadow root honours prefers-reduced-motion 2026-09-27 05:05:04 +00:00
useShareableView.js A shared link reads a list separated by , or |, so partner links already published keep working 2026-09-27 19:10:08 +00:00
useSharedMapToken.js Engine and token props: a token-service URL is honoured, Clear clears, and a pending token is awaited 2026-09-26 03:34:15 +00:00
useTextHighlight.js Two plugins built the same search highlighter; now there is one 2026-09-27 01:16:50 +00:00