Skip to content
FrameworkStyle

Popover

A popover component for displaying contextual content anchored to a trigger

Import

import { Popover } from '@videojs/react';

Anatomy

<Popover.Root>
  <Popover.Trigger>Open</Popover.Trigger>
  <Popover.Popup>
    <Popover.Arrow />
    Content
  </Popover.Popup>
</Popover.Root>

Behavior

Displays contextual content anchored to a trigger element. By default, opens on click and closes when clicking outside, pressing Escape, or when the trigger loses focus.

Set openOnHover to open on pointer hover instead of click. Use delay and closeDelay to control timing for hover interactions.

Popovers inside a Container join its popup group. Opening one closes any other popover or root menu that is open in the same container. A popover outside the container still opens and closes normally, but it is not coordinated with that group.

The side and align props control the preferred popup placement relative to the trigger. When the preferred side overflows the positioning boundary, the popup uses the opposite side if it has more space.

In React, the component is composed from four parts: Root manages state, Trigger toggles the popover, Popup contains the content, and Arrow renders a directional arrow.

Styling

Use CSS custom properties for positioning offsets:

React renders standard DOM elements. Add a className to style them:

.popover {
  --media-popover-side-offset: 8px;
  --media-popover-align-offset: 0px;
  --media-popover-boundary-offset: 8px;
}

Style based on open state, rendered side, and transition phases. data-side reflects the rendered side and can differ from the preferred side prop after collision handling:

.popover[data-open] .popup {
  display: block;
}
.popover[data-starting-style] .popup {
  opacity: 0;
}
.popover[data-ending-style] .popup {
  opacity: 0;
}
.popover[data-side="top"] {
  transform-origin: bottom center;
}
.popover[data-side="bottom"] {
  transform-origin: top center;
}

Accessibility

The trigger receives aria-expanded reflecting the open state. When modal is set, the popup receives aria-modal="true". Closing via Escape is enabled by default and can be disabled with closeOnEscape={false}.

Examples

Basic Usage

import { Container, createPlayer, Popover } from '@videojs/react';
import { Video, videoFeatures } from '@videojs/react/video';

const { Player } = createPlayer({ features: videoFeatures });

export default function BasicUsage() {
  return (
    <Player>
      <Container className="media-container">
        <Video src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4" autoPlay muted playsInline loop />
        <div className="bar">
          <Popover.Root>
            <Popover.Trigger className="trigger">Settings</Popover.Trigger>
            <Popover.Popup className="popup">
              <Popover.Arrow className="arrow" />
              <div className="content">Popover content</div>
            </Popover.Popup>
          </Popover.Root>
        </div>
      </Container>
    </Player>
  );
}

API Reference

Root

Props

PropTypeDefaultDetails
align'start' | 'center' | 'end''center'
boundary'viewport' | 'container' | string & o...
closeDelaynumber0
closeOnEscapebooleantrue
closeOnOutsideClickbooleantrue
defaultOpenbooleanfalse
delaynumber300
modalboolean | 'trap-focus'false
openbooleanfalse
openOnHoverbooleanfalse
side'top' | 'bottom' | 'left' | 'right''top'

State

State is accessible via the render, className, and style props.

PropertyTypeDetails
transitionStartingboolean
transitionEndingboolean
openboolean
status'idle' | 'starting' | 'ending'
side'top' | 'bottom' | 'left' | 'right'
align'start' | 'center' | 'end'
modalboolean | 'trap-focus'

Data attributes

AttributeTypeDetails
data-open
data-side'top' | 'bottom' | 'left' | 'right'
data-align'start' | 'center' | 'end'

CSS custom properties

VariableDetails
--media-popover-side-offset
--media-popover-align-offset
--media-popover-boundary-offset
--media-popover-anchor-width
--media-popover-anchor-height
--media-popover-available-width
--media-popover-available-height

Arrow

Decorative arrow pointing from the popup toward the trigger. Hidden from assistive technology.

Props

PropTypeDefaultDetails
classNamestring | ((state: PopoverState) => string | undefined)
renderReactElement | ((props: HTMLProps, state: PopoverState) => ReactElement | null)
styleCSSProperties | ((state: PopoverState) => CSSProperties | undefined)

Container for the popover content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback.

PropTypeDefaultDetails
classNamestring | ((state: PopoverState) => string | undefined)
renderReactElement | ((props: HTMLProps, state: PopoverState) => ReactElement | null)
styleCSSProperties | ((state: PopoverState) => CSSProperties | undefined)
AttributeTypeDetails
data-open
data-side'top' | 'bottom' | 'left' | 'right'
data-align'start' | 'center' | 'end'

Trigger

Button that toggles the popover visibility. Renders a <button> element.

Props

PropTypeDefaultDetails
classNamestring | ((state: PopoverState) => string | undefined)
renderReactElement | ((props: HTMLProps, state: PopoverState) => ReactElement | null)
styleCSSProperties | ((state: PopoverState) => CSSProperties | undefined)

Data attributes

AttributeTypeDetails
data-open
data-side'top' | 'bottom' | 'left' | 'right'
data-align'start' | 'center' | 'end'