Repository navigation
feat(design): complete motion tokens and layout-animation contract (DS-01) - #1561
Conversation
…ract Test-First: src/design/motion.test.ts::provides the complete additive duration easing distance and stagger scale Test-First: src/design/motion.test.ts::owns one rise and fade definition and bounds stagger to eight steps
Test-First: src/design/motion.test.ts::provides the complete additive duration easing distance and stagger scale Test-First: src/design/motion.test.ts::owns one rise and fade definition and bounds stagger to eight steps
Test-First: src/design/motion.test.ts::disables standalone entry stagger and layout animations under reduced motion Test-First: src/design/motion.test.ts::rejects logical sizing spacing typography and border width motion
Disable stagger, sheet, view and new-row animations under the OS preference, extend the layout-property guard, and document stagger and future token consumers. Test-First: src/design/motion.test.ts::disables standalone entry stagger and layout animations under reduced motion Test-First: src/design/motion.test.ts::rejects logical sizing spacing typography and border width motion
|
Root 2026-10-15 18:36:21, head e3e10d0: Claude delta APPROVE (A1 resolved via report correction). Gemini @e3e10d05 REQUEST_CHANGES adjudicated: G1 (medium, motion.css:90 '9 delay buckets') REJECTED - :nth-child(n+9) { --i: 8 } gives 8 stagger increments after the first item, which is exactly what the test 'bounds stagger to eight steps' (motion.test.ts:61) pins; cosmetic semantics, no defect. G2 (low, dynamic import with absolute path, motion.test.ts:46) -> follow-up: tests run under vitest/Vite, which resolves absolute paths; CI windows lane will show it. Marking ready; review-ok only after ALL checks incl. CodeQL are green on this head. |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e3e10d0501
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return findings; | ||
| } | ||
|
|
||
| describe("DS-01 motion scale", () => { |
There was a problem hiding this comment.
Add a valid red-first trailer to the source commit
This commit changes production CSS and TypeScript without a Test-First:, Regression-For:, or No-Test: trailer. Running BASE_SHA=3015d841… HEAD_SHA=3b9baeba… bash scripts/ci/red-first.sh --plan exits 1 on this exact head, so the required red-first check will block integration regardless of the test results documented in the commit body. Preserve the named red-test evidence in valid commit trailers.
AGENTS.md reference: AGENTS.md:L18-L20
Useful? React with 👍 / 👎.
| "inputs/inputs.css|.g-meter b|transition:width var(--g-dur-3, 320ms) var(--g-ease, cubic-bezier(.2, .8, .2, 1))", | ||
| "motion.css|.g-meter b|transition:width var(--g-dur-3) var(--g-ease-out)", | ||
| ]; | ||
| const layoutProperty = /^(?:(?:min-|max-)?(?:width|height|(?:inline|block)-size)|top|left|right|bottom|inset(?:-.+)?|margin(?:-.+)?|padding(?:-.+)?|grid-template(?:-.+)?|flex-basis|(?:row-|column-)?gap|font-size|line-height|border(?:-.+)?-width)$/; |
There was a problem hiding this comment.
Reject the remaining layout-affecting properties
When a design stylesheet adds animation for properties such as flex-grow, grid-auto-columns, order, or the border shorthand, this regex does not classify it as layout motion, so the repository-wide test still passes despite the claim that only the two meter exceptions are allowed. For example, both transition: flex-grow 200ms and transition-property: grid-auto-columns currently produce no finding; expand the classification to cover the other layout-affecting properties.
Useful? React with 👍 / 👎.
| const transition = /^(transition|transition-property)$/.test(prop) && list.comma(decl.value).some((part) => { | ||
| const property = list.space(part)[0].toLowerCase(); | ||
| return layoutProperty.test(property) || property === "all" || /^(?:[.\d-]|var\(|ease|linear|steps\(|cubic-bezier\()/i.test(property); |
There was a problem hiding this comment.
Parse the full transition shorthand before accepting it
When the property is not the first component of the order-independent transition shorthand, only examining list.space(part)[0] lets layout motion bypass the guard. For example, the valid transition: allow-discrete width 200ms returns no finding because the first token is the transition behavior; inspect the parsed shorthand for its property rather than assuming token position.
Useful? React with 👍 / 👎.
|
Root review gate 2026-10-15 18:48:31, bound to head e3e10d0: Claude delta APPROVE at this head; Gemini G1 rejected, G2 follow-up (see earlier comment); all checks green incl. CodeQL (gh pr checks: no fail, no pending). Setting review-ok. |
|
Root auto-queue: head e3e10d0 unchanged since review-ok, all checks green. @Mergifyio queue |
Merge Queue Status
This pull request spent 8 minutes 59 seconds in the queue, including 8 minutes 16 seconds running CI. Required conditions to merge
|
Das Designsystem erhält eine gemeinsame Bewegungsskala und eine begrenzte Staffelung für Listen.
Die Nachbesserung schaltet auch eigenständig verwendete Einstiegseffekte bei reduzierter Bewegung aus und erweitert den Schutz vor Layout-Animationen.
Die Review-Befunde sind unten einzeln beantwortet; die unabhängige Prüfung der Nachbesserung steht noch aus.
Report
Change and scope
DS-01 adds duration, easing, distance and calm-default tokens while retaining existing token names and values. Typed semantic exports reference CSS properties. Stagger indices are capped at eight and delay defaults to zero. Duplicate
g-riseandg-fadedefinitions were removed fromlayout/layout.css.Fix round 1 adds
.g-stagger > *,.g-sheet,.g-viewand.g-is-newto the existing OS reduced-motion kill switch, including standalone use outside shell/portal roots. The existing layout override still covers tab panels, sheets and toasts. The layout-motion guard now includes logical dimensions, flex basis, gaps, font size, line height and border widths. Comments document stagger composition and the unconsumed preference tokens.The CSS contract parses every design stylesheet with PostCSS provided transitively by Vite, not a directly declared dependency. This corrects the previous report's ambiguous “existing dependency” wording using the explicit report-correction option in R1561-A1. No dependency installation, manifest/lockfile change or license addition in this round. The parser still relies on npm's current hoisted dependency layout; strict dependency layouts or future Vite changes require follow-up.
Scope: four package files; 154 additions + 3 deletions = 157 diff lines. Round-one delta: 31 additions + 1 deletion in three files. No seams, Rust,
base.css, architecture exceptions or unrelated test changes. The two existing meter-width transition exceptions remain occurrence-sensitive and may only shrink in DS-05.Evidence — 2026-10-15
3015d841d18fd95d1d0192e193b23955307e4bec.db2135599048187f4d37d205a14aa4123a8da624.5263de62306b1d32a505322fcfc912284e70231a.e3e10d05013a9f8e44a31a488adefc5c67a84e70.npx --no-install vitest run src/design/motion.test.tswith new tests ondb213559inline-sizedetection; ten existing tests passednpm run typecheckon the red-test treenpx --no-install vitest run src/designafter the fixnode --input-type=module(isolated Playwright Chromium fixture)bash scripts/ci/red-first.shnode_modulesonly after byte-identical manifest and lockfile checks, with no installbash scripts/ci/secret-scan.shbefore both commitsgit diff --checkandgit diff origin/main...HEAD --checkbash scripts/ci/gates.sh lane prepushnpx --no-install vitest run src/screens/leitstand/perf/renderBudget.test.tsx --coverageVITEST_MAX_WORKERS=1 bash scripts/ci/gates.sh lane prepushe3e10d05, 744 seconds; 1,428 frontend tests and 2,273 Rust tests passedVITEST_MAX_WORKERS=1 git push -u origin codex/ds-01-motion-tokensgit ls-remote origin codex/ds-01-motion-tokense3e10d05013a9f8e44a31a488adefc5c67a84e70Runtime fixture method: load the real
motion.cssandlayout/layout.cssvia Playwrightpage.setContent, in both stylesheet orders; render ten stagger children and five standalone entry/layout classes, repeated outside roots, within.g-shell, and within[data-g-portal]. UsereducedMotion: 'no-preference'and'reduce', with--g-dur-2: 100sand--g-stagger: 1sto keep normal animations observable. ReadgetComputedStyleandgetAnimations()for all 45 entries and assert the resting state under reduced motion. No desktop app, live queue or server was started.The timeout investigation observed load averages above 26 on the shared host. Subsequent full validation uses
VITEST_MAX_WORKERS=1to limit this worker's concurrency; test selection, timeout, coverage thresholds and assertions remain unchanged. Startcheck capacity waits observed two and then three Cargo builds; validation resumed after the count returned to zero. At startup, PR #1547 was still open (gh pr view 1547 --json state,mergeCommit), so no main merge was required. Provider usage and actual model were not independently observable; the memory mirror was unavailable, so live Git/PR evidence was used.Review disposition
Reviews at
db213559: Anthropic APPROVE WITH CONDITIONS (local review record), Google REQUEST_CHANGES (accepted finding supplied by Root in the task). R1561-G1 is the local disposition ID for that supplied Google finding.motion.css,.g-stagger > *)e3e10d05: explicit reduced-motion selectors, red-first regression, and measured zero active animations in both stylesheet ordersmotion.test.ts:3)motion.test.ts:15)e3e10d05: expanded guard plus a new red-first test covering transitions, transition-property and keyframesmotion.css, stagger rule)e3e10d05: comment prohibits independent child animations. The index-eight cap remains; DS-02 must validate late insertion with nonzero staggermotion.css,motion/tokens.ts)e3e10d05and this report:--g-enter-distis 4px but currently unconsumed; actual rise stays 8px. Ambient/trail tokens and typed exports await DS-02/DS-05. Semanticstandardmeans--g-ease-move; legacy--g-easeremains ease-outReview: ausstehend (Stufe B)
Root schedules the non-OpenAI delta review. This worker did not review, set
review-ok, enqueue or merge the PR. The existing draft state is preserved for handover.NICHT ABGEDECKT
Nextest skipped seven tests; the Denkraum Node suite skipped one Windows-only test. HQ also skips platform-specific tests on Linux. This is the prepush lane, not the full Linux workflow lane; production build and app browser smoke were not rerun in this fix round.
Linux does not compile or run
#[cfg(windows)]tests, including ConPTY, DPAPI, run_in_pty and npm_shim, or Windows clippy paths. The Windows lane runs in the merge queue.Browser evidence covers an isolated Chromium fixture, not installed desktop/WebView behavior, animation smoothness or all themes/viewports. No new visual screenshot claim is made in this round; original screenshot/build evidence belongs to the earlier
db213559delivery and was not re-observed here.The contrast script and color tokens were untouched; its previous 704-pair result was not rerun in this round.
DS-02 owns the Ruhig/Lebendig/Aus switch and preference consumers. DS-05 owns component migration and removal of the two meter-width layout-animation exceptions.
PostCSS remains a transitive dependency; strict installation layouts were not tested. External services and provider limits were not verified.