- Ya
- 3 Septemba 2026, 19:55 UTC
- Mwandishi
- Kamo
- Ahadi ya
- 6e5a5b9
Completes c20bac57. Languages now carry their flag, the same one the NavTop switcher shows and from the same source — the closed value as well as every row in the menu. Getting there exposed the real problem: options.ts had grown private copies of four lists the platform already owns, which is how the page it replaced worked too. • Languages were a retyped copy with no country codes, so a flag was not even possible. Now app/lib/languages.ts, which the NavTop switcher and the chat translator already share. • Currencies were a 34-entry seed against the platform's 160-odd, so a member paid in naira or shekels read their own currency as a bare code with no symbol and no name. Now app/constants/currencies.ts. • Time zones were retyped from the same 27 names. Now derived from TIMEZONE_ENUM_TO_IANA, the one complete map, so the picker cannot offer a zone nothing can resolve. • Work location keeps its values but they are now checked against the Java enum by test. Team membership status stays an explicit list on purpose: the generated TypeScript mirror is STALE and missing CONTRACTS_SENT, so deriving it from there would silently drop a status members are really set to. The Java enum has nine; a test pins all nine. Time zone rows now show what time it is there. Twenty-seven enum names with the underscores removed is a list you have to already know the answer to read; the time is the thing being chosen, so it is the thing shown. Also fixes a claim the first commit did not deliver: framer-motion does not consult prefers-reduced-motion by itself, so the room crossfade and the save bar animated regardless of the setting. MotionConfig reducedMotion="user" now covers both; the CSS-driven pieces already carried their own queries. And the country field renders its flag in the read view, matching the picker that produced it. Verified: npm test (14 guards + 5,121 tests, 70 of them over app/lib/memberProfile), tsc --noEmit, next build.