KiteAnimationImage
A coil3.Image carrying a full decoded animation. Coil's own machinery treats it as a static image (drawing the first composited frame), which keeps plain AsyncImage working everywhere; KiteAsyncImage detects this type in a successful result and takes over playback with its own frame loop.
Unlike coil-gif's AnimatedImageDrawable wrapper, this image is stateless: the frames are immutable and playback position lives in the composable, so sharing one instance between targets and the memory cache is safe. shareable therefore may be true: KiteImageDecoder sets it for animations whose pixel bytes fit under its maxCacheableAnimationBytes threshold, which turns a scroll-back in a list into a memory-cache hit instead of a full re-decode. Oversized animations stay unshareable so one huge GIF can't evict the whole cache. size reports the exact pixel-byte footprint so Coil's LRU accounting stays honest either way.