import type { AnyPlayerFeature, AudioFeatures, AudioPlayerStore, PlayerStore, PlayerTarget, VideoFeatures, VideoPlayerStore, } from '@videojs/core/dom'; import { combine, createStore } from '@videojs/store'; import { type ContainerMixin, createContainerMixin } from '../store/container-mixin'; import { createProviderMixin, type ProviderMixin } from '../store/provider-mixin'; import { type PlayerContext, playerContext } from './context'; import { PlayerController } from './player-controller'; export interface CreatePlayerConfig { features: Features; } export interface CreatePlayerResult { /** Context for consuming player in controllers. */ context: PlayerContext; /** Creates a store instance for imperative access. */ create: () => Store; /** Player controller bound to this player's context. */ PlayerController: PlayerController.Constructor; /** Mixin that provides player context to descendants. */ ProviderMixin: ProviderMixin; /** Mixin that consumes player context and auto-attaches media elements. */ ContainerMixin: ContainerMixin; } /** * Creates a player factory with typed store, mixins, and controller. * * @example * ```ts * import { createPlayer, MediaElement, selectPlayback } from '@videojs/html'; * import { videoFeatures } from '@videojs/html/video'; * * const { ProviderMixin, ContainerMixin, PlayerController, context } = createPlayer({ * features: videoFeatures, * }); * * // Provider element: owns the store, provides context to descendants * class VideoPlayer extends ProviderMixin(MediaElement) {} * customElements.define('video-player', VideoPlayer); * * // Control element with selector * class PlayButton extends MediaElement { * #playback = new PlayerController(this, context, selectPlayback); * } * ``` * * @label Video * @param config - Player configuration with features. */ export function createPlayer(config: CreatePlayerConfig): CreatePlayerResult; /** * Creates a player factory for audio media. * * @label Audio * @param config - Player configuration with features. */ export function createPlayer(config: CreatePlayerConfig): CreatePlayerResult; /** * Creates a player factory with custom features. * * @label Generic * @param config - Player configuration with features. */ export function createPlayer( config: CreatePlayerConfig ): CreatePlayerResult>; export function createPlayer(config: CreatePlayerConfig): CreatePlayerResult { const slice = combine(...config.features); function create(): PlayerStore { return createStore()(slice); } const ProviderMixin = createProviderMixin(playerContext, create); const ContainerMixin = createContainerMixin(playerContext); return { context: playerContext, create, PlayerController, ProviderMixin, ContainerMixin, }; }