Manifest ReferenceVideo

Video Panels

Reference for VideoLayer, VideoVariant, and VideoPoster — playback modes, start triggers, reverse variants, and format 1.1 legacy mapping.

Video panels put motion video inside a panel. Format 1.1 substantially extended video support with playback modes (playMode), start triggers (startMode), reverse-encoded variants for smooth ping-pong, posters, native controls, and work-level defaults. Format 1.0 manifests using the legacy autoplay/loop booleans remain valid — see the legacy mapping below and Versioning.

A video panel consists of:

  • A video asset in the asset catalog (category: "video") with one or more VideoVariants and an optional VideoPoster.
  • A VideoLayer in the panel that references the asset and configures playback. Video layers may appear in panels.<id>.layers[] (as a layer with kind: "video") or in the dedicated panels.<id>.video[] array.

VideoLayer

Defined as $defs/VideoLayer. Extends the shared layer base (LayerCommon — id, z, opacity, visibleIf, transform, etc.; see Layers) with:

PropertyTypeRequiredDefaultDescription
kind"video"Yes—Layer discriminator.
assetIdIdentifierYes—Video asset from the catalog.
playModeenumNo"once"Playback mode (1.1+): once, loop, pingpong, loop-from.
startModeenumNo"on-view"Start trigger (1.1+): on-view, on-hover, on-click.
loopFromMsinteger ≥ 0No—Loop re-entry point in ms; only used with playMode: "loop-from".
mutedbooleanNofalseMute the video's audio.
startAtMsinteger ≥ 0No—Offset into the video where playback begins.
controlsbooleanNofalseShow native video controls (1.1+).
autoplaybooleanNofalseLegacy (1.0). Superseded by startMode.
loopbooleanNofalseLegacy (1.0). Superseded by playMode.

playMode values

ValueBehavior
oncePlay through and freeze on the last frame.
loopPlay from startAtMs to the end, seek back, repeat.
pingpongPlay forward, then backward, then forward, repeating. Prefers a direction: "reverse" VideoVariant for the backward pass; otherwise the player frame-steps backward.
loop-fromPlay once from startAtMs to the end, then loop endlessly from loopFromMs to the end.

For loop-from, the semantic constraint startAtMs <= loopFromMs < asset.durationMs applies. loopFromMs is absolute media time on the video's own timeline (independent of startAtMs). JSON Schema cannot express this cross-field constraint — validate it in application code.

startMode values

ValueBehavior
on-viewStarts when the panel becomes current (panel view) or when the placement enters the viewport (page view).
on-hoverStarts on mouseover. Page view only — falls back to on-click in panel view and on touch devices.
on-clickStarts on click/tap and toggles play/pause thereafter.

In page view, the PanelWave Player plays the visible on-view videos of a page one after another in reading order; each plays one full pass before the next starts. From the player release after 1.2.0, image panels between two videos pause that sequence for their display duration (durationMs, else the reader's autoplay seconds), and hovering or clicking a video that is not playing starts it early (see Reader Interface).

Legacy fields (schema 1.0)

autoplay and loop remain valid and are not deprecated. Consumers apply this mapping at read time; the new fields always win when present:

  • loop: true → playMode: "loop" — only when playMode is absent.
  • autoplay: true → startMode: "on-view"; explicit autoplay: false → startMode: "on-click" — only when startMode is absent.

Work-level defaults

settings.ui provides cascading defaults (work default → per-layer override), used when a layer omits the field (see Settings):

SettingDefaultApplies to
videoPlayModeDefault"once"VideoLayer.playMode
videoStartModeDefault"on-view"VideoLayer.startMode
videoMutedDefaulttrueVideoLayer.muted

VideoVariant

Defined as $defs/VideoVariant — one encode of a video asset inside assets.catalog[].variants[].

PropertyTypeRequiredDefaultDescription
srcstringYes—Source path/URL (may be relative to assets.base.videoBase).
mimestringYes—Must match video/* or application/vnd.apple.mpegurl (HLS).
winteger ≥ 16Yes—Width in pixels.
hinteger ≥ 16Yes—Height in pixels.
fpsnumber ≥ 1No—Frame rate.
codecstringNo—Codec label (e.g. "h264").
streamingbooleanNofalseMarks a streaming (e.g. HLS) variant.
localeLocaleCodeNo—Locale for localized video variants.
direction"forward" | "reverse"No"forward"1.1+. reverse marks a pre-rendered, time-reversed encode (video only, typically without audio) used for smooth pingpong playback.

VideoPoster

Defined as $defs/VideoPoster (1.1+) — an optional poster on the video catalog item, shown before playback starts (click-to-play, reduced-motion presentations).

PropertyTypeRequiredDescription
srcstringYesPoster image source.
mimestringNoMust match image/*.
winteger ≥ 1NoWidth in pixels.
hinteger ≥ 1NoHeight in pixels.

Tracking events

Format 1.1 added four video events to the tracking eventWhitelist: videoPlay, videoPause, videoEnded, videoLoop.

Example

A ping-pong panel with a reverse variant, from the video sample (07_video):

{
  "assets": {
    "catalog": [
      {
        "id": "vid-pingpong",
        "category": "video",
        "alt": { "en-US": "Pendulum swing, forward/backward" },
        "durationMs": 3000,
        "variants": [
          {
            "src": "https://cdn.example.com/video/vid-pingpong-1280x720.mp4",
            "mime": "video/mp4", "w": 1280, "h": 720,
            "fps": 30, "codec": "h264", "direction": "forward"
          },
          {
            "src": "https://cdn.example.com/video/vid-pingpong-1280x720-reverse.mp4",
            "mime": "video/mp4", "w": 1280, "h": 720,
            "fps": 30, "codec": "h264", "direction": "reverse"
          }
        ],
        "poster": {
          "src": "https://cdn.example.com/video/vid-pingpong-poster.jpg",
          "mime": "image/jpeg", "w": 1280, "h": 720
        }
      }
    ]
  },
  "chapters": [
    {
      "id": "ch-1",
      "panels": {
        "p-play-pingpong": {
          "durationMs": 6000,
          "layers": [
            {
              "kind": "video",
              "id": "ly-play-pingpong",
              "assetId": "vid-pingpong",
              "z": 0,
              "muted": true,
              "startAtMs": 0,
              "playMode": "pingpong",
              "startMode": "on-view"
            }
          ]
        }
      },
      "graph": { "entry": "p-play-pingpong", "edges": [{ "from": "p-play-pingpong", "to": "p-play-pingpong" }] }
    }
  ]
}
  • Assets — the video catalog item (AssetCatalogItemVideo)
  • Versioning — what changed in 1.1 and the compatibility guarantees
  • Examples — the 07_video sample covers all play/start modes