Water log mobile field experience (PIN → Headgates → Log → Success):
* Brand rename: "Tuxedo Ditch Co." → "Tuxedo Corn" everywhere it
was a stale reference (page metadata + admin Today tab caption).
Constants already say Tuxedo Corn; this just aligns the stragglers.
* Tab bar (Headgates | Time): pill pair → real UISegmentedControl.
MiniSegmented lives next to TabBar in MobileWaterApp.tsx and uses
the same ResizeObserver-measure + spring-timing pattern as the
existing SegmentedControl — feels like one widget at two sizes
(this one at 32pt, the unit selector at 44pt).
* Liquid-glass chrome (recipe applied 5×, mirrored on the bottom
submit bar): linear-gradient background + blur(24px) +
saturate(180%) + inset top highlight + inset bottom hairline.
TabBar, HeadgateList top nav, LogForm top nav, LogForm sticky
submit bar, FieldPinScreen + SuccessScreen brand strips.
* ThresholdMeter (new component, mobile/ThresholdMeter.tsx): the
screen's signature. A live "blip" indicator under the 44pt
measurement input that ties the form to its real domain (a
worker reading a real gauge) instead of being a decorative
gauge trophy. Track + optional colored zones (red·green·red)
+ thumb that slides on Apple's spring curve + color-coded
zone label. Mirrors Apple's Volume Limit / Screen Time sliders.
* i18n: 9 new zone labels per language (zoneBelowNormal,
zoneAboveAlert, zoneInRange, zoneBelowAlert, zoneAboveMin,
zoneReading, zoneTypeToLog, meterNormalRange + ES twins).
Legacy normalRange/alertAbove/alertBelow signatures widened
to accept pre-formatted strings so integer units render clean.
* Updated water-log-i18n unit test for the wider signatures.
All 27 tests pass; tsc + eslint clean.
- Session-expired bounce-to-PIN branch now matches the actual strings
returned by requireFieldSession (was 'Session expired or invalid'
which never matched). Added 'Session not found' and 'User is inactive'
to the intercept list. The user-visible 'Your session expired. Please
sign in again.' string is now in the dictionary (en + es).
- LangProvider moved up to WaterFieldClient. The orchestrator (which
was sitting OUTSIDE the provider in b29caa0) now calls useLang()
directly, so the loadHeadgates fallback error string is always
rendered in the user's chosen language — even if they toggled
after signing in.
- getClientLangSnapshot now memoizes the cookie value (React 19
enforces getSnapshot purity stricter than 18).
- LanguageToggle switched from aria-pressed (toggle pattern) to
role="radiogroup" + role="radio" + aria-checked (mutually-exclusive
selector pattern). Per-button aria-labels dropped — the visible
EN/ES text is read by SR as the radio name. Group label switched
to t.common.a11yLanguage for Spanish parity.
- Notes textarea now has aria-label={t.log.notes} (was unlabeled —
SR would announce 'Edit text' with no context).
- 1 new test: lock in that wl_lang=<script>...</script> falls through
to the navigator (injection guard on the cookie regex).
Refs /tmp/refactor-water-log.md (review followups to Commit B)
- 'holes' / 'hoyos' added to MOBILE_UNITS alongside CFS/GPM/gal/ac-in/ac-ft
with integer-only validation: submit button greys out and the keyboard
raises the numeric keypad (no decimal) when the unit is selected.
- Language toggle in the headgate list header (next to logout) flips
every screen between English and Spanish. Choice is persisted to the
existing 'wl_lang' cookie for 1y, so the user's last selection
sticks across logout/relogin.
- i18n strings lifted into shared src/lib/water-log/i18n.ts (single
source of truth, en/es parity enforced by tests). All mobile screens
(Pin, HeadgateList, LogForm, Success) plus the loadHeadgates error
in the orchestrator consume the dictionary. Brand strip, aria-labels,
segmented control labels, success recap, and submit-button labels
all go through getT()/formatUnit()/displayUnit().
- 26 new unit tests (tests/unit/water-log-i18n.test.ts) cover: en/es
dict parity, holes catalog + hoyos translation, all the
detectInitialLang() branches (SSR/cookie/navigator), setLangCookie
read/write, label interpolation helpers, and the unit catalog.
Refs /tmp/refactor-water-log.md (Commit B plan)