Skip to content

feat(companion): tasteful motion pass (entrances, send button, tiles) - #419

Merged
claudiusthebot merged 1 commit into
mainfrom
feat/companion-motion-polish
Jul 1, 2026
Merged

feat(companion): tasteful motion pass (entrances, send button, tiles)#419
claudiusthebot merged 1 commit into
mainfrom
feat/companion-motion-polish

Conversation

@claudiusthebot

Copy link
Copy Markdown
Collaborator

What

A motion + polish pass, tuned to feel calm and premium, not busy, and responsive across phone / tablet / desktop. (Dylan: "beautymaxx it… don't make it slop… think hard about how it will display on different form factors.")

Changes

  • Shared motion vocabulary (TalonMotion in theme): fast/base/slow durations + emphasized/standard curves, so every surface animates with the same rhythm and the app can be retuned in one place.
  • Message entrance — a one-shot rise + fade + a whisper of scale; user rows drift in from the right, assistant fades in place. Gated to play once per message and only for genuinely fresh messages — never history, never on scroll recycle (seen-set + recency check). Honours "reduce motion" (MediaQuery.disableAnimations).
  • Composer send button — springs to full size + colour when there's something to send, dips under the finger on press, softens to a flat idle state when empty, accent glow.
  • Sidebar chat tiles — press-scale, a slim accent bar that slides in on the selected tile, and a fading (not popping) delete affordance.

Form-factor care

Fixed, safe geometry + proportional scale; the existing readable max-width column keeps it consistent on wide screens; reduce-motion respected. Nothing stretches or janks between a phone and a desktop pane.

Test

flutter analyze libNo issues found.

Independent of the other companion PRs (touches theme + message_bubble + composer + sidebar + chat_view; does not touch activity_card.dart, so no conflict with the chip-padding PR). Safe to merge in any order.

🤖 Generated with Claude Code

A polish pass on the app's motion, tuned to feel calm and premium rather
than busy, and responsive across phone/tablet/desktop.

- theme: add TalonMotion — a shared motion vocabulary (fast/base/slow
  durations + emphasized/standard curves) so every surface animates with
  the same rhythm and the whole app can be retuned in one place.
- message rows: a one-shot entrance (gentle rise + fade + a whisper of
  scale; user rows drift in from the right, assistant fades in place).
  Gated so it plays ONCE per message and only for genuinely fresh
  messages — never history and never on scroll recycle (tracked via a
  seen-set + a recency check). Honours the platform "reduce motion"
  setting (MediaQuery.disableAnimations).
- composer send button: springs to full size + colour when there's
  something to send, dips under the finger on press, and softens to a
  flat idle state when empty, with an accent glow.
- sidebar chat tiles: press-scale, a slim accent bar that slides in on
  the selected tile, and a fading (not popping) delete affordance.

All motion uses fixed, form-factor-safe geometry and proportional scale,
and the readable max-width column (already present) keeps it consistent
on wide screens. flutter analyze: no issues.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claudiusthebot
claudiusthebot merged commit 2fc3c68 into main Jul 1, 2026
50 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