@deck.gl-community/timeline-layers 9.2.8 → 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.
Files changed (49) hide show
  1. package/package.json +9 -9
  2. package/src/index.ts +42 -0
  3. package/src/layers/timeline-layer/timeline-collision.ts +51 -0
  4. package/src/layers/timeline-layer/timeline-layer.ts +868 -0
  5. package/src/layers/timeline-layer/timeline-layout.ts +80 -0
  6. package/src/layers/timeline-layer/timeline-types.ts +146 -0
  7. package/src/layers/timeline-layer/timeline-utils.ts +85 -0
  8. package/dist/index.cjs +0 -538
  9. package/dist/index.cjs.map +0 -7
  10. package/dist/index.d.ts +0 -10
  11. package/dist/index.d.ts.map +0 -1
  12. package/dist/index.js +0 -9
  13. package/dist/index.js.map +0 -1
  14. package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.d.ts +0 -23
  15. package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.d.ts.map +0 -1
  16. package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.js +0 -33
  17. package/dist/layers/horizon-graph-layer/horizon-graph-layer-uniforms.js.map +0 -1
  18. package/dist/layers/horizon-graph-layer/horizon-graph-layer.d.ts +0 -38
  19. package/dist/layers/horizon-graph-layer/horizon-graph-layer.d.ts.map +0 -1
  20. package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.d.ts +0 -3
  21. package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.d.ts.map +0 -1
  22. package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.js +0 -53
  23. package/dist/layers/horizon-graph-layer/horizon-graph-layer.fs.js.map +0 -1
  24. package/dist/layers/horizon-graph-layer/horizon-graph-layer.js +0 -138
  25. package/dist/layers/horizon-graph-layer/horizon-graph-layer.js.map +0 -1
  26. package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.d.ts +0 -3
  27. package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.d.ts.map +0 -1
  28. package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.js +0 -24
  29. package/dist/layers/horizon-graph-layer/horizon-graph-layer.vs.js.map +0 -1
  30. package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.d.ts +0 -23
  31. package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.d.ts.map +0 -1
  32. package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.js +0 -100
  33. package/dist/layers/horizon-graph-layer/multi-horizon-graph-layer.js.map +0 -1
  34. package/dist/layers/time-axis-layer.d.ts +0 -56
  35. package/dist/layers/time-axis-layer.d.ts.map +0 -1
  36. package/dist/layers/time-axis-layer.js +0 -78
  37. package/dist/layers/time-axis-layer.js.map +0 -1
  38. package/dist/layers/vertical-grid-layer.d.ts +0 -41
  39. package/dist/layers/vertical-grid-layer.d.ts.map +0 -1
  40. package/dist/layers/vertical-grid-layer.js +0 -43
  41. package/dist/layers/vertical-grid-layer.js.map +0 -1
  42. package/dist/utils/format-utils.d.ts +0 -7
  43. package/dist/utils/format-utils.d.ts.map +0 -1
  44. package/dist/utils/format-utils.js +0 -75
  45. package/dist/utils/format-utils.js.map +0 -1
  46. package/dist/utils/tick-utils.d.ts +0 -10
  47. package/dist/utils/tick-utils.d.ts.map +0 -1
  48. package/dist/utils/tick-utils.js +0 -32
  49. 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
+ }