8c52848212
Root cause: When entry animation completed, there was a race condition: 1. entryState.phase becomes 'complete' 2. Effect calls completeEntry() which sets isEntering = false 3. Component checks 'if (isEntering)' and switches to motion.position 4. But motion.position wasn't synced to groundPosition yet 5. Result: Blobbi snaps to old position instead of falling smoothly The fix uses a two-phase handoff: 1. Component now checks 'isEntering || entryState.phase !== idle' - Keeps using entry animation position during 'complete' phase - The 'complete' phase returns groundPosition, so rendering is correct 2. Added acknowledgeCompletion() function - Called after position is synced AND rendered (via requestAnimationFrame) - Resets phase to 'idle' to allow normal motion to take over - Ensures no frame shows wrong position 3. Position sync effect now: - Detects phase === 'complete' (not just !isEntering) - Syncs position to groundPosition - Waits one frame with requestAnimationFrame - Then calls acknowledgeCompletion() to handoff to motion Files changed: - useBlobbiEntryAnimation.ts: Add acknowledgeCompletion() - useBlobbiCompanion.ts: Use acknowledgeCompletion after sync - BlobbiCompanion.tsx: Check phase !== 'idle' for entry position