Skip to content
FrameworkStyle

media-popover

A popover component for displaying contextual content anchored to a trigger

Anatomy

<media-popover>
  <button>Open</button>
  <div>Content</div>
</media-popover>

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.

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 HTML, the media-popover element wraps a trigger (first child button) and popup content (second child). The element manages open/close state and positioning automatically.

Styling

Use CSS custom properties for positioning offsets:

media-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:

media-popover[data-open] .popup {
  display: block;
}
media-popover[data-starting-style] .popup {
  opacity: 0;
}
media-popover[data-ending-style] .popup {
  opacity: 0;
}
media-popover[data-side="top"] {
  transform-origin: bottom center;
}
media-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

<video-player class="video-player">
    <media-container>
        <video
            src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4"
            autoplay
            muted
            playsinline
            loop
        ></video>
        <div class="bar">
            <button type="button" commandfor="popover-demo" class="trigger">Settings</button>
            <media-popover id="popover-demo" class="media-popover">
                <div class="popup">
                    Popover content
                </div>
            </media-popover>
        </div>
    </media-container>
</video-player>

API Reference

media-popover

Props

PropTypeDefaultDetails
align'start' | 'center' | 'end''center'
closeDelaynumber0
closeOnEscapebooleantrue
closeOnOutsideClickbooleantrue
defaultOpenbooleanfalse
delaynumber300
modalboolean | 'trap-focus'false
openbooleanfalse
openOnHoverbooleanfalse
side'top' | 'bottom' | 'left' | 'right''top'

State

State is reflected as data attributes for CSS styling.

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

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