Skip to content

Animated logo and 1v1 card in Rive, wired into the phone app - #7

Open
EmotiveImpact wants to merge 21 commits into
mainfrom
claude/project-thread-koxidh
Open

EmotiveImpact wants to merge 21 commits into
mainfrom
claude/project-thread-koxidh

Conversation

@EmotiveImpact

@EmotiveImpact EmotiveImpact commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Before: the logo and the 1v1 versus screen existed only as static designs and prototype CSS. The countdown before a battle was a split screen, and a finished battle went straight to the result screen.

After: both are Rive files, and the phone app plays them.

  • Logo (rive/logo, 11 KB, four artboards): the full logo (the O draws in and the blue dot lands with a ping and glow), the opening screen, a small version without the glow, and a loader. The app's house logo plays it wherever it animated before, with a light tap in the hand as the dot lands.
  • 1v1 card (rive/versus, 704 KB): four intros, picked per battle in versusData.pickIntro:
    • Seam Strike for an everyday battle, including the usual 50 OUT stake;
    • Tale of the Tape for a rematch, anyone you have met before or a stake of 100+, with real rows (steps a day, today, day streak, XP, head to head);
    • the Cinematic for a grudge match (3+ meetings within one win), a derby or the top of a leaderboard;
    • Let's Run for event battles, ready for when events exist.
  • Countdown: the card plays, holds a moment, then opens the live battle. While the other runner hasn't accepted, it says so and offers a way back to the Arena.
  • Result reveal: the first time a finished 1v1 from the last week is opened on a phone, the result lands on the card before the result screen. YOU WIN! or YOU LOSE, K.O. with the glass crack when the winner had at least double, then WINNER and LOSER on each side's win or respect shot and the prize. A tap skips it; Continue appears at the end.

Rive needs a development build, so Expo Go keeps the old screens (detected through Constants.executionEnvironment). The web build plays the same files through @rive-app/canvas.

How: each Rive project is generated from build.py into RML and built with the Rive CLI; the built files are in each export/ folder and copied to apps/mobile/assets/rive. In the app, src/components/rive holds the players (VersusCard, RiveLogo, each with a .web.jsx twin), the runtime check, and versusData.js, which turns a battle into the card's view model values (names, places, rule, stake, prize, clock, tape rows, photos with the Fighter Pack, profile photo, then shadow runner fallback) and the result. The card's cue events drive haptics and the Add your Fighter Pack pill opens the pack screen. Adds @rive-app/react-native 0.5.5 with react-native-nitro-modules 0.36.5, @rive-app/canvas 2.43.1 and expo-dev-client ~58.0.14 (main is now on Expo SDK 58), teaches Metro the .riv extension, ships rive.wasm in public/, and links the Expo project id for EAS cloud builds. 14 new tests cover the intro rules, the tape numbers, the bound values and the result. Checked on SDK 58: typecheck, tests, web, Android and iOS bundles, and headless playback of the tape, cinematic, win and loss.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab

The open O draws in and the blue out now dot lands in the gap, then the
glow breathes on a loop. Authored as RML from build.py with the Rive CLI;
the built file is in rive/logo/export.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
The Rive file now has four artboards. Splash lands the O, then slides
UTHERE out from behind it (Barlow Condensed Bold subset embedded).
Small drops the ping and glow for tiny sizes. Loader runs the stroke
round the O while the dot pulses, with the gap held still.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
One file drives every battle through the Versus view model: names,
areas, stakes, two photos, win, lose and replay, plus an addPack event
from the Add your Fighter Pack pill. Photos sit in layout boxes that
cover their side at any size and fade at the edges, so a Fighter Pack
shot, a profile photo or a gendered silhouette all fit. The male
silhouettes ship as defaults; the app swaps in the female ones.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
@vercel

vercel Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
outhere-site Ready Ready Preview Oct 17, 2026 12:09am UTC

Copy link
Copy Markdown
Owner Author

The red outhere-site Vercel preview isn't caused by this PR. That project builds the @outhere/web workspace, which only exists on the website branches (#6, then #5). This branch is based on main, which has no pnpm workspace yet, so the build logs show "No projects matched the filters" and no dist output. Every commit pushed to a branch based on main fails the same way. This PR only adds rive/ files, which the site doesn't build. The preview should go green once #6 is merged into main and this branch is updated from main. Until then there's nothing to change here.


Generated by Claude Code

Each photo box now fills most of its side. Yours fades out towards the
bottom and theirs towards the top, with the fade colours worked out
from each side's wash so they melt in with no edge.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
The no-photo fallback is now the grey runner from the Fighter Pack plan,
male or female, lightly tinted to each side. tools/shade.py makes the
four files from the shared sources; it replaces the drawn outlines.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Edem found the top of the red side faded too much. Their fade now clears
in the top fifth of the photo instead of the top half, and the red shadow
runners no longer need black padded above the head.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
@EmotiveImpact
EmotiveImpact changed the base branch from main to claude/website-build-dhxeck October 16, 2026 09:14
…eir runner

