VisionFunnel, LifeCalendar and ShareCalendar, all props-driven, no hardcoded list, print first: fixed px on the packet's 816x1056 canvas, nothing revealed by hovering, and the packet's own ink rather than a new palette, so a reader cannot tell which page came from the component and which from the renderer. The funnel draws steps as stacked trapezoids and overlays as brackets BESIDE them, never inside. Being inside a step is precisely the claim an overlay cannot make: 362 of DOXA's 2,107 groups are not frontier at all. It asks overlayPlacement whether an overlay is a slice rather than deciding, and prints each overlay's parts as text, because a bracket nobody can hover over explains nothing. Given steps that do not nest, or that mix publishers, it refuses and prints why instead of drawing a plausible picture. It is also not mirrored under RTL, which is worth saying because the obvious reading of "mirror it" is wrong here: the triangle is vertically directional, so a horizontal flip reverses nothing meaningful and inverts any text inside it. What mirrors is the label and bracket side, so those use logical properties. Two decisions now live in prop declarations, and a default is how either dies quietly. ShareCalendar refuses to name its own metric: the shipped figure is the evangelical share while the brief says "% Christian", and one default would reintroduce the confusion this project already retracted a P0 over, with nothing looking wrong. LifeCalendar's anchor defaults to null because the packet prints for a reader we do not know and shading their life is a guess presented as fact. Both are asserted through the SFC and JS parsers rather than a grep, since a regex cannot tokenise JavaScript, and a sibling prop that does carry a default is the negative control proving the arm is not vacuous. Adding default: '% Christian' turns it red, which I checked rather than assumed. |
||
|---|---|---|
| .. | ||
| charts | ||
| dashboards | ||
| hints | ||
| legends | ||
| map-controls | ||
| poster | ||
| qa | ||
| regions | ||
| search | ||
| tables | ||
| PeopleGroupDetail.vue | ||
| README.md | ||
| ResearchMapFilterPanel.vue | ||
| ResearchMapSideMenu.vue | ||
| SideMenuDrawer.vue | ||
| ViewSelect.vue | ||
| WARNING.md | ||
library/components/ — shared Vue components
The map UI, built from parameterized pieces every app-profile reuses. Fix one here and every map benefits — never edit a shared component to customize one map.
library/components/
┌───────────────────────────────────────────┐
│ legends/ map-controls/ poster/ │
│ charts/ tables/ │
│ PeopleGroupDetail.vue SideMenuDrawer.vue │
│ ResearchMapFilterPanel.vue …SideMenu.vue │
└───────────────────────────────────────────┘
reused by every app-profile via @map/components/…
legends/,map-controls/,poster/each have their own README.- Every component uses
<script setup>, callsuseShadowStyles(), and reaches stores viainject('mapStore' | 'uiStore' | 'dataStore')— never a direct store import.
Full catalog + conventions:
../../documentation/architecture/components.md ·
per-file roles: ../../documentation/reference.md.