Add Lopuuu rainbow unicorn pet - #10
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
🤖 PR Conflict Resolver: this PR conflicts with To enable AI conflict resolution, add the |
|
|
|
|
|
|
|
Conflicted files (as recorded by the merge step):
|
92b5a73 to
2cace47
Compare
|
🧬 Rebased
The branch was published once with an exact force-with-lease. Please review the rewritten commits before relying on them. |
|
🤖 Auto-resolve running — the conflict resolver started working on this PR at 14:27 UTC. Expected to finish around 14:35 UTC (resolutions typically land in 3-8 minutes; the job times out at 30). On success a merge commit resolving the conflicts is pushed to this branch and a result comment follows — no manual action is needed meanwhile. |
|
🤝 Merged Conflicted files:
Please review the merge commit before relying on it. |
|
🤖 Auto-rebase running — the stack rebase started working on this PR at 12:25 UTC. Expected to finish around 12:40 UTC (rebases typically land in 5-15 minutes; the job times out at 55). On success this branch is force-pushed onto its new base and a result comment follows — no manual action is needed meanwhile. |
56340a0 to
9b78a00
Compare
|
🧬 Rebased
The branch was published once with an exact force-with-lease. Please review the rewritten commits before relying on them. |
|
🤝 Merged No AI resolution was needed by merge time; the branch was updated with a plain merge commit.
Please review the merge commit before relying on it. |
|
🧬 Rebased
The branch was published once with an exact force-with-lease. Please review the rewritten commits before relying on them. |
🦄 Lopu — found a real one this pass: the Pet switch doesn't work on first paint. Fixed it.Re-reviewed The defectThe off switch is this feature's headline requirement — an earlier pass added it specifically
Until that lands, if (!petVisible(theme?.general)) return null;…which reads exactly that default. So a user who turned the pet off got a full-size That's worse than just leaving it on. A decorative ornament that flashes in and out is the The fixThe repo already answers this shape the other way round. The drawer is persisted chrome too, // petCore.ts — stays a pure core, so it's covered by real assertions
export const petMounted = (loading?: boolean | null, general?: { pet?: boolean } | null): boolean =>
!loading && petVisible(general);// LopuuuPet.tsx
const { loading } = useThingtime();
...
if (!petMounted(loading, theme?.general)) return null;
+2 tests covering the gate in both directions and the missing-flag fallback. One thing I did not change — the pet lands on the DevKit bubble
There's a house convention for exactly this: Which of those reads better is an aesthetic call about your own pet, on a surface production Two smaller things
Verified rather than assumed
Validation: Still merge-as-is from my side once you're happy with the DevKit-corner question. |
|
Lopu repository review — batch review of 16 open PRs. Ornamental, but the three ways app-wide fixed chrome usually goes wrong are all handled deliberately — and the reasoning is recorded where the next person will need it, which is the part I'd have asked for:
Two smaller things I checked: Motion being opt-out twice (the
No changes made — no defects found. |
🦄 Lopu review — the pet is sitting under the DevKit bubbleReviewed Nice work overall: the switch/default/back-compat story is careful, the hydration guard is real (I traced The one real defectThe pet was anchored at deployEnv = envFromCookie.THINGTIME_VERCEL_ENV || env.NODE_ENV
devKit = !explicitlyOff && (deployEnv !== 'production' || !!env.devKit)That's on by default on every preview deployment and every local dev session — precisely the builds this pet gets looked at on. The trigger reaches 72px in from the right edge; the 74px unicorn occupied roughly It's visual only — Clearing that corner is already the house rule, stated in three places:
What I changedAdded Two tests came with it: one pins the clearance to the DevKit geometry ( Validation: 32/32 tests pass across Notes, not changes — your call
Everything else I checked came back clean: — Lopu 🦄 |
🦄 Lopu — the Pet switch was reading the wrong cache tier. Moved it to the pre-paint path.Re-reviewed The last pass found that the pet mounted on the pre-hydration default and so flashed at users who'd switched it off, and gated it on
The pet's visibility is a first paint, and it was being decided by Tier 2. What that cost
The fix — ride the path every other theme token already usesA synchronous
Two tiers, in the order they actually happen: One incorrect rationale retired along the way. The old comment justified unmounting with "a display:none pet would still cost the three infinite animations." It wouldn't — per CSS Animations, Net: pet-off users get no flash — now on frame 1 rather than after hydration — pet-on users get no pop-in, and a storage failure no longer erases the feature. Also added
Validation
Everything else still holdsI re-verified the load-bearing parts rather than trusting the earlier passes: the Also worth stating plainly since it dominates the diff stat: the +1.34M lines are the With the first-paint tier corrected, this reads as ready to merge. 🦄 |
🦄 Lopu — the Motion switch had the same tier bug the Pet switch had. Fixed it.Re-reviewed The pet animated for a tick at users who'd turned Motion offAn earlier pass on this PR So on every page load, It also made the pet the only decorative surface in the app that ignores Worth being precise about the blast radius: this was only the in-app The fix — same two tiers you already built, not a second mechanism- '--tt-pet-display': g.pet ? 'block' : 'none',
+ '--tt-pet-display': g.pet ? 'block' : 'none',
+ '--tt-pet-anim': g.motion ? 'initial' : 'none',- export const petAnimation = (spec, motion) => (motion ? spec : undefined);
+ export const petAnimation = (spec, motion) =>
+ motion ? `var(--tt-pet-anim, ${spec})` : undefined;The interesting bit is Post-hydration the Validation39/39 across
I didn't want to ship a fix resting on One thing you should know that isn't about this feature
Checked and fine
Merge-ready from my side. 🦄 Lopu · automated review of |
🦄 Lopu — the pre-paint path was correct; something else was overwriting itRe-reviewed The last few passes on this PR walked the Pet switch, and then the Motion What happens on a pet-off reload
Net: correct first paint → ThemeHost writes It was never pet-specific. It clobbered every customised token — a custom FixTwo lines in It's safe rather than merely deferred, which is why it stays that small — Important This is the one thing I'd like your call on. The fix is the root cause of Also changed
Validation
Two things I did not change
🧹 Housekeeping: comment 5512846054 is a stray Lopu post whose body is the literal string 🦄 Posted by Lopu ( |
|
Lopu review — no defects found. This follows the repo's documented rules rather than working around them, which is what makes a decorative feature safe to land app-wide. The optimistic-first-paint requirement is genuinely satisfied, not just claimed.
The Other things that check out:
Validation: Run with a minimal ESM resolver standing in for Posted by Lopu, Thingtime's PR manager. |
🦄 Lopu — reviewed
|
🦄 Lopu — re-reviewed
|
|
🤖 Branch status still computing. The base branch moved, and GitHub had not finished recomputing whether this PR conflicts or is behind after the detector waited 500s — so no branch update was started this round. The next push or the twice-hourly scheduled sweep (minutes :02/:32) re-checks automatically. Posted by the conflict detector at 10:18 UTC, 2026-09-03; this notice is edited in place on re-checks. |
|
🤖 Lopu review — PR #10 (head No changes needed — I made none. Validated green: The
|
🤖 Lopu detected an out-of-date PR branchStatus: Work detected — Lopu is taking ownership. Current phase: Entering Lopu's serialized PR-resolution queue. Estimated completion: around 10:48 UTC (~20 minutes; this adjusts as the queue moves). Next automatic check-in: within 10 minutes while work remains active. You can stay on this PR; there is no need to find the Actions run. Time conversion (UTC source)
Los Angeles and Melbourne use their real IANA time zones, so PDT/PST and AEST/AEDT offsets change automatically. Lopu queue and PR pulse
Related PR context
Exact branch pair: Timeline
|
🤖 Lopu detected an out-of-date PR branchStatus: Work detected — Lopu is taking ownership. Current phase: Entering Lopu's serialized PR-resolution queue. Estimated completion: around 11:07 UTC (~20 minutes; this adjusts as the queue moves). Next automatic check-in: within 10 minutes while work remains active. You can stay on this PR; there is no need to find the Actions run. Time conversion (UTC source)
Los Angeles and Melbourne use their real IANA time zones, so PDT/PST and AEST/AEDT offsets change automatically. Lopu queue and PR pulse
Related PR context
Exact branch pair: Timeline
|
🦄 Lopu review — the riskiest change here isn't the unicornNo changes needed; 32/32 tests pass. But it's worth naming what actually carries risk in this PR, because it isn't the pet.
|
🤖 Lopu detected an out-of-date PR branchStatus: Work detected — Lopu is taking ownership. Current phase: Entering Lopu's serialized PR-resolution queue. Estimated completion: around 12:15 UTC (~20 minutes; this adjusts as the queue moves). Next automatic check-in: within 10 minutes while work remains active. You can stay on this PR; there is no need to find the Actions run. Time conversion (UTC source)
Los Angeles and Melbourne use their real IANA time zones, so PDT/PST and AEST/AEDT offsets change automatically. Lopu queue and PR pulse
Related PR context
Exact branch pair: Timeline
|
🤖 Lopu detected an out-of-date PR branchStatus: Work detected — Lopu is taking ownership. Current phase: Entering Lopu's serialized PR-resolution queue. Estimated completion: around 13:07 UTC (~20 minutes; this adjusts as the queue moves). Next automatic check-in: within 10 minutes while work remains active. You can stay on this PR; there is no need to find the Actions run. Time conversion (UTC source)
Los Angeles and Melbourne use their real IANA time zones, so PDT/PST and AEST/AEDT offsets change automatically. Lopu queue and PR pulse
Related PR context
Exact branch pair: Timeline
|
🤖 Lopu detected an out-of-date PR branchStatus: Work detected — Lopu is taking ownership. Current phase: Entering Lopu's serialized PR-resolution queue. Estimated completion: around 13:17 UTC (~20 minutes; this adjusts as the queue moves). Next automatic check-in: within 10 minutes while work remains active. You can stay on this PR; there is no need to find the Actions run. Time conversion (UTC source)
Los Angeles and Melbourne use their real IANA time zones, so PDT/PST and AEST/AEDT offsets change automatically. Lopu queue and PR pulse
Related PR context
Exact branch pair: Timeline
|

Motivation
Description
LopuuuPetatremix/app/components/Pets/LopuuuPet.tsxthat renders a unicorn emoji with rainbow, sparkle, brain, and heart accents and CSS keyframe animations.LopuuuPetfrom the main layoutremix/app/components/Layout/Main.tsximmediately before theFooterso it appears application-wide.fixed, haspointerEvents: none,zIndex: 20, and anaria-labelfor accessibility to keep interactions non-blocking and screen-reader friendly.Testing
pnpm --prefix remix exec prettier --write app/components/Pets/LopuuuPet.tsx app/components/Layout/Main.tsx, which completed successfully.pnpm --prefix remix run build, which produced client and server bundles and completed successfully despite build warnings.graphify update ., butgraphifyis not installed in the environment so the update could not run.playwrightis not installed and the built server could not load a missing nativebcryptbinding.Codex Task