Skip to content

Known issues

The widget contract’s defects are tracked in the open, not privately. This page lists the ones that are not fully closed and says who each one affects. The full register — every finding, its evidence, and the reasoning behind its status — is docs/contract-gaps.md in the repository.

Thirty-eight findings have been filed. Twenty-nine are fixed, two were closed deliberately, five are partly fixed, and two are open.

  • Open — R, U

The iOS theme pairs white text on Apple’s system blue, which measures 4.02:1 in light and 3.65:1 in dark against a 4.5:1 floor for body text.

Who it affects: anyone using @modyra/styles’ iOS theme for body-sized text on a blue surface.

Why it stays open: that is the pairing Apple specifies, in the Human Interface Guidelines and on every iOS control. A theme exists to be faithful to the system it names, and one that quietly darkened this would ship an iOS theme Apple does not ship. The value is exposed as --mdy-ios-on-blue, so replacing the accent replaces both halves. If you need AA on that surface, override it.

The plain demo page’s height flaps by one pixel under load, so its screenshot tests stay off the parallel schedule (fullyParallel: false for the plain project) until the fractional-height source is isolated. Contents are byte-identical between the flapping captures; only the total height moves.

Who it affects: nobody in production; the suite pays for it in wall time.

@modyra/react and @modyra/preact each carry their own copy of the field store behind createStore and createFieldStore. Both stores track the form only while something is subscribed, and they resume with the latest value. The only way to share the body would be a new public export from the foundation, and each export there is permanent. The copies are kept identical instead: the cross-adapter similarity gate records the pair and fails when one copy changes without the other.

Who it affects: nobody using the packages. A contributor who fixes the store has to fix it in both adapters.

  • Partly fixed — C2, E2, F, L, M

C2 — some popup placement classes are declared but unpainted. The classes are derived correctly and emitted; the themes react to only some of them. A placement class earns a rule only where the popup has an asymmetry to answer — a select flips its search box, a calendar has nothing to flip. Affects theme authors selecting on placement classes that no shipped theme uses.

L — browser coverage is no longer Chromium-only, but the engines disagree. Three engines now run; where they differ, the difference is recorded rather than resolved. Affects anyone shipping to WebKit or Firefox who wants a per-engine guarantee rather than a Chromium one.

M — a readable text colour is estimated, not measured. The contrast metric is decided; the estimate behind automatic colour selection is still approximate. Affects theme authors generating palettes rather than writing them.

E2 and F are internal: test scripts that npm test did not reach, and contract tables keyed by a bare string where a narrower type belongs. Neither changes what a consumer sees.

  • Closed without a fix, deliberately — C4, E3

C4 — two exported values with no consumer. Removing them is a breaking change with no benefit; adding a consumer would mean inventing one.

E3 — conformance covers the three renderers. Angular, Lit and Plain are judged by the DOM conformance suite. The five headless adapters render nothing, so there is no anatomy to check. This is the design, described in what “headless” means, and it is recorded as a finding so that nobody has to rediscover why the numbers differ.

  • Fixed — A1, A2, A3, B1, B2, B3, C1, C3, C5, D, E1, G1, G2, G3, G4, H, I, J1, J2, J3, J4a, J4b, K, N, O, P, Q, S, T

Each carries its evidence in the register. npm run test:docs fails if this page and the register disagree about a finding’s status.