/** One contiguous buffered time range, as reported by `HTMLMediaElement.buffered`. */ export interface BufferedRange { /** Range start, in seconds. */ start: number; /** Range end, in seconds. */ end: number; } /** Props for the shared video/audio scrubber — a custom `role="slider"`, not Chakra's Slider. */ export interface MediaScrubberProps { /** Current committed playback position, in seconds. */ value: number; /** Duration in seconds; a non-finite/zero value disables the scrubber. */ max: number; /** Buffered ranges (from `video.buffered`), plotted behind the play progress. */ buffered?: BufferedRange[]; /** Fires on keyboard step, click and drag-release — the caller should seek the media here. */ onSeek: (seconds: number) => void; /** Fires continuously while hovering/dragging, and with `null` when the pointer leaves — preview only, never seeks. */ onPreview?: (seconds: number | null) => void; /** Accessible name of the `role="slider"` track. */ ariaLabel: string; /** Builds the track's `aria-valuetext`; skipped while disabled. */ ariaValueText: (seconds: number) => string; /** Formats the hover/drag tooltip's timestamp. */ formatTime: (seconds: number) => string; /** Also forced true whenever `max` is non-finite or `<= 0`. */ isDisabled?: boolean; /** Base `data-testid`; the hover tooltip gets `${testId}-tooltip`. */ testId?: string; }