Repository navigation
feat: Devup UI keyframes motion, runtime motion checks, export budget headroom - #125
Merged
owjs3901 merged 4 commits intoNov 10, 2026
Merged
Conversation
…ingle tsx's owning app Every entrance rule (ssr-hidden-reveal, reveal-replays, reveal-moves-background, stagger-too-long, motion-without-reduced-motion) now reads Devup UI keyframes, animation props and CSS view-timeline usage as well as framer-motion, with entrance-uses-motion-library, entrance-on-static-content and entrance-per-element added. A single tsx at a monorepo root is matched to its owning app's devup.json from an absolute or partial sourceName or by its text; unverified is reported only when no owner resolves. Co-Authored-By: Claude Fable 5.2 <[email protected]>
…ied is never a pass reveal-checks.mjs measures start/middle/end frames, trigger position and re-entry, then twelve scenarios by default (fast-scroll, reload, history, real bfcache, client-nav, image delay and failure, focus, reduced-motion, no-script, stagger bounds, progress-sync), each not-applicable or unverified rather than passed when unobserved. Ingest returns motionEvidence per candidate at mobile and desktop widths and completion requires both. The runner no longer pauses a view-timeline animation at its hidden first frame. Ships the Reveal.tsx keyframes template and the marker-only runtime, with a compiled Devup UI example and failing fixtures. Co-Authored-By: Claude Fable 5.2 <[email protected]>
The animation guide, delivery rules, behaviorPlan and screen plan name Devup UI static keyframes as the motion path; exports deliver revealTsx. The developmentContract keeps identifiers inline (restoring the two renamed in #124 as separate ids) while standing prose moves to the guide, leaving over 1 KiB under the 15 KiB export budget with a test that asserts the margin. Co-Authored-By: Claude Fable 5.2 <[email protected]>
Co-Authored-By: Claude Fable 5.2 <[email protected]>
owjs3901
marked this pull request as ready for review
November 10, 2026 10:48
owjs3901
deleted the
devfive/3099154426bffbeef8b62999b80bb038/keyframes-motion
branch
November 10, 2026 10:49
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Finishes the follow-ups PR #124 listed as remaining and makes Devup UI's static
keyframes()the motion path (recommended, generated and validated) instead of a script-driven or framer-motion entrance. Full write-up with measurements:reports/keyframes-motion.md.1. Devup UI keyframes as the motion path
@devup-ui/react1.0.41,@devup-ui/vite-plugin1.0.73):keyframes()returns the name,animationName/animation,animationTimeline="view()",animationRange,_motionReduce,_focusWithinandselectorsall extract to static CSS; a dynamicanimationDelaybecomes a CSS variable.Reveal.tsx(new export outputrevealTsx, delivered with every section-entrance candidate):Reveal(scroll-linked section),RevealGroup/RevealItem(staggered group via--reveal-index),RevealLine/RevealStep(progress line and steps timed from one variable). Server code, no animation library.motion-runtime.tsno longer animates entrances. It setsdata-reveal-stateonce, only for timed groups and browsers without view timelines, only on blocks still below the viewport, never under reduced motion. No JavaScript shows the content.animation.mdrewritten keyframes-first (no bundle, no hydration flash,opacity/transformonly); framer-motion only when the project already depends on it and the user asks, or for exit/gesture motion.delivery-quality.md,SKILL.md,common-patterns.md,critical-rules.md, behaviorPlan (pattern: devup-ui-static-keyframes-reveal) and the screen-plan reveal option follow.entry 0% entry min(100%, 240px). Measured at 390x844, a plainentry 100%leaves a 1200px section 28% opaque with 240px of it showing.motion_keyframes.rs):ssr-hidden-reveal,reveal-replays,reveal-moves-background,stagger-too-longandmotion-without-reduced-motionnow read keyframes, animation props and view-timeline usage, with framer-motion detection unchanged. New:entrance-uses-motion-library(info),entrance-on-static-content,entrance-per-element(info).2. 15 KiB export budget
export_context_summarizes_a_large_project_under_fifteen_kib: 15,255 -> 14,086 bytes. Headroom 105 -> 1,274 bytes, and the test now fails below 1,024.nextAction/installedReference, verificationScope explanations, the install-path note) moved to the guide, and a test asserts each moved sentence is there.developmentContractv4 keeps identifiers inline. The two that feat: animation quality defaults and ui_validate keyframes/monorepo token fixes #124 renamed are restored as separate ids next to the new ones: 20 requirements, 8 evidence items, each explained in a new "Contract identifiers" section.3. Runtime motion checks
harness/runtime-audit/reveal-checks.mjsmeasures an entrance whatever produced it (scroll-linked or timed): start/middle/end frames with a screenshot each, trigger position, re-entry, then twelve scenarios that run by default. Each has a passing and a failing fixture:entry 100%on a tall blockfast-scrollreload,history,bfcache,client-navpageshow.persisted)image-delay,image-failureloadeventfocusreduced-motion,no-scriptopacity: 0in markupstaggerprogress-syncpass,fail,not-applicableorunverified. An unobserved scenario makes the checkinconclusive; it is never counted as a pass indevup_runtime_auditsummaries, anddevup_ui_validatekeepsclean-unverified-tokensfor unchecked tokens.motionEvidence: a candidate isverifiedonly with passing checks at a mobile (<=767px) and a desktop (>=1024px) width and nothing unverified; completion applies the same rule.4. Monorepo single-tsx validation
One
tsxat a monorepo root is matched to its owning app'sdevup.json:sourceNameas a path insideprojectRoot(relative or absolute), as the tail of a path, or with no name by matching its text against project files.tokens.ownersays which rule decided. Unverified only when no owner resolves, withthemeGuardrail.ownerCandidatesnaming what was found. Tests: 9 resolved cases acrossapps/aandapps/b, 5 unresolved (orphan, same file under two themes, text found nowhere).#124's limitation list
All machine-checkable limitations from #124 are resolved:
Whether an eligible content block should get motion at all is a user design choice (user-specified design wins); the tool proposes, it does not judge.
Tests
cargo fmt --all -- --check,cargo clippy --locked --workspace --all-targets --all-features -- -D warnings: clean.cargo insta test --workspace --all-features --check: 2,310 passed, 0 failed, 2 ignored; no snapshot changes (24 new tests).keyframes-motion.test.mjs(compiles the shipped templates with Devup UI and audits them at 390x844 and 1440x900) andreveal.test.mjs(6 tests of passing and failing pages).Changed expectations: the runner template writes 14 files (was 13); the old reveal tests in
motion.test.mjsmoved toreveal.test.mjs.🤖 Generated with Claude Code
Submitted via Devfive hub. Employee: ; device:
3099154426bffbeef8b62999b80bb038