Skip to content

Add Rep, a tappable strongman mascot on the coach chat bar - #14

Draft
lemmy-winks wants to merge 3 commits into
mainfrom
claude/coach-chat-mascot-puru0x
Draft

Add Rep, a tappable strongman mascot on the coach chat bar#14
lemmy-winks wants to merge 3 commits into
mainfrom
claude/coach-chat-mascot-puru0x

Conversation

@lemmy-winks

Copy link
Copy Markdown
Owner

A cute chunky strongman (Super-Meat-Boy energy, Void×Volt colors) who sometimes hops up onto the coach chat composer and bounces there. Tap him and he busts out a mini workout — squat, overhead press, curls, jumping jacks or pushups — with the move, rep count and tempo re-rolled every time, then a double-bicep flex and a random one-liner ("light weight!", "do NOT skip leg day", …).

How it works

  • web/src/mascot.tsx — new CoachMascot component. Purely cosmetic: it only schedules appearances and picks the next set; all motion is CSS keyframes in the new .mascot block of styles.css.
  • Appearances: 55% dice roll when the Coach tab opens (1.5–5.5 s delay, random landing spot), quiet re-rolls every couple of minutes while you linger, and he wanders off after ~30–45 s if ignored. Every tap keeps him around longer. localStorage 'forge-mascot' = 'always' | 'never' overrides the dice (handy for demos, or for turning him off).
  • Workout mechanics: the torso carries a finite rep-counting animation for every move (--reps × --spd CSS vars); its animationend tells React the set is done, triggering the flex + quip. Never repeats the previous move.
  • The proposal bar / context chip and composer are now wrapped in one .chatfoot band so he perches on top of whatever is uppermost (he even does pushups lying on the proposal bar). The wrapper stays inside the .app children pattern, so the desktop 700px column cap applies automatically.
  • All colors come from the token families (--volt/--on-volt body, neutral grays for the barbell/dumbbells), so both themes and every accent palette carry through. Hidden entirely under prefers-reduced-motion.

Testing

  • cd server && python -m pytest tests/ -q — 43 passed.
  • cd web && npm run build — clean.
  • Drove the built app headless (demo seat, phone viewport): verified pop-in, idle bounce, tap → workout → flex → quip → idle for multiple moves, dark and light themes, and that he no longer hides behind (or blocks taps on) the "Next week proposed" bar.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FAjB4fJdTfPupJFcLwfHTT


Generated by Claude Code

claude added 3 commits July 22, 2026 14:23
A chunky Void×Volt strongman who sometimes pops up onto the chat
composer and bounces there. Tapping him plays a randomized mini
workout — squats, presses, curls, jumping jacks or pushups, with rep
count and tempo re-rolled each time — then a double-bicep flex and a
one-liner quip. Purely cosmetic: CSS keyframes drive all motion, the
component only schedules appearances and picks the next set.

- appears by dice roll (55% on opening Coach, re-rolls while you
  linger), wanders off if ignored; localStorage 'forge-mascot' =
  'always'/'never' overrides
- perches on the new .chatfoot wrapper so he stands on top of the
  proposal bar / context chip when those are showing
- all colors come from the token families, so every palette and both
  themes carry through; hidden under prefers-reduced-motion

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FAjB4fJdTfPupJFcLwfHTT
Swap the rounded vector blob for pixel art on a 4px grid with
crispEdges: one square slab for head+torso, ear nubs, detached stub
arms and legs, square eyes and a pixel mouth. Equipment goes flat and
blocky too (no strokes). Same animations and behavior; barbell rack /
press offsets retuned for the new geometry. Colors stay in the token
families so themes and accent palettes carry through.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FAjB4fJdTfPupJFcLwfHTT
New row in Settings → Appearance ('Rep, the chat mascot' ON/OFF)
backed by prefs.mascot (default on, synced through /api/prefs like
theme and palette, so it follows the user across devices). The
component gates all scheduling and rendering on the pref; the
localStorage dev knob still forces appearances for demos but never
overrides an explicit off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FAjB4fJdTfPupJFcLwfHTT
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.

2 participants