Skip to content

feat(WhereUI): animate live location ranking overtakes - #289

Merged
kyleve merged 12 commits into
mainfrom
codex/location-ranking-overtake-animation
Aug 21, 2026
Merged

feat(WhereUI): animate live location ranking overtakes#289
kyleve merged 12 commits into
mainfrom
codex/location-ranking-overtake-animation

Conversation

@kyleve

@kyleve kyleve commented Aug 20, 2026

Copy link
Copy Markdown
Owner

Posted by an AI agent on the user’s behalf.

Summary

  • User-facing: animate live reversals between the two primary Locations cards with a lift, passing arc, and stamp-like settle.
  • User-facing: keep the fixed visibility-aware 500 ms gate, one coordinated light haptic, and a Reduce Motion emphasis.
  • User-facing: add a DEBUG-only Ranking Animation Lab with repeatable Play Next Overtake behavior and session-only controls.
  • Internal: move each complete card, including its Liquid Glass, paper, microprint, artwork, and calendar transition source.
  • Internal: keep the hierarchy stable while cards cross, then commit the real ranked source order at the identical endpoint.
  • Internal: sample current motion settings when the gate releases without restarting its delay.
  • Internal: add durable Liquid Glass guidance from the regression history to the root, WhereUI, and SnapshotKitTesting agent instructions.

Why

Liquid Glass renders separately from ordinary SwiftUI content. Reordering the ForEach hierarchy at animation start caused the card material to swap instantly and the lower card to grow from zero on later plays.

Each ranked card now owns an independent one-effect container. A region-keyed layout moves the complete surfaces while the hierarchy stays stable. The model commits the true visual and accessibility order after the crossing finishes. New reports keep the active pass intact and queue only the latest delayed reconciliation.

Review focus

  • Counts and rank motion still release through the fixed 500 ms visibility-aware gate.
  • Resolution and Planned Stay sheets leave reconciliation pending while they cover the cards.
  • A newer report restarts that gate without cancelling or snapping an active pass.
  • Motion-setting changes do not restart the gate, and the release uses the newest setting.
  • The settled source order always matches the visual and accessibility order.
  • Reduce Motion commits the reorder immediately and keeps a brief opacity emphasis.
  • Spatial overtakes can draw past scroll bounds without changing settled clipping.
  • Production and the lab share the same presentation, delay, cancellation, feedback, and motion path.
  • Card Designer persistence, exports, and Apply to App behavior are unchanged.

Testing

  • Live simulator recording verified the second and third swaps at 60 fps with both cards full-size throughout.
  • ./swiftformat --lint
  • ./xcstrings --lint
  • ./sf-symbols --lint
  • ./test --no-generate --no-build WhereUITests — 477 tests passed
  • ./test --no-generate --only 'WhereUITests/LocationCardsReconciliationModifierTests' — 3 tests passed
  • Bumper Bowling architecture validation passed
  • Full snapshot review — 47 tests passed during implementation
  • Final targeted Locations and Ranking Animation Lab snapshot review passed; the lab matched byte for byte
  • git diff --check

}

isRankingSurfaceVisible = true
guard yearChanged || !wasVisible else { return }

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on the user’s behalf.

Review focus: this guard is load-bearing. A report change during one visible session updates only the typed reconciliation target, preserving the displayed pair through the 500 ms gate. Initial presentation, year changes, and returning from hidden state synchronize immediately and quietly instead.

// Liquid Glass and Canvas artwork otherwise remain separate render
// layers. Flatten the complete card before applying the passing
// transform so its glass, microprint, and foreground stay aligned.
.compositingGroup()

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on the user’s behalf.

Review focus: the compositing boundary is intentional. Liquid Glass and Canvas-backed microprint can otherwise remain independent render layers during the keyframe scale and rotation; flattening the complete card here keeps those layers registered while leaving the settled Locations snapshots unchanged.

Comment thread AGENTS.md Outdated
@kyleve
kyleve merged commit 447cfd6 into main Aug 21, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant