CervixPositionMarker— standalone React component forbody-vulva-cervix-positionevents. Visualises the SHOW mnemonic (height → glyph y-position, firmness → ring stroke width, openness → ring center hole). Hue interpolates slate (infertile) → teal (fertile) by averaging the three signals. Standalone (not part ofRepresentationSpec/registry) since cervical-position is a 3-D vector, not an option-key pick.
- New optional
description: I18nTextfield onRepresentationSpecfor one-line user-facing prose used in pickers (en + fr). - FEMM, Billings, Creighton, Mira each carry a description tailored to the visual primitive they ship.
- Built-in Mira representation (
dot-circle, 5 options: Dry/Sticky/Creamy/Watery/Raw Egg White). Watery + Raw Egg White flagged as peak candidates.
composeCellInputanddetectFertilityWindownow accept two shapes forevent.content.source.sourceData:- bare scalar (e.g.
"Sticky") — bridge-mira / mira-demo convention. - object
{ mucus: "..." }— bridge-cyclefeminin-net convention.
- bare scalar (e.g.
- New internal helper
readNativeMucuscentralises the source-data shape detection.
- Built-in Creighton Model spec (33 codes auto-generated from
CREIGHTON_OPTIONS). PeakMarkerSpec.letter?: string— peak letter (defaults to'X', Creighton uses'P').StampSquare: when a cell has bothcodeandletter, the letter renders as a small white badge in the top-right corner so the code stays legible.
detectFertilityWindow(events, rep, opts?)— sliding-window peak/fertile detection from mucus option keys (with optionalclosestOptionfor force-conversion).composeCellInputacceptsdayContext: { isPeak?, isFertile? }. Applies the spec'speakMarkerconfig — FEMM gets a dark-navy fill + white center dot; Billings gets the white discharge stamp + 'X' letter overlay (viamappingRules.mucus.peak).PeakMarkerSpec.candidateOptions: string[]— high-fertility option keys for peak/fertile classification.- Brown-dark canonical stream
body-vulva-bleeding-browndarkadded to FEMM/Billings consumes lists alongside the legacybleeding-brown-darkname.
stamp-squareprimitive (rounded squares with light/dark fill awareness).- Built-in Billings (BOM) spec (
billings). composeCellInputaccepts aclosestOptioncallback (force-conversion via host's converter engine).samplePreviewEventscarries 9-d vectors so previews render under any registered representation.
- Numeric bleeding buckets are now single-valued per range — removes ambiguous mapping where a low value used to map to both
spottingandlight.
Initial release.
RepresentationCellReact component (layout-agnostic,dot-circleprimitive).composeCellInput(events, rep)— N→1 reduction from HDS events to a normalized cell input.RepresentationRegistry— bundled-and-extensible registry of representations.- Built-in spec: FEMM (
ts/specs/femm.ts). samplePreviewEvents— shared 7-day synthetic fixture for previews.
Only the dot-circle primitive and the FEMM spec are implemented. Billings + Creighton (stamp-square) and force-conversion via EuclidianDistanceEngine.fromVector are deferred to follow-up sessions.
See _plans/50-custom-mucus-ui-atwork/ in the workspace for design and scope.