Repository navigation
Ollie blinks, breathes and waves; pages and results land with motion - #242
Merged
Merged
Conversation
The owl blinks on its own clock, breathes while idle, and plays a one-shot gesture when it arrives or changes pose: a wave for point, coach and arguing, a double jump for celebrating, a hop for surprised and idea. Hovering it makes it hop. The app mark blinks too. App pages rise in once as they open, Home's sections and tool rows follow each other in, result scores count up and their bars fill from empty, and success checks pop and draw themselves. Everything is a CSS transform or opacity keyframe, so reduced motion stops all of it and nothing shifts layout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Note 🎁 Summarized by CodeRabbit Free
Comment |
# Conflicts: # src/components/features/tools/result-actions.tsx
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.
Ollie, the owl, now blinks, breathes and gestures everywhere it already appears. Pages and results also get Duolingo-style motion. The PR only changes motion. Copy, labels, features and layout stay as they are. Every animation is a CSS
transformoropacitykeyframe, so nothing reflows. Reduced motion stops all of it through the existing global rule inindex.css.The owl (
src/components/brand/Owl.tsx)sleepypose, whose eyes are already shut.point,coachandarguingwave,celebratingdoes a double jump with squash and stretch, andsurprisedandideahop. The gesture sits inside the keyed pose element, so it replays whenever the pose changes. That is what makes the intro owl cheer on its second beat.OwlAvatarblink is opt-in because a transcript renders one avatar per message. It is on for the avatars that stand for the owl right now: the Ask header and its "Working…" line, the live-draft status, and the Sparring opponent's latest and live speech.OwlMark(the logo) blinks wherever it is 28 px or larger.Where the owl now moves:
OwlLoader(the sign-in check, Crossfire, Library, a shared link, Sparring's "Opponent is thinking", section overlays) andToolRunStatusfor Generate, Attack, Brainstorm and Factoids.EmptyStateon Generate, Attack, Brainstorm, Factoids, Library, History and the current debate page, plus the Ask empty chat and Home's "No current debate" card.Pages and sections
App.tsxRouteContent). Signed-in/apppages rise 8 px and fade in over 280 ms when they open. The animation ends ontransform: none, so fixed and sticky children behave as before once it has played. Public pages are left alone because they have their own reveals and fixed bars. The route skeleton keeps its delayed fade..enter-stagger). On Home, the heading, current-debate card, Prepare and Practice groups and Utilities come in 60 ms apart, and so do the tool rows inside each group.Progress, success and numbers
useCountUp,<CountUp>). Sparring scorecard totals, Attack's case strength and Factoids' verified percentage tick up from 0 over 900 ms. Screen readers get the final number at once and the ticking digits arearia-hidden. Colour thresholds read the real score, andtabular-numskeeps the row from shifting.<Progress reveal>). Result bars fill from empty once: Attack case strength, Factoids verification and each factoid's relevance. The live Timer and Sparring countdowns don't use it..success-pop). The badge pops on the overshoot curve and the tick draws itself. It is used on completed turns in the Sparring round plan (mint#14B37D), the Sparring winner badge, "Saved to History", the intro's lines, and every success toast icon.Buttons, tiles, tabs, switches and checkboxes already had springy press and hover feedback from the restyle, so this PR leaves them unchanged.
Screenshots
Images live on the
debateowl-animations-screenshotsbranch; delete it after this PR closes.Lids on every pose, half and fully closed:

A blink in the app, on the Ask owl and the header mark:

The intro owl's cheer and the Ask owl's wave, frame by frame (each animation paused and stepped):


Home at 390 px, mid-entrance and settled:


Attack at 1440 px, counting (54 on its way to 62, bar filling) and settled:


The intro at 820 px mid-cheer and at 390 px settled, Sparring setup at 820 px, the landing page at 1440 px, and Sparring with reduced motion:





Verification
All of this ran locally at the PR head; it is not a CI result.
npm run verifypassed (exit 0): docs check, lint, typecheck, unit tests 663/663 in 91 files, collaboration 30/30, edge 482/482, build and prerender, the service-worker offline check, and Playwright@smoke47/47 on desktop Chromium.animation-polish,loading-performance,navigation-performance,sparring,staging-switch,home-navigation): 61 passed, 4 failed and 1 flaky.main:loading-performance:63andnavigation-performance:344, each on both projects.home-navigation:90, the onboarding tooltip appearing within 100 ms. It also flakes onmain: run 16 times each, it failed 2 times withmain'ssrcand 3 times with this branch.animate-classes animating.document.getAnimations()reported nothing running on Home, Ask or Sparring.Not checked: WebKit and real phones, dark mode screenshots (the owl's colours don't change with the theme), and the agentic tests.
🤖 Generated with Claude Code