/** * Centralized hook that drives overlay crossfade on UI thread. * Call this from DragOverlay component (mounted once). * * IMPORTANT: Only uses UI-thread signals (overlayActive, overlayReady, overlayItemId, * overlayRenderedOnUI). Does NOT use overlayVisible which is set from JS-thread via * scheduleOnRN → useEffect, causing scheduling delays that can result in visibility * race conditions. * * The crossfade uses INSTANT swaps (not animated) because: * - With correct overlay positioning (exact match to original), instant swap is imperceptible * - Animated fades (e.g. 50ms) caused visible flicker because the animation started before * the overlay was actually painted to screen, causing the original to dim with no replacement * * The crossfade ensures: * 1. Overlay becomes visible instantly when ready (active + ready + has ID + rendered on UI) * 2. Overlay becomes invisible instantly when drag/drop ends (active goes false) * 3. Original item uses inverse opacity (1 - dragOverlayOpacity) for perfect crossfade * 4. overlayFrozenItemId keeps overlay renderable during state transitions * 5. Overlay state is cleared atomically on deactivation * 6. Swap only happens when overlayRenderedOnUI is true, preventing the original from * becoming invisible before the overlay has actually rendered (the "vanish" bug fix) */ export declare function useOverlayCrossfade(): void; //# sourceMappingURL=useOverlayCrossfade.d.ts.map