/** * CaptureCountdownOverlay — the blinking auto-stop countdown shown at the * user-perceived TOP-LEFT during an in-progress panorama capture (item 5 * of the first-time-user GUIDANCE flow). * * ┌──────────────────────────────────────────────────┐ * │ ● 9 │ ← top-left, blinks * │ │ * │ (camera preview / pan in progress) │ * │ │ * └──────────────────────────────────────────────────┘ * * Why this exists * The capture auto-finalizes after a fixed window (the parent owns the * real timer — see Camera's `countdownSecondsFrom`). Without a visible * counter the auto-stop feels abrupt ("why did it stop?"). A calm * blinking "● N" tells the user how many seconds of pan they have left. * * What it does * - Renders an amber glow dot + a white tabular-nums integer * (`secondsRemaining`, computed by the parent) using the shared * {@link GUIDANCE_COUNTDOWN} design tokens. * - Pins itself to the user-perceived top-left corner across all four * device orientations. The app layout is portrait-locked, so — like * {@link CaptureStatusOverlay} / {@link PanoramaGuidance} — we anchor * to the matching layout corner and apply a rotation transform so the * number reads upright in the user's hold. * - Blinks the WHOLE timer (dot + number) between * `GUIDANCE_COUNTDOWN.blinkMinOpacity` and `blinkMaxOpacity` over * `blinkPeriodMs` with an ease-in-out loop on the native driver. * * The displayed number is COSMETIC only — the parent owns the auth­oritative * auto-stop timer and computes `secondsRemaining`. This component never * fires a stop; it purely visualises the remaining time, so a dropped frame * or a re-render hiccup can never desync from (or pre-empt) the real timer. * * Pure-presentational and `pointerEvents="none"`: it never steals taps from * the camera / shutter beneath it, and renders nothing when `!visible` so * the host can mount it unconditionally without layout shifts. */ import React from 'react'; import { type StyleProp, type ViewStyle } from 'react-native'; import { type DeviceOrientation } from './useDeviceOrientation'; export interface CaptureCountdownOverlayProps { /** * Show / hide. Driven by the host while a capture is in progress * (typically `statusPhase === 'recording'`). Renders nothing when * false so the host can mount it unconditionally. */ visible: boolean; /** * Whole seconds of capture remaining, as computed by the parent's * authoritative timer (Camera's `countdownSecondsFrom`). Displayed * verbatim via `Math.max(0, Math.round(...))` so a fractional or * transiently-negative value never renders as "-0" or "3.0". * * COSMETIC ONLY — this component does not own the auto-stop. */ secondsRemaining: number; /** * Physical device orientation (typically from `useDeviceOrientation`). * Drives the corner anchoring + rotation so the number sits at the * user-perceived top-left and reads upright. */ orientation: DeviceOrientation; /** Outer style passthrough. */ style?: StyleProp; } export declare function CaptureCountdownOverlay({ visible, secondsRemaining, orientation, style, }: CaptureCountdownOverlayProps): React.JSX.Element | null; //# sourceMappingURL=CaptureCountdownOverlay.d.ts.map