doxa-maps/library/components
Doxa Maps c63ecb9cfe LifeCalendar takes fill and highlightRows, so screen and paper can agree
upg100 asked for two parameters on the library chart so the packet's printed
calendar and the on-screen one are the same thing configured differently, rather
than two implementations that drift. Both are opt-in; every default is unchanged,
and the component has no other caller today, so nothing moves.

fill: 'scatter' | 'top'  — WHERE the shaded cells sit.
  The two answer different questions, which is why this is a prop and not a fix.
  'scatter' says "these weeks fall somewhere in a life and we do not know where",
  which is the honest answer for weeks lived. 'top' makes the grid a MAGNITUDE a
  reader can measure against its own frame: 32 cells scattered across 5,200 are
  invisible confetti, while 32 stacked from the corner are an obvious sliver. A
  share page wants 'top'; a life page wants 'scatter'.

highlightRows: Number — rows marked as a band from row 1, for the printed
  calendar's 33-year highlight. ROWS, not cells, because the band is read along
  the year axis and a cell count would drift with the column width. Derived as
  rows x columns and CLAMPED to the grid, so a value larger than the calendar
  marks the whole calendar instead of overflowing into a class nothing renders.
  Verified: 33 x 52 = 1716 cells, 0 -> 0, 999 rows -> 5200 not 51948.

The band is an OUTLINE, not a fill, and that is deliberate: the band and the
shaded cells have to be readable at the same time, and two fills in one 32x32
print cell are indistinguishable. A shaded cell inside the band still reads as
shaded, because --on wins the border.

topCells() is added beside scatterCells in packetCharts, not inside the
component, so the packet's Node renderer and the Vue chart share ONE
implementation — which is the point of the request. It takes the same (total, n)
signature as scatterCells so a caller can swap one for the other without
reshaping anything, is deterministic with no seed (there is nothing to
randomise), and clamps: topCells(10, 99) is 10 cells, not an error.

gates:pre 66/66.
2026-09-29 03:46:11 +00:00
..
charts LifeCalendar takes fill and highlightRows, so screen and paper can agree 2026-09-29 03:46:11 +00:00
dashboards Delete 7 unreachable library components, and gate the thing a census cannot see 2026-09-29 01:38:07 +00:00
hints The map controls and the pin hint printed; the attribution stays 2026-09-28 21:59:29 +00:00
legends A back-to-top beside the view-list circle, and lift the Regions attribution clear of it 2026-09-29 02:35:35 +00:00
map-controls A map's own ? can ask its host for help: HelpButton and useHostedHelp send doxa:help 2026-09-29 02:35:35 +00:00
maps A back-to-top beside the view-list circle, and lift the Regions attribution clear of it 2026-09-29 02:35:35 +00:00
poster Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
qa Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
regions Share the ported _globals.scss rules through one module 2026-09-29 01:38:08 +00:00
search The search header's filter labels follow a mid-session language switch 2026-09-28 13:37:44 +00:00
tables DataTable + StackLayout: physical left/right -> logical, where the rule mirrors 2026-09-28 09:48:45 +00:00
BackToTopButton.vue Shipped comments describe the behaviour instead of quoting a person 2026-09-28 17:40:35 +00:00
PeopleGroupDetail.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
README.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
ResearchMapFilterPanel.vue Four shared controls get a 24x24 target at every pointer, not only on touch (WCAG 2.5.8) 2026-09-26 13:35:57 +00:00
ResearchMapSideMenu.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
SideMenuDrawer.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
ViewSelect.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
WARNING.md 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

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>, calls useShadowStyles(), and reaches stores via inject('mapStore' | 'uiStore' | 'dataStore') — never a direct store import.

Full catalog + conventions: ../../documentation/architecture/components.md · per-file roles: ../../documentation/reference.md.