diff --git a/packages/html/src/define/base.css b/packages/html/src/define/base.css index 80ac3605..4d1ac6c2 100644 --- a/packages/html/src/define/base.css +++ b/packages/html/src/define/base.css @@ -10,8 +10,6 @@ video-player video { display: block; width: 100%; height: 100%; - object-fit: var(--media-object-fit, contain); - object-position: var(--media-object-position, center); } video-player video::-webkit-media-text-track-container { diff --git a/packages/html/src/define/video/minimal-skin.tailwind.ts b/packages/html/src/define/video/minimal-skin.tailwind.ts index abe9d1c8..cbc3e199 100644 --- a/packages/html/src/define/video/minimal-skin.tailwind.ts +++ b/packages/html/src/define/video/minimal-skin.tailwind.ts @@ -10,7 +10,9 @@ import { iconFlipped, iconState, overlay, + playbackRate, popup, + poster, preview, root, seek, @@ -32,13 +34,13 @@ import '../ui/pip-button'; import '../ui/play-button'; import '../ui/playback-rate-button'; import '../ui/popover'; +import '../ui/poster'; import '../ui/seek-button'; import '../ui/time'; import '../ui/time-slider'; import '../ui/tooltip'; import '../ui/tooltip-group'; import '../ui/volume-slider'; -import { playbackRate } from '@videojs/skins/default/tailwind/video.tailwind'; const SEEK_TIME = 10; @@ -47,6 +49,10 @@ function getTemplateHTML() { + + + + ${renderIcon('spinner')} diff --git a/packages/html/src/define/video/minimal-skin.ts b/packages/html/src/define/video/minimal-skin.ts index 41a06f6f..a0a66cf5 100644 --- a/packages/html/src/define/video/minimal-skin.ts +++ b/packages/html/src/define/video/minimal-skin.ts @@ -13,6 +13,7 @@ import '../ui/pip-button'; import '../ui/play-button'; import '../ui/playback-rate-button'; import '../ui/popover'; +import '../ui/poster'; import '../ui/seek-button'; import '../ui/time'; import '../ui/time-slider'; @@ -27,6 +28,10 @@ function getTemplateHTML() { + + + + ${renderIcon('spinner', { class: 'media-icon' })} diff --git a/packages/html/src/define/video/skin.tailwind.ts b/packages/html/src/define/video/skin.tailwind.ts index 1f235235..d61ccea4 100644 --- a/packages/html/src/define/video/skin.tailwind.ts +++ b/packages/html/src/define/video/skin.tailwind.ts @@ -11,6 +11,7 @@ import { overlay, playbackRate, popup, + poster, preview, root, seek, @@ -32,6 +33,7 @@ import '../ui/pip-button'; import '../ui/play-button'; import '../ui/playback-rate-button'; import '../ui/popover'; +import '../ui/poster'; import '../ui/seek-button'; import '../ui/time'; import '../ui/time-slider'; @@ -46,6 +48,10 @@ function getTemplateHTML() { + + + +
${renderIcon('spinner')} diff --git a/packages/html/src/define/video/skin.ts b/packages/html/src/define/video/skin.ts index 3aeef13f..823c8c01 100644 --- a/packages/html/src/define/video/skin.ts +++ b/packages/html/src/define/video/skin.ts @@ -14,6 +14,7 @@ import '../ui/pip-button'; import '../ui/play-button'; import '../ui/playback-rate-button'; import '../ui/popover'; +import '../ui/poster'; import '../ui/seek-button'; import '../ui/time'; import '../ui/time-slider'; @@ -28,6 +29,10 @@ function getTemplateHTML() { + + + +
${renderIcon('spinner', { class: 'media-icon' })} diff --git a/packages/react/src/presets/types.ts b/packages/react/src/presets/types.ts index 69f0d47a..fa612f06 100644 --- a/packages/react/src/presets/types.ts +++ b/packages/react/src/presets/types.ts @@ -1,4 +1,6 @@ import type { CSSProperties, PropsWithChildren } from 'react'; +import type { Poster } from '@/ui/poster'; +import type { RenderProp } from '@/utils/types'; export type BaseSkinProps = PropsWithChildren< T & { @@ -6,3 +8,7 @@ export type BaseSkinProps = PropsWithChildren< className?: string; } >; + +export type BaseVideoSkinProps = BaseSkinProps & { + poster?: string | RenderProp | undefined; +}; diff --git a/packages/react/src/presets/video/minimal-skin.tailwind.tsx b/packages/react/src/presets/video/minimal-skin.tailwind.tsx index b06a2307..4675e438 100644 --- a/packages/react/src/presets/video/minimal-skin.tailwind.tsx +++ b/packages/react/src/presets/video/minimal-skin.tailwind.tsx @@ -26,12 +26,14 @@ import { iconState, overlay, popup, + poster, preview, root, seek, slider, time, } from '@videojs/skins/minimal/tailwind/video.tailwind'; +import { isString } from '@videojs/utils/predicate'; import { cn } from '@videojs/utils/style'; import { type ComponentProps, forwardRef, type ReactNode } from 'react'; import { Container, usePlayer } from '@/player/context'; @@ -44,12 +46,14 @@ import { PiPButton } from '@/ui/pip-button'; import { PlayButton } from '@/ui/play-button'; import { PlaybackRateButton } from '@/ui/playback-rate-button'; import { Popover } from '@/ui/popover'; +import { Poster } from '@/ui/poster'; import { SeekButton } from '@/ui/seek-button'; import { Slider } from '@/ui/slider'; import { Time } from '@/ui/time'; import { TimeSlider } from '@/ui/time-slider'; import { Tooltip } from '@/ui/tooltip'; import { VolumeSlider } from '@/ui/volume-slider'; +import { isRenderProp } from '@/utils/use-render'; import { ErrorDialog } from './error-dialog'; import type { MinimalVideoSkinProps } from './minimal-skin'; @@ -142,12 +146,20 @@ function FullscreenLabel(): ReactNode { /* ------------------------------------------ Skin ------------------------------------------- */ export function MinimalVideoSkinTailwind(props: MinimalVideoSkinProps): ReactNode { - const { children, className, ...rest } = props; + const { children, className, poster: posterProp, ...rest } = props; return ( {children} + {posterProp && ( + + )} + (
diff --git a/packages/react/src/presets/video/minimal-skin.tsx b/packages/react/src/presets/video/minimal-skin.tsx index ccbe4f00..e9b6f74d 100644 --- a/packages/react/src/presets/video/minimal-skin.tsx +++ b/packages/react/src/presets/video/minimal-skin.tsx @@ -13,6 +13,7 @@ import { VolumeLowIcon, VolumeOffIcon, } from '@videojs/icons/react/minimal'; +import { isString } from '@videojs/utils/predicate'; import { cn } from '@videojs/utils/style'; import { type ComponentProps, forwardRef, type ReactNode } from 'react'; import { Container, usePlayer } from '@/player/context'; @@ -25,18 +26,20 @@ import { PiPButton } from '@/ui/pip-button'; import { PlayButton } from '@/ui/play-button'; import { PlaybackRateButton } from '@/ui/playback-rate-button'; import { Popover } from '@/ui/popover'; +import { Poster } from '@/ui/poster'; import { SeekButton } from '@/ui/seek-button'; import { Slider } from '@/ui/slider'; import { Time } from '@/ui/time'; import { TimeSlider } from '@/ui/time-slider'; import { Tooltip } from '@/ui/tooltip'; import { VolumeSlider } from '@/ui/volume-slider'; -import type { BaseSkinProps } from '../types'; +import { isRenderProp } from '@/utils/use-render'; +import type { BaseVideoSkinProps } from '../types'; import { ErrorDialog } from './error-dialog'; const SEEK_TIME = 10; -export type MinimalVideoSkinProps = BaseSkinProps; +export type MinimalVideoSkinProps = BaseVideoSkinProps; const Button = forwardRef>(function Button({ className, ...props }, ref) { return