Search Docs
Loading...
Skip to content

Video Timeline

The video timeline is the editor’s playback and arrangement surface. In this guide we will see how to use the Feature, Component Order, and Actions APIs and engine settings to customize the video timeline.

Video timeline customization showing a multi-track layout, an always-visible transition control, a fixed-height timeline, and a custom Rewind button

10 mins
estimated time
Download
StackBlitz
GitHub

CE.SDK allows you to customize the timeline at runtime: toggle the visibility of the timeline and its buttons, customize the controls bar and its height behavior, and more. The Overview below lists each customization point.

Overview#

The timeline is customized through four APIs, each covered in its own section below:

  • Enable / Disable — enable or disable the timeline and its individual buttons through the Feature API using ly.img.video.timeline.* keys.
  • Order Component APIs — order, add, and remove the timeline buttons through the Component Order API on the ly.img.video.timeline.controls.bar area.
  • Customization Actions — set a fixed height, cap the maximum height or restore the content-hugging default through the timeline.setHeight action.
  • Engine Settings — control track and transition visibility through the timeline/trackVisibility and timeline/transitionControlVisibility settings.

Enable / Disable#

The timeline and its individual controls are governed by the Feature API. Enable or disable the entire family with a glob pattern, or address individual feature keys for finer-grained control.

// The timeline and its parts are gated by the Feature API. Enable the whole
// family with a glob, or enable individual features for finer control.
cesdk.feature.enable('ly.img.video.timeline.*');

Each key toggles a specific part of the timeline:

Feature key Enables
ly.img.video.timeline The timeline surface itself
ly.img.video.timeline.ruler The time ruler above the tracks
ly.img.video.timeline.clips Clip editing on the tracks
ly.img.video.timeline.audio The audio track
ly.img.video.timeline.overlays Overlay tracks
ly.img.video.timeline.addClip The add clip button below the tracks
ly.img.video.timeline.clip.menu The per-clip context menu
ly.img.video.timeline.controls The controls bar base feature
ly.img.video.timeline.controls.bar The controls bar area itself
ly.img.video.timeline.controls.toggle The expand/collapse control
ly.img.video.timeline.controls.playback The play/pause control
ly.img.video.timeline.controls.loop The loop control
ly.img.video.timeline.controls.split The split control
ly.img.video.timeline.controls.background The background color control
ly.img.video.timeline.controls.timelineZoom The zoom control

Order Component APIs#

The controls bar holds the timeline’s buttons — play/pause, split, loop, zoom, and so on. It is a Component Order API area identified by ly.img.video.timeline.controls.bar, and it is gated by the ly.img.video.timeline.controls.bar feature. You register custom components and set the order the same way as for the dock or inspector bar.

First register a custom Rewind button with registerComponent. The builder’s Button takes a label, an icon, and a click handler that seeks playback back to the start.

// Register a custom Rewind button that jumps playback back to the start.
cesdk.ui.registerComponent(
'ly.img.video.timeline.rewind',
({ builder }) => {
builder.Button('rewind', {
label: 'Rewind',
icon: '@imgly/Repeat',
onClick: () => {
engine.block.setPlaybackTime(page, 0);
}
});
}
);

The video editor config already sets a default controls bar order, so you can adjust it in place instead of replacing the whole order. We add the Rewind button to the front with insertOrderComponent and remove the loop control with removeOrderComponent.

// The video editor config already sets a default controls bar order. Add
// the Rewind button to the front and remove the loop control.
cesdk.ui.insertOrderComponent(
{ in: 'ly.img.video.timeline.controls.bar', position: 'start' },
'ly.img.video.timeline.rewind'
);
cesdk.ui.removeOrderComponent({
in: 'ly.img.video.timeline.controls.bar',
match: 'ly.img.video.timeline.loop'
});

Built-in Component IDs#

These IDs are available for the controls bar order, in addition to any custom components you register.

Component ID Description
ly.img.separator Visual divider between components
ly.img.spacer Flexible space that pushes components apart
ly.img.video.timeline.background Timeline background color button
ly.img.video.timeline.split Split the selected clip at the playhead
ly.img.video.timeline.playbackInfo Current time and total duration readout
ly.img.video.timeline.playPause Play/pause toggle
ly.img.video.timeline.loop Loop toggle
ly.img.video.timeline.zoom Timeline zoom controls
ly.img.video.timeline.toggle Expand/collapse the timeline

Add Clip Button#

