Skip to content

UI

Headless UI plugin with 17 components. JS creates DOM and wires behavior — styling is yours. Import theme.css for a ready-made look.

Usage

html
<div id="player-container">
  <video src="video.mp4"></video>
</div>
ts
import { createPlayer } from "@videts/vide";
import { ui } from "@videts/vide/ui";
import "@videts/vide/ui/theme.css"; // optional — brings default skin

const player = createPlayer(document.querySelector("video")!);
player.use(ui({ container: document.getElementById("player-container")! }));

Options

OptionTypeDefaultDescription
containerHTMLElementContainer element for UI controls (required)
excludeUIComponentName[][]Components to exclude
includeUIComponentName[]Components to opt-in (overrides default exclusions)
posterstringPoster image URL

Component Selection

play, progress, time, volume, fullscreen, loader, error, bigplay, poster, keyboard, clickplay, autohide, ad-countdown, ad-skip, ad-overlay, ad-label, ad-learn-more

The ad-overlay component is off by default and needs include: ["ad-overlay"] to enable.

ts
player.use(ui({
  container: el,
  exclude: ["volume", "fullscreen"],
  poster: "https://example.com/poster.jpg",
}));

Components

ComponentDescription
playPlay/pause toggle button
progressSeekable progress bar
timeCurrent time / duration display
volumeVolume slider with mute toggle
fullscreenFullscreen toggle button
loaderLoading spinner
errorError message overlay
bigplayCentered play button overlay
posterPoster image overlay
keyboardKeyboard shortcuts (Space, arrows, M, F, 0-9)
clickplayClick-to-play/pause on video area
autohideAuto-hide controls after inactivity
ad-countdownAd remaining time countdown
ad-skipSkip ad button (after skipOffset)
ad-overlayAd click-through overlay (opt-in, default off)
ad-label"Ad" label during ad playback
ad-learn-moreCTA "Learn More" button

Standalone Components

Components can be used individually outside the ui() convenience plugin:

ts
import { createPlayButton, createProgress } from "@videts/vide/ui";

const play = createPlayButton();
play.mount(controls);
play.connect(player);

Each component implements the UIComponent interface:

ts
interface UIComponent {
  mount(container: HTMLElement): void;
  connect(player: Player): void;
  destroy(): void;
}

UI + VAST Ads

The UI plugin provides ad components that integrate with VAST via getAdPlugin():

html
<div id="player-container">
  <video src="video.mp4"></video>
</div>
ts
import { ui } from "@videts/vide/ui";
import { vast } from "@videts/vide/vast";

const uiPlugin = ui({ container: document.getElementById("player-container")! });
player.use(uiPlugin);
player.use(vast({
  tagUrl: "https://example.com/vast.xml",
  adPlugins: uiPlugin.getAdPlugin(),
}));
ts
// Enable the full-area ad overlay (off by default)
const uiPlugin = ui({ container: el, include: ["ad-overlay"] });

Styling

With theme.css

ts
import "@videts/vide/ui/theme.css";

Provides a complete default skin (3.5 KB gzip) with CSS custom properties. Override any token to retheme the player.

Design Tokens

All tokens are defined as CSS custom properties on :root. Override them globally or scope to a container.

Palette

TokenDefaultDescription
--vide-accent#e03e52Primary accent (progress bar, handle)
--vide-accent-hover#ee4f62Accent hover state
--vide-text#fffPrimary text / icon fill
--vide-text-midrgba(255,255,255,0.72)Secondary text (time display)
--vide-text-dimrgba(255,255,255,0.44)Tertiary text (disabled states)

Surfaces

TokenDefaultDescription
--vide-bgrgba(0,0,0,0.75)Background overlay
--vide-chiprgba(0,0,0,0.88)Chip background (ad label)
--vide-chip-lightrgba(0,0,0,0.72)Lighter chip (ad countdown)
--vide-hoverrgba(255,255,255,0.08)Button hover background

Layout

TokenDefaultDescription
--vide-controls-height48pxControls bar min-height
--vide-controls-padding-x12pxControls horizontal padding
--vide-controls-padding-bottom6pxControls bottom padding
--vide-controls-gap4pxGap between control items

Typography

TokenDefaultDescription
--vide-fontsystem sans-serif stackPrimary font family
--vide-font-monosystem monospace stackMonospace font (time display)
--vide-font-size13pxBase font size
--vide-font-size-sm11pxSmall font size
--vide-font-size-xs10pxExtra-small font size
--vide-line-height1Base line-height

Icons / Buttons

TokenDefaultDescription
--vide-icon-size22pxSVG icon dimensions
--vide-btn-size40pxControl button dimensions
--vide-btn-padding8pxControl button padding

Radius

TokenDefaultDescription
--vide-radius4pxDefault border-radius
--vide-radius-sm3pxSmall border-radius
--vide-radius-round50%Circular elements

