@deck.gl-community/timeline-layers 9.2.5 → 9.3.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +9 -9
- package/src/index.ts +42 -0
- package/src/layers/timeline-layer/timeline-collision.ts +51 -0
- package/src/layers/timeline-layer/timeline-layer.ts +868 -0
- package/src/layers/timeline-layer/timeline-layout.ts +80 -0
- package/src/layers/timeline-layer/timeline-types.ts +146 -0
- package/src/layers/timeline-layer/timeline-utils.ts +85 -0
- package/dist/index.cjs +0 -538
- package/dist/index.cjs.map +0 -7
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.d.ts +0 -23
- package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.d.ts.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.js +0 -33
- package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.js.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.d.ts +0 -38
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.d.ts.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.d.ts +0 -3
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.d.ts.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.js +0 -53
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.js.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.js +0 -138
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.js.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.d.ts +0 -3
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.d.ts.map +0 -1
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.js +0 -24
- package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.js.map +0 -1
- package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.d.ts +0 -23
- package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.d.ts.map +0 -1
- package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.js +0 -100
- package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.js.map +0 -1
- package/dist/layers/time-axis-layer.d.ts +0 -56
- package/dist/layers/time-axis-layer.d.ts.map +0 -1
- package/dist/layers/time-axis-layer.js +0 -78
- package/dist/layers/time-axis-layer.js.map +0 -1
- package/dist/layers/vertical-grid-layer.d.ts +0 -41
- package/dist/layers/vertical-grid-layer.d.ts.map +0 -1
- package/dist/layers/vertical-grid-layer.js +0 -43
- package/dist/layers/vertical-grid-layer.js.map +0 -1
- package/dist/utils/format-utils.d.ts +0 -7
- package/dist/utils/format-utils.d.ts.map +0 -1
- package/dist/utils/format-utils.js +0 -75
- package/dist/utils/format-utils.js.map +0 -1
- package/dist/utils/tick-utils.d.ts +0 -10
- package/dist/utils/tick-utils.d.ts.map +0 -1
- package/dist/utils/tick-utils.js +0 -32
- package/dist/utils/tick-utils.js.map +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// deck.gl-community
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
// ===== STYLE TYPES =====
|
|
6
|
+
|
|
7
|
+
export type SelectionStyle = {
|
|
8
|
+
selectedClipColor?: [number, number, number, number];
|
|
9
|
+
hoveredClipColor?: [number, number, number, number];
|
|
10
|
+
selectedTrackColor?: [number, number, number, number];
|
|
11
|
+
hoveredTrackColor?: [number, number, number, number];
|
|
12
|
+
selectedLineWidth?: number;
|
|
13
|
+
hoveredLineWidth?: number;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type TimelineLayout = {
|
|
17
|
+
x?: number;
|
|
18
|
+
y?: number;
|
|
19
|
+
width?: number;
|
|
20
|
+
trackHeight?: number;
|
|
21
|
+
trackSpacing?: number;
|
|
22
|
+
showTopAxis?: boolean;
|
|
23
|
+
showBottomAxis?: boolean;
|
|
24
|
+
axisHeight?: number;
|
|
25
|
+
axisTickHeight?: number;
|
|
26
|
+
axisLabelSize?: number;
|
|
27
|
+
showVerticalGrid?: boolean;
|
|
28
|
+
showTrackLabels?: boolean;
|
|
29
|
+
trackLabelWidth?: number;
|
|
30
|
+
scrubberWidth?: number;
|
|
31
|
+
scrubberHandleSize?: number;
|
|
32
|
+
scrubberLabelSize?: number;
|
|
33
|
+
clipPadding?: number;
|
|
34
|
+
clipLabelSize?: number;
|
|
35
|
+
showClipLabels?: boolean;
|
|
36
|
+
clipLabelsMinZoom?: number;
|
|
37
|
+
maxClipLabels?: number;
|
|
38
|
+
backgroundColor?: [number, number, number, number];
|
|
39
|
+
trackBackgroundColor?: [number, number, number, number];
|
|
40
|
+
trackBorderColor?: [number, number, number, number];
|
|
41
|
+
scrubberColor?: [number, number, number, number];
|
|
42
|
+
axisColor?: [number, number, number, number];
|
|
43
|
+
gridColor?: [number, number, number, number];
|
|
44
|
+
selectedClipColor?: [number, number, number, number];
|
|
45
|
+
hoveredClipColor?: [number, number, number, number];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// ===== CONSTANTS =====
|
|
49
|
+
|
|
50
|
+
export const DEFAULT_TIMELINE_LAYOUT: Required<TimelineLayout> = {
|
|
51
|
+
x: 50,
|
|
52
|
+
y: 100,
|
|
53
|
+
width: 800,
|
|
54
|
+
trackHeight: 60,
|
|
55
|
+
trackSpacing: 10,
|
|
56
|
+
showTopAxis: true,
|
|
57
|
+
showBottomAxis: false,
|
|
58
|
+
axisHeight: 30,
|
|
59
|
+
axisTickHeight: 10,
|
|
60
|
+
axisLabelSize: 11,
|
|
61
|
+
showVerticalGrid: true,
|
|
62
|
+
showTrackLabels: true,
|
|
63
|
+
trackLabelWidth: 100,
|
|
64
|
+
scrubberWidth: 3,
|
|
65
|
+
scrubberHandleSize: 16,
|
|
66
|
+
scrubberLabelSize: 10,
|
|
67
|
+
clipPadding: 5,
|
|
68
|
+
clipLabelSize: 10,
|
|
69
|
+
showClipLabels: true,
|
|
70
|
+
clipLabelsMinZoom: 1.5,
|
|
71
|
+
maxClipLabels: 1000,
|
|
72
|
+
backgroundColor: [255, 255, 255, 0],
|
|
73
|
+
trackBackgroundColor: [240, 240, 240, 100],
|
|
74
|
+
trackBorderColor: [200, 200, 200, 255],
|
|
75
|
+
scrubberColor: [255, 69, 0, 255],
|
|
76
|
+
axisColor: [50, 50, 50, 255],
|
|
77
|
+
gridColor: [200, 200, 200, 128],
|
|
78
|
+
selectedClipColor: [255, 255, 0, 220],
|
|
79
|
+
hoveredClipColor: [255, 255, 255, 255]
|
|
80
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// deck.gl-community
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
// ===== CORE DATA TYPES =====
|
|
6
|
+
|
|
7
|
+
export type TimelineClip = {
|
|
8
|
+
id: string | number;
|
|
9
|
+
startMs: number;
|
|
10
|
+
endMs: number;
|
|
11
|
+
color?: [number, number, number, number];
|
|
12
|
+
label?: string;
|
|
13
|
+
subtrackIndex?: number;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type TimelineTrack = {
|
|
18
|
+
id: string | number;
|
|
19
|
+
clips: TimelineClip[];
|
|
20
|
+
visible?: boolean;
|
|
21
|
+
name?: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// ===== INTERNAL DATA TYPES =====
|
|
26
|
+
|
|
27
|
+
/** A clip that has been assigned to a specific subtrack by the collision-detection algorithm */
|
|
28
|
+
export type ClipWithSubtrack = TimelineClip & {
|
|
29
|
+
subtrackIndex: number;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type TrackWithSubtracks = {
|
|
33
|
+
track: TimelineTrack;
|
|
34
|
+
trackIndex: number;
|
|
35
|
+
clips: ClipWithSubtrack[];
|
|
36
|
+
subtrackCount: number;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type TrackPosition = {
|
|
40
|
+
y: number;
|
|
41
|
+
height: number;
|
|
42
|
+
subtrackCount: number;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type TrackBackgroundData = {
|
|
46
|
+
id: string;
|
|
47
|
+
track: TimelineTrack;
|
|
48
|
+
trackIndex: number;
|
|
49
|
+
polygon: [number, number][];
|
|
50
|
+
color: [number, number, number, number];
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export type TrackLabelData = {
|
|
54
|
+
text: string;
|
|
55
|
+
position: [number, number, number];
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export type ClipPolygonData = {
|
|
59
|
+
id: string | number;
|
|
60
|
+
clip: TimelineClip;
|
|
61
|
+
track: TimelineTrack;
|
|
62
|
+
clipIndex: number;
|
|
63
|
+
trackIndex: number;
|
|
64
|
+
subtrackIndex: number;
|
|
65
|
+
polygon: [number, number][];
|
|
66
|
+
color: [number, number, number, number];
|
|
67
|
+
label: string;
|
|
68
|
+
labelPosition: [number, number, number];
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export type ClipLabelData = {
|
|
72
|
+
text: string;
|
|
73
|
+
position: [number, number, number];
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export type SeparatorLineData = {
|
|
77
|
+
sourcePosition: [number, number];
|
|
78
|
+
targetPosition: [number, number];
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export type AxisLineData = {
|
|
82
|
+
sourcePosition: [number, number];
|
|
83
|
+
targetPosition: [number, number];
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export type AxisLabelData = {
|
|
87
|
+
text: string;
|
|
88
|
+
position: [number, number, number];
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export type ScrubberLineData = {
|
|
92
|
+
sourcePosition: [number, number];
|
|
93
|
+
targetPosition: [number, number];
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export type ScrubberHandleData = {
|
|
97
|
+
id: string;
|
|
98
|
+
polygon: [number, number][];
|
|
99
|
+
color: [number, number, number, number];
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export type ScrubberLabelData = {
|
|
103
|
+
text: string;
|
|
104
|
+
position: [number, number, number];
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export type TimelineTick = {
|
|
108
|
+
position: number;
|
|
109
|
+
timeMs: number;
|
|
110
|
+
label: string;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// ===== CALLBACK INFO TYPES =====
|
|
114
|
+
|
|
115
|
+
export type TimelineViewport = {
|
|
116
|
+
startMs?: number;
|
|
117
|
+
endMs?: number;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export type TimelineClipInfo = {
|
|
121
|
+
clip: TimelineClip;
|
|
122
|
+
track: TimelineTrack;
|
|
123
|
+
clipIndex: number;
|
|
124
|
+
trackIndex: number;
|
|
125
|
+
subtrackIndex: number;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export type TimelineTrackInfo = {
|
|
129
|
+
track: TimelineTrack;
|
|
130
|
+
index: number;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export type TimelineScrubberInfo = {
|
|
134
|
+
timeMs: number;
|
|
135
|
+
isDragging: boolean;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export type TimelineViewportInfo = {
|
|
139
|
+
startMs: number;
|
|
140
|
+
endMs: number;
|
|
141
|
+
zoomLevel: number;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// ===== FORMATTER TYPE =====
|
|
145
|
+
|
|
146
|
+
export type TimeAxisLabelFormatter = (timeMs: number) => string;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// deck.gl-community
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {TimeAxisLabelFormatter, TimelineTick} from './timeline-types';
|
|
6
|
+
|
|
7
|
+
// ===== TIME FORMATTERS =====
|
|
8
|
+
|
|
9
|
+
export const timeAxisFormatters = {
|
|
10
|
+
seconds: (timeMs: number): string => `${(timeMs / 1000).toFixed(1)}s`,
|
|
11
|
+
timestamp: (timeMs: number): string => new Date(timeMs).toLocaleTimeString(),
|
|
12
|
+
minutesSeconds: (timeMs: number): string => {
|
|
13
|
+
const totalSeconds = Math.floor(timeMs / 1000);
|
|
14
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
15
|
+
const seconds = totalSeconds % 60;
|
|
16
|
+
return `${minutes}:${seconds.toString().padStart(2, '0')}`;
|
|
17
|
+
},
|
|
18
|
+
hoursMinutesSeconds: (timeMs: number): string => {
|
|
19
|
+
const totalSeconds = Math.floor(timeMs / 1000);
|
|
20
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
21
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
22
|
+
const seconds = totalSeconds % 60;
|
|
23
|
+
return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// ===== TIMELINE HELPERS =====
|
|
28
|
+
|
|
29
|
+
export type GenerateTicksOptions = {
|
|
30
|
+
startMs: number;
|
|
31
|
+
endMs: number;
|
|
32
|
+
timelineX: number;
|
|
33
|
+
timelineWidth: number;
|
|
34
|
+
tickCount: number;
|
|
35
|
+
formatter: TimeAxisLabelFormatter;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Generate timeline axis ticks
|
|
40
|
+
*/
|
|
41
|
+
export function generateTimelineTicks(opts: GenerateTicksOptions): TimelineTick[] {
|
|
42
|
+
const {startMs, endMs, timelineX, timelineWidth, tickCount, formatter} = opts;
|
|
43
|
+
const ticks: TimelineTick[] = [];
|
|
44
|
+
const timeRange = endMs - startMs;
|
|
45
|
+
const step = timeRange / (tickCount - 1);
|
|
46
|
+
|
|
47
|
+
for (let i = 0; i < tickCount; i++) {
|
|
48
|
+
const timeMs = startMs + i * step;
|
|
49
|
+
const position = timelineX + (i / (tickCount - 1)) * timelineWidth;
|
|
50
|
+
const label = formatter(timeMs);
|
|
51
|
+
ticks.push({position, timeMs, label});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return ticks;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Convert canvas/pixel position to time
|
|
59
|
+
*/
|
|
60
|
+
export function positionToTime(
|
|
61
|
+
x: number,
|
|
62
|
+
timelineX: number,
|
|
63
|
+
timelineWidth: number,
|
|
64
|
+
startMs: number,
|
|
65
|
+
endMs: number
|
|
66
|
+
): number {
|
|
67
|
+
const ratio = (x - timelineX) / timelineWidth;
|
|
68
|
+
const clampedRatio = Math.max(0, Math.min(1, ratio));
|
|
69
|
+
return startMs + clampedRatio * (endMs - startMs);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Convert time to canvas/pixel position
|
|
74
|
+
*/
|
|
75
|
+
export function timeToPosition(
|
|
76
|
+
timeMs: number,
|
|
77
|
+
timelineX: number,
|
|
78
|
+
timelineWidth: number,
|
|
79
|
+
startMs: number,
|
|
80
|
+
endMs: number
|
|
81
|
+
): number {
|
|
82
|
+
const timeRatio = (timeMs - startMs) / (endMs - startMs);
|
|
83
|
+
const clampedRatio = Math.max(0, Math.min(1, timeRatio));
|
|
84
|
+
return timelineX + clampedRatio * timelineWidth;
|
|
85
|
+
}
|