Skip to content

Commit b87714f

Browse files
authored
feat(video-export): restore video export with hubble.gl (#3367)
* chore: upgrade to deckgl 9.2.11 Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix lint follow up Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix blending Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix geojson layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * more fixes for aggregation layers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix h3 layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * potential fix for issues with geoarrow in point and line layers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix postprocessing effects Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes for light and shadow effect Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * shadow and light effect - restore uniform shadow during the nighttime Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * don't hide line and arc layers when layer type changed Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * restore filters for aggregation layers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix aggregation layers - hightlight outlines Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes for raster tile layer - raster pmtiles related Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes for raster tiles shader modules updates Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * more lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * try to fix CI lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * try to fix CI tests Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * install webgpu Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * try to fix Ci test env setup Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * cont fix setup browser env Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * remove upgrade in examples - not yet released packages Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix more tests Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes for line layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * _resizeRenderBuffers override changes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * revert jupyter loaders bump Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * change luma shader validation logic for raster tile layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * Replaced the injected standalone with a proper UBO-backed shader module Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * unify deckgl type fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix plot container deckGLProps; fix lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * lint again Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * restore test for aggregation layers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix cpu aggregator Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * more error handling for aggregation layers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes to enchanced column draw Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * restore trip layer tests Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix raster tile shader again Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix for pickInfo types Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * postpone patchDeckRendererForPostProcessing Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * minor ts fix Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * add missing effect deps Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ts changes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * more small fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * sync yarn Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix lint again Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix build Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * remove unused hubble.gl from deps Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ts fixes; test fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * minor fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * minor fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ts fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * move gpu constants to constants module Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * raster tile layer - migrate shaders to UBOs Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * raster tile fixes; ts impr Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * remove deprecated blending setter Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * more detailed tests Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * patch pipeline validation only if raster tile layers are created Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fight with any Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * add migration steps to docs Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix: aggregation - infinite config changes; add patch for non-numerical fields in aggregation - not supported in deck 9 Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * update aggr update triggers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix for count to column agg type change (numeric) Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * disable loggin mouse move and hover by default in console Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix tests Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fog effects Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix lint Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * docs updates; typos Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * more docs upd Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix remove shadow effect layer crash Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix surface fog Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix light and shadow image export; remove hubble warnings; hide loading indicator during image export Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix image export - wait for tiled layers Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * enable tile 3d layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * docs update; new install fix Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fog adjuements; note about performance on older hardware Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * update docs; fixes to 3d tile layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ui fixes; to bounds fix Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fixes Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * editable layer + effects -> disable Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * feat: restore hubble video export Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * wms layer fixes for video recorder Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix missing tiles in 3d tile layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * remove excessive comments Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * add missing localization Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * minor follow ups Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> --------- Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
1 parent 0c8c859 commit b87714f

38 files changed

Lines changed: 1868 additions & 25 deletions

jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const config = {
2222
// Some libraries (even if transitive) are transitioning to ESM and need additional transpilation. Relevant issues:
2323
// - tiny-sdf: https://github.com/visgl/deck.gl/issues/7735
2424
transformIgnorePatterns: [
25-
'/node_modules\\/(?!(.*@mapbox\\/tiny-sdf\\.*|@loaders\\.gl|@deck\\.gl|@deck\\.gl-community|@luma\\.gl|preact))',
25+
'/node_modules\\/(?!(.*@mapbox\\/tiny-sdf\\.*|@loaders\\.gl|@deck\\.gl|@deck\\.gl-community|@luma\\.gl|@hubble\\.gl|preact))',
2626
'\\.pnp\\.[^\\/]+$'
2727
]
2828
};

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
"@deck.gl/react": "9.2.11",
235235
"@deck.gl/widgets": "9.2.11",
236236
"@loaders.gl/core": "4.3.4",
237+
"@loaders.gl/compression": "4.3.4",
237238
"@loaders.gl/csv": "4.3.4",
238239
"@loaders.gl/draco": "4.3.4",
239240
"@loaders.gl/gltf": "4.3.4",
@@ -244,8 +245,10 @@
244245
"@loaders.gl/parquet": "4.3.4",
245246
"@loaders.gl/gis": "4.3.4",
246247
"@loaders.gl/schema": "4.3.4",
248+
"@loaders.gl/video": "4.3.4",
247249
"@loaders.gl/wkt": "4.3.4",
248250
"@loaders.gl/wms": "4.3.4",
251+
"@loaders.gl/zip": "4.3.4",
249252
"@luma.gl/constants": "9.2.6",
250253
"@luma.gl/core": "9.2.6",
251254
"@luma.gl/effects": "9.2.6",

src/actions/src/ui-state-actions.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import {createAction} from '@reduxjs/toolkit';
55
import {default as ActionTypes} from './action-types';
6-
import {Merge, ExportImage} from '@kepler.gl/types';
6+
import {Merge, ExportImage, ExportVideo} from '@kepler.gl/types';
77

88
/** TOGGLE_SIDE_PANEL */
99
export type ToggleSidePanelUpdaterAction = {
@@ -314,6 +314,26 @@ export const cleanupExportImage: () => {
314314
type: typeof ActionTypes.CLEANUP_EXPORT_IMAGE;
315315
} = createAction(ActionTypes.CLEANUP_EXPORT_IMAGE);
316316

317+
/** SET_EXPORT_VIDEO_SETTING */
318+
export type SetExportVideoSettingUpdaterAction = {
319+
payload: Partial<ExportVideo>;
320+
};
321+
/**
322+
* Set `exportVideo` settings: mediaType, cameraPreset, fileName, resolution, durationMs
323+
* @memberof uiStateActions
324+
* @param newSetting - {mediaType: 'webm'}
325+
* @public
326+
*/
327+
export const setExportVideoSetting: (
328+
newSetting: SetExportVideoSettingUpdaterAction['payload']
329+
) => Merge<
330+
SetExportVideoSettingUpdaterAction,
331+
{type: typeof ActionTypes.SET_EXPORT_VIDEO_SETTING}
332+
> = createAction(
333+
ActionTypes.SET_EXPORT_VIDEO_SETTING,
334+
(newSetting: SetExportVideoSettingUpdaterAction['payload']) => ({payload: newSetting})
335+
);
336+
317337
/** SET_EXPORT_SELECTED_DATASET */
318338
export type SetExportSelectedDatasetUpdaterAction = {
319339
payload: string;

src/components/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
"@dnd-kit/utilities": "^3.2.2",
4141
"@emotion/is-prop-valid": "^1.2.1",
4242
"@floating-ui/react": "0.25.1",
43+
"@hubble.gl/core": "2.0.0-alpha.4",
44+
"@hubble.gl/react": "2.0.0-alpha.4",
4345
"@kepler.gl/actions": "3.3.0-alpha.0",
4446
"@kepler.gl/cloud-providers": "3.3.0-alpha.0",
4547
"@kepler.gl/common-utils": "3.3.0-alpha.0",
@@ -91,6 +93,7 @@
9193
"lodash": "4.17.21",
9294
"mapbox-gl": "1.13.1",
9395
"maplibre-gl": "^3.6.2",
96+
"maplibregl-mapbox-request-transformer": "^0.0.2",
9497
"markdown-to-jsx": "^7.7.6",
9598
"mjolnir.js": "^3.0.0",
9699
"moment": "^2.10.6",

src/components/src/bottom-widget.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import React, {forwardRef, useMemo, useCallback} from 'react';
55
import styled, {withTheme, IStyledComponent} from 'styled-components';
66

7-
import {FILTER_VIEW_TYPES} from '@kepler.gl/constants';
7+
import {FILTER_VIEW_TYPES, EXPORT_VIDEO_ID} from '@kepler.gl/constants';
88
import {hasPortableWidth, isSideFilter, mergeFilterWithTimeline} from '@kepler.gl/utils';
99
import {media, breakPointValues} from '@kepler.gl/styles';
1010
import {TimeRangeFilter} from '@kepler.gl/types';
@@ -76,6 +76,7 @@ export default function BottomWidgetFactory(
7676
datasets,
7777
filters,
7878
animationConfig,
79+
toggleModal,
7980
visStateActions,
8081
containerW,
8182
uiState,
@@ -145,6 +146,8 @@ export default function BottomWidgetFactory(
145146
[filter, animationConfig]
146147
);
147148

149+
const exportAnimation = useCallback(() => toggleModal(EXPORT_VIDEO_ID), [toggleModal]);
150+
148151
const onClose = useCallback(
149152
() => visStateActions.setFilterView(enlargedFilterIdx, FILTER_VIEW_TYPES.side),
150153
[visStateActions, enlargedFilterIdx]
@@ -179,6 +182,7 @@ export default function BottomWidgetFactory(
179182
<LayerAnimationControl
180183
updateAnimationSpeed={visStateActions.updateLayerAnimationSpeed}
181184
toggleAnimation={visStateActions.toggleLayerAnimation}
185+
exportAnimation={exportAnimation}
182186
isAnimatable={!animatedFilter}
183187
isAnimating={isAnimating}
184188
resetAnimation={resetAnimation}
@@ -211,6 +215,7 @@ export default function BottomWidgetFactory(
211215
setFilterAnimationWindow={visStateActions.setFilterAnimationWindow}
212216
setFilterSyncTimelineMode={visStateActions.setTimeFilterSyncTimelineMode}
213217
toggleAnimation={visStateActions.toggleFilterAnimation}
218+
exportAnimation={exportAnimation}
214219
updateAnimationSpeed={visStateActions.updateFilterAnimationSpeed}
215220
resetAnimation={resetAnimation}
216221
isAnimatable={!animationConfig || !animationConfig.isAnimating}

src/components/src/common/animation-control/animation-control.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export type AnimationControlProps = {
7575
updateAnimationSpeed?: (val: number) => void;
7676
setAnimationWindow?: (id: string) => void;
7777
toggleAnimation: () => void;
78+
exportAnimation?: () => void;
7879
resetAnimation?: () => void;
7980
setTimelineValue: (value: number[]) => void;
8081
showTimeDisplay?: boolean;
@@ -105,6 +106,7 @@ function AnimationControlFactory(
105106
toggleAnimation = () => {
106107
return;
107108
},
109+
exportAnimation,
108110
updateAnimationSpeed = () => {
109111
return;
110112
},
@@ -143,6 +145,7 @@ function AnimationControlFactory(
143145
isAnimating={isAnimating}
144146
pauseAnimation={toggleAnimation}
145147
resetAnimation={resetAnimation}
148+
exportAnimation={exportAnimation}
146149
speed={speed}
147150
updateAnimationSpeed={updateAnimationSpeed}
148151
setFilterAnimationWindow={setAnimationWindow}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-License-Identifier: MIT
2+
// Copyright contributors to the kepler.gl project
3+
4+
import React from 'react';
5+
import {FormattedMessage} from '@kepler.gl/localization';
6+
import {Tooltip} from '../styled-components';
7+
import IconButton from '../icon-button';
8+
9+
const DELAY_SHOW = 500;
10+
11+
function ExportVideoControlFactory() {
12+
const ExportVideoControl = ({
13+
showAnimationWindowControl,
14+
btnStyle,
15+
buttonHeight,
16+
playbackIcons,
17+
exportAnimation
18+
}) => {
19+
return showAnimationWindowControl || !exportAnimation ? null : (
20+
<IconButton
21+
data-tip
22+
data-for="animate-export"
23+
className="playback-control-button"
24+
onClick={exportAnimation}
25+
{...btnStyle}
26+
>
27+
<playbackIcons.export height={buttonHeight} />
28+
<Tooltip id="animate-export" place="top" delayShow={DELAY_SHOW} effect="solid">
29+
<FormattedMessage id="tooltip.export" />
30+
</Tooltip>
31+
</IconButton>
32+
);
33+
};
34+
35+
return ExportVideoControl;
36+
}
37+
38+
export default ExportVideoControlFactory;

src/components/src/common/animation-control/playback-controls.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import AnimationWindowControlFactory, {AnimationItem} from './animation-window-c
1313
import ResetControlFactory from './reset-control';
1414
import PlayControlFactory from './play-control';
1515
import SpeedControlFactory from './speed-control';
16+
import ExportVideoControlFactory from './export-video-control';
1617
import {BaseComponentProps} from '../../types';
1718

1819
const DEFAULT_BUTTON_HEIGHT = '20px';
@@ -74,6 +75,7 @@ export interface PlaybackControlsProps {
7475
pauseAnimation?: () => void;
7576
resetAnimation?: () => void;
7677
startAnimation: () => void;
78+
exportAnimation?: () => void;
7779
playbackIcons?: Record<string, React.FC<{height: number}>>;
7880
animationItems?: {[key: string]: AnimationItem};
7981
buttonStyle?: string;
@@ -88,22 +90,25 @@ PlaybackControlsFactory.deps = [
8890
WindowActionControlFactory,
8991
AnimationWindowControlFactory,
9092
ResetControlFactory,
91-
PlayControlFactory
93+
PlayControlFactory,
94+
ExportVideoControlFactory
9295
];
9396

9497
function PlaybackControlsFactory(
9598
AnimationSpeedSlider: ReturnType<typeof AnimationSpeedSliderFactory>,
9699
WindowActionControl,
97100
AnimationWindowControl,
98101
ResetControl,
99-
PlayControl
102+
PlayControl,
103+
ExportVideoControl
100104
) {
101105
const PLAYBACK_CONTROLS_DEFAULT_ACTION_COMPONENTS = [
102106
PlayControl,
103107
SpeedControlFactory(AnimationSpeedSlider),
104108
ResetControl,
105109
WindowActionControl,
106-
AnimationWindowControl
110+
AnimationWindowControl,
111+
ExportVideoControl
107112
];
108113

109114
// eslint-disable-next-line complexity
@@ -119,6 +124,7 @@ function PlaybackControlsFactory(
119124
pauseAnimation = nop,
120125
resetAnimation = nop,
121126
startAnimation = nop,
127+
exportAnimation,
122128
playbackIcons = DEFAULT_ICONS,
123129
animationItems = DEFAULT_ANIMATE_ITEMS,
124130
buttonStyle = 'secondary',
@@ -168,6 +174,7 @@ function PlaybackControlsFactory(
168174
pauseAnimation={pauseAnimation}
169175
resetAnimation={resetAnimation}
170176
startAnimation={startAnimation}
177+
exportAnimation={exportAnimation}
171178
playbackIcons={playbackIcons}
172179
isSpeedControlVisible={isSpeedControlVisible}
173180
speed={speed}

src/components/src/common/time-range-slider.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import AnimationControlFactory from './animation-control/animation-control';
1515
import {BaseComponentProps} from '../types';
1616

1717
const animationControlWidth = 176;
18+
const animationControlExportWidth = 19;
1819

1920
type TimeRangeSliderProps = {
2021
domain?: [number, number];
@@ -36,6 +37,7 @@ type TimeRangeSliderProps = {
3637
animationWindow: string;
3738
resetAnimation?: () => void;
3839
toggleAnimation: () => void;
40+
exportAnimation?: () => void;
3941
updateAnimationSpeed?: (val: number) => void;
4042
setFilterAnimationWindow?: (id: string) => void;
4143
setFilterPlot?: ActionHandler<typeof setFilterPlot>;
@@ -115,6 +117,7 @@ export default function TimeRangeSliderFactory(
115117
updateAnimationSpeed,
116118
setFilterAnimationWindow,
117119
toggleAnimation,
120+
exportAnimation,
118121
onChange,
119122
setFilterPlot,
120123
timeline
@@ -125,12 +128,13 @@ export default function TimeRangeSliderFactory(
125128
() => getTimeBinsForInterval(timeBins, plotType?.interval),
126129
[timeBins, plotType?.interval]
127130
);
131+
const width = animationControlWidth + (exportAnimation ? animationControlExportWidth : 0);
128132

129133
const style = useMemo(
130134
() => ({
131-
width: isEnlarged ? `calc(100% - ${animationControlWidth}px)` : '100%'
135+
width: isEnlarged ? `calc(100% - ${width}px)` : '100%'
132136
}),
133-
[isEnlarged]
137+
[isEnlarged, width]
134138
);
135139

136140
return (
@@ -176,20 +180,22 @@ export default function TimeRangeSliderFactory(
176180
updateAnimationSpeed={updateAnimationSpeed}
177181
setTimelineValue={throttledOnchange}
178182
setAnimationWindow={setFilterAnimationWindow}
183+
exportAnimation={exportAnimation}
179184
showTimeDisplay={false}
180185
timeline={timeline}
181186
/>
182187
)}
183188
{isEnlarged && !isMinified ? (
184189
<PlaybackControls
185190
isAnimatable={isAnimatable}
186-
width={animationControlWidth}
191+
width={width}
187192
speed={speed}
188193
animationWindow={animationWindow}
189194
updateAnimationSpeed={updateAnimationSpeed}
190195
setFilterAnimationWindow={setFilterAnimationWindow}
191196
pauseAnimation={toggleAnimation}
192197
resetAnimation={resetAnimation}
198+
exportAnimation={exportAnimation}
193199
isAnimating={isAnimating}
194200
startAnimation={toggleAnimation}
195201
/>

src/components/src/filters/time-range-filter.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ function TimeRangeFilterFactory(TimeRangeSlider: ReturnType<typeof TimeRangeSlid
5353
setFilterPlot,
5454
isAnimatable,
5555
toggleAnimation,
56+
exportAnimation,
5657
hideTimeTitle,
5758
timeline
5859
}) => (
@@ -61,6 +62,7 @@ function TimeRangeFilterFactory(TimeRangeSlider: ReturnType<typeof TimeRangeSlid
6162
onChange={setFilter}
6263
setFilterPlot={setFilterPlot}
6364
toggleAnimation={toggleAnimation}
65+
exportAnimation={exportAnimation}
6466
isAnimatable={isAnimatable}
6567
hideTimeTitle={hideTimeTitle}
6668
timeline={timeline}

0 commit comments

Comments
 (0)