Progress

TokenDefaultDescription
--vide-progress-height3pxTrack height
--vide-progress-height-hover5pxTrack height on hover / drag
--vide-progress-hit-area16pxClickable area height
--vide-handle-size13pxSeek handle diameter

Easing

TokenDefaultDescription
--vide-easecubic-bezier(0.4,0,0.2,1)Default easing curve
--vide-duration0.2sDefault transition duration
--vide-duration-fast0.12sFast transition duration

Ad

TokenDefaultDescription
--vide-accent-ad#f2c94cAd accent (progress bar, label stripe)
--vide-ad-label-stripe3pxAd label left stripe width
--vide-ad-label-pad-y6pxAd label vertical padding
--vide-ad-label-pad-x10pxAd label horizontal padding
--vide-ad-overlay-gap12pxGap around ad overlays

Skip Button

TokenDefaultDescription
--vide-skip-bgrgba(24,24,28,0.85)Background
--vide-skip-borderrgba(255,255,255,0.22)Border color
--vide-skip-color#fffText / icon color
--vide-skip-padding-y10pxVertical padding
--vide-skip-padding-x16pxHorizontal padding
--vide-skip-font-size14pxFont size
--vide-skip-gap6pxIcon–text gap
--vide-skip-icon-size18pxIcon size

Override example:

css
/* Global — change accent to blue, enlarge buttons */
:root {
  --vide-accent: #3b82f6;
  --vide-accent-hover: #60a5fa;
  --vide-btn-size: 48px;
  --vide-icon-size: 26px;
}

/* Scoped — per player instance */
#my-player {
  --vide-accent: #10b981;
  --vide-font-size: 14px;
}

State Classes

The root .vide-ui element receives state modifier classes that track player state. Use these for state-driven styling.

ClassActive when
.vide-ui--idleNo source loaded
.vide-ui--loadingSource loading
.vide-ui--readyReady to play
.vide-ui--playingPlaying
.vide-ui--pausedPaused
.vide-ui--bufferingBuffering
.vide-ui--endedPlayback ended
.vide-ui--errorError occurred
.vide-ui--ad-loadingAd loading
.vide-ui--ad-playingAd playing
.vide-ui--ad-pausedAd paused
.vide-ui--autohideControls auto-hidden (mouse idle during playback)
css
/* Custom background when paused */
.vide-ui--paused .vide-controls {
  background: rgba(0, 0, 0, 0.9);
}

/* Dim controls during ad playback */
.vide-ui--ad-playing .vide-controls {
  opacity: 0.6;
}

BEM Classes

The UI does not use Shadow DOM — all classes are global. Target them directly in your CSS.

Core Controls

ClassElement
.vide-controlsBottom controls bar
.vide-playPlay/pause button
.vide-progressProgress bar container
.vide-progress__barPlayed fill
.vide-progress__bufferedBuffered fill
.vide-progress__handleSeek handle
.vide-progress--draggingDuring seek drag
.vide-progress--disabledDisabled (during ads)
.vide-timeTime display
.vide-time__separator"/" separator
.vide-volumeVolume control container
.vide-volume__buttonMute toggle
.vide-volume__sliderSlider track area
.vide-volume__trackBackground track
.vide-volume__filledFill level
.vide-fullscreenFullscreen button

Overlays

ClassElement
.vide-bigplayCentered play button
.vide-clickplayClick-to-play/pause area
.vide-loaderLoading overlay
.vide-loader__spinnerSpinner
.vide-errorError overlay
.vide-posterPoster overlay
.vide-poster__imagePoster <img>

Ad Components

ClassElement
.vide-adAd layer container
.vide-ad-overlayClick-through overlay
.vide-ad-label"Ad" label chip
.vide-ad-countdownRemaining time chip
.vide-skipSkip button
.vide-skip--disabledSkip button before skipOffset
.vide-ad-ctaCompanion CTA card
.vide-ad-cta__iconCTA icon
.vide-ad-cta__titleCTA title
.vide-ad-cta__urlCTA URL

Full theme example:

css
:root {
  --vide-accent: #a78bfa;
  --vide-accent-hover: #c4b5fd;
  --vide-bg: rgba(15, 15, 20, 0.9);
  --vide-radius: 8px;
}

.vide-progress__bar {
  border-radius: 4px;
}

.vide-bigplay {
  background: rgba(15, 15, 20, 0.7);
  backdrop-filter: blur(8px);
}

Notes

  • The UI plugin does not render into a Shadow DOM — styles are global.
  • Keyboard shortcuts: Space (play/pause), Left/Right (seek ±5s), Up/Down (volume), M (mute), F (fullscreen), 0-9 (seek to percentage).
  • Touch: click/double-click handling for play/pause and fullscreen on mobile.
  • Size: 5.3 KB gzip (JS), 3.5 KB gzip (theme.css).