Edem felt OUTHERE read as one size, so HERE is now set at 78% of OUT.
The red side's top fade is back to a light softening of the photo edge.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Edem wanted the result to feel like a dopamine hit and to use each
pack's celebration or defeat shot. On win or lose, VS winds up and
bursts, the screen flashes, WINNER slams in in the VS style over shock
rings and sparks, the winner's name kicks and +prize OUT pops under it,
and LOSER drops in grey on the other side. Each side swaps to a new
youResult / themResult image under the flash; a pack without the shot
keeps its photo. The winner's glow then breathes in its own loop.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
The female runner was remade to match the male in pose, blur and street,
so both now share one shading setting.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Edem asked for a Street Fighter style K.O. and something extra on the win.
With the new ko boolean set (the app's line: the winner has at least
double the loser's steps), K.O. slams into the middle with a red flash, a
crack and a screen shake, then flies to the loser's corner in place of
LOSER before WINNER lands. Every win now ends with confetti popping out of
WINNER and raining down the winner's side.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
@EmotiveImpact
EmotiveImpact changed the base branch from claude/website-build-dhxeck to main October 16, 2026 10:41
Every result now opens with the viewer's own outcome before WINNER and
LOSER land. A win gets YOU WIN! over two sets of light rays, rings,
sparks and a bloom, with confetti from two corner cannons and a burst
from the headline. A loss gets YOU LOSE in heavy grey letters that drop
one at a time while the screen dims, and no confetti.

The confetti runs on its own state machine layer: about a hundred
strips, chips, dots and curls in white, ice blue, cyan, violet and
silver foil, each turning so its darker back shows and the foil
flashes, with near pieces bigger and faster.

A knockout now cracks the loser's side like glass: uneven rays and
kinked rings, lit facets, holes, falling shards and a glint, clipped to
that side. The VS cuts out as the K. lands.

The file sends cue events for the app's sounds and haptics: impact,
knockout, shatter, youWin, confetti, youLose, thud, winner, loser and
prize. The display font subset gains Y and !.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Speed lines race along the seam while the two halves scissor in from
opposite ends, the seam flares and throws sparks, the screen flashes and
VS slams. Strike In replaces Slam In as the entry and replay state, adds
strike and slam cue events, and holds the pack pill until the card is up.
Each side's wash now reaches past its outer edge so the scissor never
opens a gap.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
The card now carries four intros, picked with the intro enum:
strike (Seam Strike, the default), tape (Tale of the Tape, which
stays on screen until a result), cinematic (film-bar cut-ins on each
runner) and letsRun (streaming names behind two runner panels).
The tape rows, numbers and bars are bound view model properties.
The font is now a Latin subset of Barlow Condensed ExtraBold Italic
so names render in every intro.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
…film bars

The glows behind the tape bars and the cinematic name lines were
rectangles that stopped in a hard edge at each end; they now fade out
past both ends. The leading number on each tape row turns its side's
colour instead of sitting over a fixed glow that slid off short
numbers. The cinematic shots play full screen, matching the card they
cut to.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
Edem picked the digit glow for the leading number on each tape row:
the number is drawn again behind itself as soft stacked strokes in its
side's colour, so the glow sits evenly on a 9 or a 24.6k. The other
side's number stays white at half strength.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
The countdown before a 1v1 now plays the VS card, with the intro picked
from the battle: Seam Strike for an everyday battle, Tale of the Tape
for a rematch, anyone met before or a stake of 100+, the cinematic for
a grudge match, derby or top of a leaderboard, and Let's Run for event
battles. Once the card has played and the battle is live it opens the
battle; while waiting for the other runner it offers a way back.

The first time a finished 1v1 from the last week is opened, the result
lands on the card (YOU WIN! or YOU LOSE, K.O. when the winner had at
least double, then WINNER and LOSER on the result shots) before the
result screen. The house logo plays the Rive mark where it can.

Rive needs a development build, so Expo Go keeps the old screens. The
web build plays the same files with @rive-app/canvas. Adds
expo-dev-client and links the Expo project for EAS cloud builds.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab
@EmotiveImpact EmotiveImpact changed the title Animated logo and 1v1 card in Rive Animated logo and 1v1 card in Rive, wired into the phone app Oct 16, 2026
@EmotiveImpact
EmotiveImpact marked this pull request as ready for review October 16, 2026 22:38
Takes main's package.json and lockfile, then adds the Rive player at
0.5.5, react-native-nitro-modules 0.36.5 and @rive-app/canvas, and the
SDK 58 expo-dev-client (~58.0.14).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KgT8xbybc86Rc11ZV48mab

This branch was successfully deployed

1 active deployment
Preview — ffa91702 Deployed Oct 17, 2026 by vercel[bot]
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