Below the tracks, the timeline shows an “Add Clip” button that runs the built-in addClip action. The button is gated by the ly.img.video.timeline.addClip feature. Register your own addClip action to control what it opens — here we open the asset library filtered to image and video sources.

// The "Add Clip" button below the tracks runs the built-in `addClip`
// action. Toggle the button with its feature, or register your own action
// to change what the button does.
cesdk.feature.enable('ly.img.video.timeline.addClip');
cesdk.actions.register('addClip', () => {
cesdk.ui.openPanel('//ly.img.panel/assetLibrary', {
payload: {
entries: ['ly.img.image', 'ly.img.video'],
applyAssetContext: { clipType: 'clip' }
}
});
});

Use a custom action to open your own source, an upload flow, or a dialog instead of the default asset library.

Customization Actions#

The timeline’s height is set through the timeline.setHeight action. It accepts a settings object with a height (a value in pixels or 'auto') and a maxHeight in pixels.

// Give the timeline a fixed 320px height. Pass { height: 'auto' } to
// restore the content-hugging default, or add maxHeight to cap how tall
// the auto-growing timeline may get.
cesdk.actions.run('timeline.setHeight', { height: 320 });

By default the timeline grows and shrinks to hug its content. Passing a number as height fixes the timeline at that height, while 'auto' restores the default content-hugging behavior, which starts at 30% of the editor viewport height. Passing a number as maxHeight caps how tall the timeline may get — both when it grows with its content and when it is resized by hand — replacing the built-in limit, so a larger value also allows a taller timeline. In both modes the drag-to-resize handle stays available — dragging sets a manual height, and double-clicking the handle resets it.

Engine Settings#

Two engine settings control timeline visibility. Set them through cesdk.engine.editor.setSetting.

Track Visibility#

The timeline can show all tracks in the scene or collapse to a single row that follows the active track. Set timeline/trackVisibility to 'all' for the full multi-track view, or 'active' for the simplified view.

// Show every track in the timeline. 'active' collapses the timeline to a
// single row showing only the selected track's clips.
cesdk.engine.editor.setSetting('timeline/trackVisibility', 'all');

In our example the scene has a video track and a separate audio track, so 'all' renders both rows. The 'active' value is useful for a compact editor where only the selected track’s clips matter.

Transition Controls#

When two clips sit next to each other on a track, the timeline shows a control between them for editing the transition. By default it appears on hover. Set timeline/transitionControlVisibility to 'always' to keep it visible at all times.

// Keep the transition control between adjacent clips permanently visible
// instead of revealing it only on hover.
cesdk.engine.editor.setSetting(
'timeline/transitionControlVisibility',
'always'
);

The control still hides on “tight” seams where there is no room to draw it. Our example assigns a cross-fade between the first two clips, so the always-visible control has something to render. For creating and configuring the transitions themselves, see Apply Transitions.

API Reference#

Method Purpose
cesdk.feature.enable('ly.img.video.timeline.*') Enable the timeline and its buttons
cesdk.engine.editor.setSetting('timeline/trackVisibility', v) Show all tracks ('all') or the active one ('active')
cesdk.engine.editor.setSetting('timeline/transitionControlVisibility', v) Show transition controls on 'hover' or 'always'
cesdk.actions.run('timeline.setHeight', settings) Set a fixed timeline height and/or a maxHeight cap
cesdk.ui.registerComponent(ids, renderComponent) Register a custom controls bar component
cesdk.ui.setComponentOrder({ in: 'ly.img.video.timeline.controls.bar' }, order) Set the controls bar order
cesdk.ui.getComponentOrder({ in: 'ly.img.video.timeline.controls.bar' }) Read the current controls bar order
cesdk.ui.insertOrderComponent({ in: 'ly.img.video.timeline.controls.bar' }, c) Insert components into the controls bar
cesdk.ui.removeOrderComponent({ in: 'ly.img.video.timeline.controls.bar' }) Remove components from the controls bar
cesdk.actions.run('addClip') Run the built-in add clip action
cesdk.actions.register('addClip', handler) Replace the add clip action behavior
cesdk.feature.enable('ly.img.video.timeline.addClip') Show or hide the add clip button

Next Steps#

Each API used here is covered in depth in its own guide:

  • Feature API — enable, disable, and conditionally toggle editor features.
  • Component Order API — order, insert, update, and remove components in any UI area.
  • Actions API — run and register built-in and custom actions.