| D-M4-04-0 |
2026-10-15 |
The ticket was built on an integration base and ported onto main with only its own commits; the English docs and spec of main win, and text this ticket adds is English. The rows stand in a section per ticket like the other ported tickets. No core rule or ruling from main was needed. |
The tickets are built in parallel on integration bases; main takes each ticket as one pull request; merged layout wins (D-W-100, D-W-114). |
| D-M4-04-1 |
2026-10-15 |
tokens.py build writes the Dart output twice, to design/build/dart/design_tokens.g.dart and to packages/design_system/lib/src/generated/design_tokens.g.dart (same bytes), and tokens.py check reports either as stale when it differs; test_check_fails_when_package_copy_differs and test_build_writes_the_package_copy_with_the_same_bytes hold it. The copy is generated code (D-M4-01-4). It compiled against Flutter 3.47.7 without a change to the generator. |
A package may not import a file outside its folder (15 3.1 rule 2); one generator writing both copies keeps them equal without a second tool. |
| D-M4-04-2 |
2026-10-15 |
resolveDsContext never throws: an unknown value of appearance.theme or appearance.reduce_motion follows the platform (default system), an unknown appearance.density gives comfortable (also touch on desktop, which 01 11 does not allow there), a touch platform is always touch, and an unknown or absent accent gives spruce (dsDefaultAccent). A key counts as known when DsAccent.of returns a variant other than the default one. |
The server rejects unknown values, but a newer server may add one (06 13); the app then shows the default of 01 11 instead of failing. |
| D-M4-04-3 |
2026-10-15 |
Color scheme mapping as in the package README: primary color.accent.bg, onPrimary color.text.on-accent, surface color.surface.canvas, error color.danger.bg, outline color.border.default, the other roles from the nearest semantic token; accent roles (including the focus ring) come from DsAccent of the context's accent. Density maps comfortable to VisualDensity.comfortable, compact to VisualDensity.compact, touch to VisualDensity.standard. The focus ring is a side of the button themes and the focused border of inputs. Text styles go through dsTextStyle, which puts packages/design_system/<family> in front of the fallback list and sets the wght axis from the weight. |
Brief note 3; an app registers the fonts of a dependency under the package-qualified name (seen in the font manifest of the test build), so the plain family of DsType alone would fall back to a system font inside the apps. |
| D-M4-04-4 |
2026-10-15 |
Fonts from the default branches of googlefonts/atkinson-hyperlegible-next (commit 7925f50f649b3813257faf2f4c0b381011f434f1) and googlefonts/atkinson-hyperlegible-next-mono (commit 154d50362016cc3e873eb21d242cd0772384c8f9) on 2026-10-15; both repositories have no release tags, the font files report version 2.001. The version 5.3.0 in typography.md is the Fontsource package version of the WOFF2 files, not a font version. The files are stored as <Family>[-Italic]-VariableFont_wght.ttf instead of the upstream [wght] names, because alchemist's font loader passes the URL-encoded asset keys of names with brackets to the asset bundle, which then finds no asset. The OFL texts are stored as the hygiene hook leaves them (trailing spaces of one line removed); fonts/MANIFEST.json records the SHA-256 of the stored bytes, the license OFL-1.1 and the license text of every file; fonts_test.dart fails on a changed, missing or extra file, another license or a font without license text. quality/licenses/allowed.txt stays unchanged; docs/quality/licenses.md "Bundled fonts" states the rule. |
Brief note 5; D-L11 settles OFL-1.1 with the text shipped next to the files; every golden test of a later member loads the fonts through alchemist. |
| D-M4-04-5 |
2026-10-15 |
Golden helpers live in the library package:design_system/testing.dart (dsGoldenMatrix), because several members need the same matrix and test folders cannot be shared between packages. It returns an alchemist GoldenTestGroup, so it cannot be written without alchemist, and alchemist is a regular dependency of design_system; members that import testing.dart keep alchemist as their own dev dependency for goldenTest. Each member has its own test/flutter_test_config.dart: fonts loaded, CI goldens everywhere, platform goldens only on macOS, files in test/goldens/ci/ and test/goldens/macos/. The matrix renders with reduced motion and the default accent; for CI goldens it keeps Ahem for the text theme below the scope. deps.dev knows no license for alchemist 0.14.1 and equatable 3.0.0, so both get a checked PackageOverrides entry (MIT, from their LICENSE files) in the root osv-scanner.toml, as D-M4-01-2 does for the other pub packages. A side effect is that the apps bundle the Roboto files alchemist declares; removing them is left to the app packaging ticket. |
Brief note 6, which allows the regular dependency when testing.dart needs alchemist; 15 20. |
| D-M4-04-6 |
2026-10-16 |
CI goldens pass with at most 0.02 % differing pixels (dsCiGoldenDiffThreshold in package:design_system/testing.dart, passed to alchemist's CiGoldensConfig.diffThreshold); every member with goldens uses the same constant. |
The CI golden of the sample page, recorded on macOS, differed on the Linux runner in 170 of 2.28 million pixels at anti-aliased edges, so an exact match cannot hold on every machine as 15 section 20 expects. The bound stays below one full-width one-pixel line of that image, so a missing border or divider still fails. |