UNPKG

next-video

Version:

A React component for adding video to your Next.js application. It extends both the video element and your Next app with features for automatic video optimization.

125 lines (124 loc) 3.91 kB
import type { VideoConfig } from '../config.js'; import type { Asset } from '../assets.js'; import { StaticImageData } from 'next/image.js'; import type { MediaProps, NativeVideoProps, MuxVideoProps } from './players/media/index.js'; declare module 'react' { interface CSSProperties { [key: `--${string}`]: any; } } export type VideoLoader = (p: VideoLoaderProps) => Promise<string>; export type VideoLoaderWithConfig = (p: VideoLoaderPropsWithConfig) => Promise<string>; export interface VideoLoaderProps { src?: string; width?: number; height?: number; } export type VideoLoaderPropsWithConfig = VideoLoaderProps & { config: Readonly<VideoConfig>; }; export interface PosterProps { token?: string; thumbnailTime?: number; width?: number; domain?: string; } type DefaultPlayerProps = Omit<MediaProps, 'ref'> & PlayerProps; export type VideoProps<TPlaybackId = string | undefined> = TPlaybackId extends string ? Omit<Partial<MuxVideoProps> & PlayerProps, 'src' | 'poster'> & SuperVideoProps & { playbackId?: TPlaybackId; } : Omit<NativeVideoProps & PlayerProps, 'src' | 'poster'> & SuperVideoProps & { playbackId?: undefined; }; type SuperVideoProps = { /** * The component type to render the video as. */ as?: React.FunctionComponent<DefaultPlayerProps>; /** * An imported video source object or a string video source URL. * Can be a local or remote video file. * If it's a string be sure to create an API endpoint to handle the request. */ src?: Asset | string; /** * The poster image for the video. */ poster?: StaticImageData | string; /** * Give a fixed width to the video. */ width?: number; /** * Give a fixed height to the video. */ height?: number; /** * Set to false to hide the video controls. */ controls?: boolean; /** * Set a manual data URL to be used as a placeholder image before the poster image successfully loads. * For imported videos this will be automatically generated. */ blurDataURL?: string; /** * For best image loading performance the user should provide the sizes attribute. * The width of the image in the webpage. e.g. sizes="800px". Defaults to 100vw. * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#sizes */ sizes?: string; /** * A custom function used to resolve string based video URLs (not imports). */ loader?: VideoLoader; /** * A custom function to transform the asset object (src and poster). */ transform?: (asset: Asset) => Asset; }; export type VideoPropsInternal = VideoProps & { /** * The component type to render the video as. */ as: React.FunctionComponent<DefaultPlayerProps>; /** * A custom function used to resolve string based video URLs (not imports). */ loader: VideoLoader; /** * A custom function to transform the asset object (src and poster). */ transform: (asset: Asset, props?: Record<string, any>) => Asset; }; export type PlayerProps = { /** * The asset object for the video. */ asset?: Asset; /** * A string video source URL. */ src?: string | undefined; /** * Set to false to hide the video controls. */ controls?: boolean; /** * The poster image for the video. */ poster?: StaticImageData | string; /** * Set a manual data URL to be used as a placeholder image before the poster image successfully loads. * For imported videos this will be automatically generated. */ blurDataURL?: string; /** * The thumbnail time in seconds to use for the video poster image. */ thumbnailTime?: number; /** * Change the look and feel with a custom theme. */ theme?: React.ComponentType; }; export {};