@kteneyck/cesium-timeline-angular 0.3.0 → 0.5.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 +59 -2
- package/{dist/fesm2022 → fesm2022}/kteneyck-cesium-timeline-angular.mjs +43 -12
- package/fesm2022/kteneyck-cesium-timeline-angular.mjs.map +1 -0
- package/package.json +17 -23
- package/{dist/types → types}/kteneyck-cesium-timeline-angular.d.ts +7 -3
- package/dist/README.md +0 -869
- package/dist/fesm2022/kteneyck-cesium-timeline-angular.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -123,7 +123,7 @@ Angular components use standalone imports — no NgModule required. Selectors: `
|
|
|
123
123
|
- **Auto-scroll during playback** — visible window pans automatically when the needle reaches 10% from either edge.
|
|
124
124
|
- **Infinite scrolling window** — timeline is not clamped to `startTime`/`endTime`; the window can pan anywhere.
|
|
125
125
|
- **Adaptive tick labels** — label granularity adapts to zoom level: milliseconds → seconds → HH:MM:SS → HH:MM → Month Day → Month Year → Year. Tick dates are shown only when the visible window spans more than 24 hours.
|
|
126
|
-
- **
|
|
126
|
+
- **Configurable timezone** — tick labels and the datetime display can show any IANA timezone (e.g. `"UTC"`, `"America/New_York"`) or the browser's local time. A short abbreviation (e.g. `UTC`, `EST`, `PDT`) is displayed to the right of the date line whenever a non-local timezone is active.
|
|
127
127
|
- **Netflix/Hulu-style controls** — transport buttons (⏮ ◀◀ ▶/⏸ ▶▶ ⏭) always stay centered; speed badge and LIVE button in the left column never cause layout shift.
|
|
128
128
|
- **Conditional start/end buttons** — ⏮ and ⏭ are only rendered when `startTime` and `endTime` props are explicitly provided.
|
|
129
129
|
- **Speed cycling** — FF cycles through `ffSpeeds` (default `2×→4×→8×→16×→32×→1×`); RW cycles through `rwSpeeds` (default `−1×→−2×→−4×→−8×→−16×→−32×`). Both arrays are fully configurable.
|
|
@@ -159,6 +159,7 @@ Angular components use standalone imports — no NgModule required. Selectors: `
|
|
|
159
159
|
| `ffSpeeds` | `number[]` | `[2,4,8,16,32,1]` | Speed steps cycled by the ▶▶ button. Last entry wraps back to first. |
|
|
160
160
|
| `rwSpeeds` | `number[]` | `[1,2,4,8,16,32]` | Absolute-value speed steps cycled by the ◀◀ button (negated internally). |
|
|
161
161
|
| `dateTimeFormat` | `string` | `'MMM DD YYYY HH:mm:ss'` | Token-based format string for the controls datetime display |
|
|
162
|
+
| `timezone` | `string` | browser local | IANA timezone name (e.g. `'UTC'`, `'America/New_York'`) or `'local'` for the browser's timezone. Controls both tick labels and the datetime display. When set, a short abbreviation (e.g. `UTC`, `EST`) appears to the right of the date. |
|
|
162
163
|
| `onDateTimeClick` | `() => void` | — | Called when the user clicks the datetime display. Use to open your own date picker. |
|
|
163
164
|
| `jumpToTime` | `JulianDate \| Date` | — | Set to programmatically jump the timeline to a moment (pans canvas + sets time). |
|
|
164
165
|
| `theme` | `Partial<TimelineTheme>` | `defaultTheme` | Theme overrides (merged with defaults) |
|
|
@@ -229,6 +230,60 @@ const theme = useMemo(() => {
|
|
|
229
230
|
|
|
230
231
|
---
|
|
231
232
|
|
|
233
|
+
## Timezone
|
|
234
|
+
|
|
235
|
+
By default the timeline displays all times in the **browser's local timezone**. Pass the `timezone` prop to use UTC or any [IANA timezone](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) instead.
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
// UTC
|
|
239
|
+
<Timeline clock={viewer.clock} timezone="UTC" ... />
|
|
240
|
+
|
|
241
|
+
// A named IANA zone
|
|
242
|
+
<Timeline clock={viewer.clock} timezone="America/New_York" ... />
|
|
243
|
+
|
|
244
|
+
// Back to local (or simply omit the prop)
|
|
245
|
+
<Timeline clock={viewer.clock} timezone="local" ... />
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Both the **canvas tick labels** and the **control bar datetime display** update to reflect the chosen timezone. When a non-local timezone is active a short abbreviation (e.g. `UTC`, `EST`, `PDT`) is shown to the right of the date line. The abbreviation is DST-aware — it automatically switches between `EST` and `EDT`, `PST` and `PDT`, etc.
|
|
249
|
+
|
|
250
|
+
### `Timezones` constants
|
|
251
|
+
|
|
252
|
+
```tsx
|
|
253
|
+
import { Timezones } from '@kteneyck/cesium-timeline-react';
|
|
254
|
+
|
|
255
|
+
<Timeline timezone={Timezones.UTC} ... /> // "UTC"
|
|
256
|
+
<Timeline timezone={Timezones.LOCAL} ... /> // "local" (default behavior)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### `getTimezoneAbbr` utility
|
|
260
|
+
|
|
261
|
+
Returns the short abbreviation for a given date and timezone, or `null` for local.
|
|
262
|
+
|
|
263
|
+
```tsx
|
|
264
|
+
import { getTimezoneAbbr } from '@kteneyck/cesium-timeline-react';
|
|
265
|
+
|
|
266
|
+
getTimezoneAbbr(new Date(), 'UTC'); // → "UTC"
|
|
267
|
+
getTimezoneAbbr(new Date(), 'America/Chicago'); // → "CDT" or "CST"
|
|
268
|
+
getTimezoneAbbr(new Date()); // → null (local)
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### `formatDateTime` with timezone
|
|
272
|
+
|
|
273
|
+
The `formatDateTime` utility accepts an optional third argument:
|
|
274
|
+
|
|
275
|
+
```tsx
|
|
276
|
+
import { formatDateTime, DateTimeFormats } from '@kteneyck/cesium-timeline-react';
|
|
277
|
+
|
|
278
|
+
formatDateTime(new Date(), DateTimeFormats.ISO, 'UTC');
|
|
279
|
+
// → "2026-02-24 14:04:07" (always in UTC regardless of local browser timezone)
|
|
280
|
+
|
|
281
|
+
formatDateTime(new Date(), DateTimeFormats.DEFAULT, 'America/Los_Angeles');
|
|
282
|
+
// → "Feb 24 2026 06:04:07"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
232
287
|
## DateTime Format
|
|
233
288
|
|
|
234
289
|
The `dateTimeFormat` prop controls the two-line datetime display in the control bar. It accepts a token-based format string.
|
|
@@ -385,7 +440,9 @@ import {
|
|
|
385
440
|
```tsx
|
|
386
441
|
import {
|
|
387
442
|
DateTimeFormats, // Format string presets
|
|
388
|
-
|
|
443
|
+
Timezones, // { LOCAL: 'local', UTC: 'UTC' } convenience constants
|
|
444
|
+
formatDateTime, // Token-based date formatter (date, format, timezone?)
|
|
445
|
+
getTimezoneAbbr, // Short timezone abbreviation for a date (date, timezone?)
|
|
389
446
|
splitForDisplay, // Split format string into time/date parts
|
|
390
447
|
toJulianDate, // Convert Date | JulianDate → JulianDate
|
|
391
448
|
toDate, // Convert Date | JulianDate → Date
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { EventEmitter, ViewChild, Output, Input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import * as Cesium from 'cesium';
|
|
4
|
-
import { splitForDisplay, formatDateTime, MIN_SPAN_MS, MAX_SPAN_MS, drawTimeline, hitTestSwimLane, hitTestLaneLabel, isInSwimLaneRegion, zoomRange, DEFAULT_LANE_HEIGHT, LANE_GAP, totalSwimLaneHeight, TICK_AREA_HEIGHT, SWIM_LANE_SCROLL_SPEED, defaultTheme, toJulianDate } from '@kteneyck/cesium-timeline-core';
|
|
4
|
+
import { splitForDisplay, formatDateTime, getTimezoneAbbr, MIN_SPAN_MS, MAX_SPAN_MS, drawTimeline, hitTestSwimLane, hitTestLaneLabel, isInSwimLaneRegion, zoomRange, DEFAULT_LANE_HEIGHT, LANE_GAP, totalSwimLaneHeight, TICK_AREA_HEIGHT, SWIM_LANE_SCROLL_SPEED, defaultTheme, toJulianDate } from '@kteneyck/cesium-timeline-core';
|
|
5
5
|
export * from '@kteneyck/cesium-timeline-core';
|
|
6
6
|
export { TICK_AREA_HEIGHT } from '@kteneyck/cesium-timeline-core';
|
|
7
7
|
|
|
@@ -10,6 +10,7 @@ class TimelineControlsComponent {
|
|
|
10
10
|
isPlaying = false;
|
|
11
11
|
multiplier = 1;
|
|
12
12
|
dateTimeFormat;
|
|
13
|
+
timezone;
|
|
13
14
|
isLive = false;
|
|
14
15
|
hasStartTime = false;
|
|
15
16
|
hasEndTime = false;
|
|
@@ -36,8 +37,9 @@ class TimelineControlsComponent {
|
|
|
36
37
|
get hasSwimLaneToggle() { return this.swimLanesVisible != null; }
|
|
37
38
|
get timeFormat() { return splitForDisplay(this.dateTimeFormat).timeFormat; }
|
|
38
39
|
get dateFormat() { return splitForDisplay(this.dateTimeFormat).dateFormat; }
|
|
39
|
-
get formattedTime() { return formatDateTime(this.currentTime, this.timeFormat); }
|
|
40
|
-
get formattedDate() { return formatDateTime(this.currentTime, this.dateFormat); }
|
|
40
|
+
get formattedTime() { return formatDateTime(this.currentTime, this.timeFormat, this.timezone); }
|
|
41
|
+
get formattedDate() { return formatDateTime(this.currentTime, this.dateFormat, this.timezone); }
|
|
42
|
+
get timezoneAbbr() { return getTimezoneAbbr(this.currentTime, this.timezone); }
|
|
41
43
|
ngAfterViewInit() {
|
|
42
44
|
const el = this.containerRef?.nativeElement;
|
|
43
45
|
if (!el)
|
|
@@ -51,7 +53,7 @@ class TimelineControlsComponent {
|
|
|
51
53
|
this.ro?.disconnect();
|
|
52
54
|
}
|
|
53
55
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
54
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineControlsComponent, isStandalone: true, selector: "ct-timeline-controls", inputs: { currentTime: "currentTime", isPlaying: "isPlaying", multiplier: "multiplier", dateTimeFormat: "dateTimeFormat", isLive: "isLive", hasStartTime: "hasStartTime", hasEndTime: "hasEndTime", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", theme: "theme", swimLanesVisible: "swimLanesVisible" }, outputs: { dateTimeClick: "dateTimeClick", playPause: "playPause", jumpToStart: "jumpToStart", rewind: "rewind", fastForward: "fastForward", jumpToEnd: "jumpToEnd", jumpToLive: "jumpToLive", resetSpeed: "resetSpeed", toggleSwimLanes: "toggleSwimLanes" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
|
|
56
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineControlsComponent, isStandalone: true, selector: "ct-timeline-controls", inputs: { currentTime: "currentTime", isPlaying: "isPlaying", multiplier: "multiplier", dateTimeFormat: "dateTimeFormat", timezone: "timezone", isLive: "isLive", hasStartTime: "hasStartTime", hasEndTime: "hasEndTime", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", theme: "theme", swimLanesVisible: "swimLanesVisible" }, outputs: { dateTimeClick: "dateTimeClick", playPause: "playPause", jumpToStart: "jumpToStart", rewind: "rewind", fastForward: "fastForward", jumpToEnd: "jumpToEnd", jumpToLive: "jumpToLive", resetSpeed: "resetSpeed", toggleSwimLanes: "toggleSwimLanes" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
|
|
55
57
|
<div
|
|
56
58
|
#container
|
|
57
59
|
[style.display]="isNarrow ? 'flex' : 'grid'"
|
|
@@ -77,8 +79,16 @@ class TimelineControlsComponent {
|
|
|
77
79
|
</div>
|
|
78
80
|
}
|
|
79
81
|
@if (dateFormat) {
|
|
80
|
-
<div
|
|
81
|
-
|
|
82
|
+
<div style="display:flex;align-items:center;gap:6px">
|
|
83
|
+
<span [style.color]="theme.buttonActiveColor" style="font-size:1.15em;letter-spacing:0.03em">
|
|
84
|
+
{{ formattedDate }}
|
|
85
|
+
</span>
|
|
86
|
+
@if (timezoneAbbr) {
|
|
87
|
+
<span
|
|
88
|
+
[style.color]="theme.labelColor"
|
|
89
|
+
style="font-size:1.04em;font-weight:bold;letter-spacing:0.04em;opacity:0.7"
|
|
90
|
+
>{{ timezoneAbbr }}</span>
|
|
91
|
+
}
|
|
82
92
|
</div>
|
|
83
93
|
}
|
|
84
94
|
</div>
|
|
@@ -263,8 +273,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
|
|
|
263
273
|
</div>
|
|
264
274
|
}
|
|
265
275
|
@if (dateFormat) {
|
|
266
|
-
<div
|
|
267
|
-
|
|
276
|
+
<div style="display:flex;align-items:center;gap:6px">
|
|
277
|
+
<span [style.color]="theme.buttonActiveColor" style="font-size:1.15em;letter-spacing:0.03em">
|
|
278
|
+
{{ formattedDate }}
|
|
279
|
+
</span>
|
|
280
|
+
@if (timezoneAbbr) {
|
|
281
|
+
<span
|
|
282
|
+
[style.color]="theme.labelColor"
|
|
283
|
+
style="font-size:1.04em;font-weight:bold;letter-spacing:0.04em;opacity:0.7"
|
|
284
|
+
>{{ timezoneAbbr }}</span>
|
|
285
|
+
}
|
|
268
286
|
</div>
|
|
269
287
|
}
|
|
270
288
|
</div>
|
|
@@ -428,6 +446,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
|
|
|
428
446
|
type: Input
|
|
429
447
|
}], dateTimeFormat: [{
|
|
430
448
|
type: Input
|
|
449
|
+
}], timezone: [{
|
|
450
|
+
type: Input
|
|
431
451
|
}], isLive: [{
|
|
432
452
|
type: Input
|
|
433
453
|
}], hasStartTime: [{
|
|
@@ -479,6 +499,7 @@ class TimelineCanvasComponent {
|
|
|
479
499
|
defaultEndMs;
|
|
480
500
|
theme;
|
|
481
501
|
maxTicks;
|
|
502
|
+
timezone;
|
|
482
503
|
swimLanes;
|
|
483
504
|
showSwimLanes;
|
|
484
505
|
timeChange = new EventEmitter();
|
|
@@ -554,7 +575,7 @@ class TimelineCanvasComponent {
|
|
|
554
575
|
this.draw();
|
|
555
576
|
}
|
|
556
577
|
}
|
|
557
|
-
if (changes['theme'] || changes['maxTicks']) {
|
|
578
|
+
if (changes['theme'] || changes['maxTicks'] || changes['timezone']) {
|
|
558
579
|
this.draw();
|
|
559
580
|
}
|
|
560
581
|
if (changes['swimLanes']) {
|
|
@@ -680,6 +701,7 @@ class TimelineCanvasComponent {
|
|
|
680
701
|
currentMs: this.curMs,
|
|
681
702
|
theme: this.theme,
|
|
682
703
|
maxTicks: this.maxTicks,
|
|
704
|
+
timezone: this.timezone,
|
|
683
705
|
swimLanes: this.swimLanesState,
|
|
684
706
|
showSwimLanes: this.showSwimLanesState,
|
|
685
707
|
scrollTop: this.scrollTop,
|
|
@@ -1087,7 +1109,7 @@ class TimelineCanvasComponent {
|
|
|
1087
1109
|
}
|
|
1088
1110
|
}
|
|
1089
1111
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineCanvasComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
1090
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.10", type: TimelineCanvasComponent, isStandalone: true, selector: "ct-timeline-canvas", inputs: { currentTime: "currentTime", defaultStartMs: "defaultStartMs", defaultEndMs: "defaultEndMs", theme: "theme", maxTicks: "maxTicks", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes" }, outputs: { timeChange: "timeChange", dragStart: "dragStart", dragEnd: "dragEnd", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<canvas #canvas
|
|
1112
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.10", type: TimelineCanvasComponent, isStandalone: true, selector: "ct-timeline-canvas", inputs: { currentTime: "currentTime", defaultStartMs: "defaultStartMs", defaultEndMs: "defaultEndMs", theme: "theme", maxTicks: "maxTicks", timezone: "timezone", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes" }, outputs: { timeChange: "timeChange", dragStart: "dragStart", dragEnd: "dragEnd", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<canvas #canvas
|
|
1091
1113
|
style="width:100%;flex:1;min-height:0;display:block;cursor:default"
|
|
1092
1114
|
(mousedown)="onCanvasMouseDown($event)"
|
|
1093
1115
|
(mousemove)="onCanvasMouseMove($event)"
|
|
@@ -1118,6 +1140,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
|
|
|
1118
1140
|
type: Input
|
|
1119
1141
|
}], maxTicks: [{
|
|
1120
1142
|
type: Input
|
|
1143
|
+
}], timezone: [{
|
|
1144
|
+
type: Input
|
|
1121
1145
|
}], swimLanes: [{
|
|
1122
1146
|
type: Input
|
|
1123
1147
|
}], showSwimLanes: [{
|
|
@@ -1165,6 +1189,7 @@ class TimelineComponent {
|
|
|
1165
1189
|
rwSpeeds = DEFAULT_RW_SPEEDS;
|
|
1166
1190
|
theme;
|
|
1167
1191
|
cssClass;
|
|
1192
|
+
timezone;
|
|
1168
1193
|
swimLanes;
|
|
1169
1194
|
showSwimLanes;
|
|
1170
1195
|
swimLaneTransition = 'animated';
|
|
@@ -1404,7 +1429,7 @@ class TimelineComponent {
|
|
|
1404
1429
|
this.cdr.markForCheck();
|
|
1405
1430
|
}
|
|
1406
1431
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
1407
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineComponent, isStandalone: true, selector: "ct-timeline", inputs: { startTime: "startTime", endTime: "endTime", currentTime: "currentTime", clock: "clock", height: "height", showControls: "showControls", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", enableDrag: "enableDrag", dateTimeFormat: "dateTimeFormat", jumpToTime: "jumpToTime", maxTicks: "maxTicks", ffSpeeds: "ffSpeeds", rwSpeeds: "rwSpeeds", theme: "theme", cssClass: "cssClass", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes", swimLaneTransition: "swimLaneTransition" }, outputs: { timeChange: "timeChange", playPause: "playPause", multiplierChange: "multiplierChange", dateTimeClick: "dateTimeClick", showSwimLanesChange: "showSwimLanesChange", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasComp", first: true, predicate: TimelineCanvasComponent, descendants: true }, { propertyName: "controlsRef", first: true, predicate: ["controlsEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
1432
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineComponent, isStandalone: true, selector: "ct-timeline", inputs: { startTime: "startTime", endTime: "endTime", currentTime: "currentTime", clock: "clock", height: "height", showControls: "showControls", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", enableDrag: "enableDrag", dateTimeFormat: "dateTimeFormat", jumpToTime: "jumpToTime", maxTicks: "maxTicks", ffSpeeds: "ffSpeeds", rwSpeeds: "rwSpeeds", theme: "theme", cssClass: "cssClass", timezone: "timezone", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes", swimLaneTransition: "swimLaneTransition" }, outputs: { timeChange: "timeChange", playPause: "playPause", multiplierChange: "multiplierChange", dateTimeClick: "dateTimeClick", showSwimLanesChange: "showSwimLanesChange", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasComp", first: true, predicate: TimelineCanvasComponent, descendants: true }, { propertyName: "controlsRef", first: true, predicate: ["controlsEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
1408
1433
|
<div
|
|
1409
1434
|
[class]="cssClass"
|
|
1410
1435
|
[style.width]="'100%'"
|
|
@@ -1427,6 +1452,7 @@ class TimelineComponent {
|
|
|
1427
1452
|
[showJumpToStart]="showJumpToStart"
|
|
1428
1453
|
[showJumpToEnd]="showJumpToEnd"
|
|
1429
1454
|
[dateTimeFormat]="dateTimeFormat"
|
|
1455
|
+
[timezone]="timezone"
|
|
1430
1456
|
[theme]="finalTheme"
|
|
1431
1457
|
[swimLanesVisible]="hasSwimLanes ? swimLanesExpanded : undefined"
|
|
1432
1458
|
(playPause)="handlePlayPause($event)"
|
|
@@ -1449,6 +1475,7 @@ class TimelineComponent {
|
|
|
1449
1475
|
[defaultEndMs]="defaultEndMs"
|
|
1450
1476
|
[theme]="finalTheme"
|
|
1451
1477
|
[maxTicks]="maxTicks"
|
|
1478
|
+
[timezone]="timezone"
|
|
1452
1479
|
[swimLanes]="swimLanes"
|
|
1453
1480
|
[showSwimLanes]="swimLanesExpanded"
|
|
1454
1481
|
(timeChange)="handleTimeChange($event)"
|
|
@@ -1462,7 +1489,7 @@ class TimelineComponent {
|
|
|
1462
1489
|
/>
|
|
1463
1490
|
}
|
|
1464
1491
|
</div>
|
|
1465
|
-
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: TimelineControlsComponent, selector: "ct-timeline-controls", inputs: ["currentTime", "isPlaying", "multiplier", "dateTimeFormat", "isLive", "hasStartTime", "hasEndTime", "showJumpToStart", "showJumpToEnd", "theme", "swimLanesVisible"], outputs: ["dateTimeClick", "playPause", "jumpToStart", "rewind", "fastForward", "jumpToEnd", "jumpToLive", "resetSpeed", "toggleSwimLanes"] }, { kind: "component", type: TimelineCanvasComponent, selector: "ct-timeline-canvas", inputs: ["currentTime", "defaultStartMs", "defaultEndMs", "theme", "maxTicks", "swimLanes", "showSwimLanes"], outputs: ["timeChange", "dragStart", "dragEnd", "swimLaneItemClick", "swimLaneItemHover", "swimLaneItemDoubleClick", "swimLaneItemContextMenu", "swimLaneReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1492
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: TimelineControlsComponent, selector: "ct-timeline-controls", inputs: ["currentTime", "isPlaying", "multiplier", "dateTimeFormat", "timezone", "isLive", "hasStartTime", "hasEndTime", "showJumpToStart", "showJumpToEnd", "theme", "swimLanesVisible"], outputs: ["dateTimeClick", "playPause", "jumpToStart", "rewind", "fastForward", "jumpToEnd", "jumpToLive", "resetSpeed", "toggleSwimLanes"] }, { kind: "component", type: TimelineCanvasComponent, selector: "ct-timeline-canvas", inputs: ["currentTime", "defaultStartMs", "defaultEndMs", "theme", "maxTicks", "timezone", "swimLanes", "showSwimLanes"], outputs: ["timeChange", "dragStart", "dragEnd", "swimLaneItemClick", "swimLaneItemHover", "swimLaneItemDoubleClick", "swimLaneItemContextMenu", "swimLaneReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1466
1493
|
}
|
|
1467
1494
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineComponent, decorators: [{
|
|
1468
1495
|
type: Component,
|
|
@@ -1489,6 +1516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
|
|
|
1489
1516
|
[showJumpToStart]="showJumpToStart"
|
|
1490
1517
|
[showJumpToEnd]="showJumpToEnd"
|
|
1491
1518
|
[dateTimeFormat]="dateTimeFormat"
|
|
1519
|
+
[timezone]="timezone"
|
|
1492
1520
|
[theme]="finalTheme"
|
|
1493
1521
|
[swimLanesVisible]="hasSwimLanes ? swimLanesExpanded : undefined"
|
|
1494
1522
|
(playPause)="handlePlayPause($event)"
|
|
@@ -1511,6 +1539,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
|
|
|
1511
1539
|
[defaultEndMs]="defaultEndMs"
|
|
1512
1540
|
[theme]="finalTheme"
|
|
1513
1541
|
[maxTicks]="maxTicks"
|
|
1542
|
+
[timezone]="timezone"
|
|
1514
1543
|
[swimLanes]="swimLanes"
|
|
1515
1544
|
[showSwimLanes]="swimLanesExpanded"
|
|
1516
1545
|
(timeChange)="handleTimeChange($event)"
|
|
@@ -1557,6 +1586,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
|
|
|
1557
1586
|
type: Input
|
|
1558
1587
|
}], cssClass: [{
|
|
1559
1588
|
type: Input
|
|
1589
|
+
}], timezone: [{
|
|
1590
|
+
type: Input
|
|
1560
1591
|
}], swimLanes: [{
|
|
1561
1592
|
type: Input
|
|
1562
1593
|
}], showSwimLanes: [{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kteneyck-cesium-timeline-angular.mjs","sources":["../../src/lib/timeline-controls.component.ts","../../src/lib/timeline-canvas.component.ts","../../src/lib/timeline.component.ts","../../src/public-api.ts","../../src/kteneyck-cesium-timeline-angular.ts"],"sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n formatDateTime,\n getTimezoneAbbr,\n splitForDisplay,\n} from '@kteneyck/cesium-timeline-core';\n\n@Component({\n selector: 'ct-timeline-controls',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n #container\n [style.display]=\"isNarrow ? 'flex' : 'grid'\"\n [style.grid-template-columns]=\"isNarrow ? undefined : '1fr auto 1fr'\"\n [style.align-items]=\"'center'\"\n [style.padding]=\"'6px 16px'\"\n [style.background-color]=\"theme.controlBarBackground\"\n [style.border-bottom]=\"'1px solid ' + theme.controlBarBorder\"\n [style.font-family]=\"'system-ui, -apple-system, sans-serif'\"\n >\n <!-- Left: Datetime + LIVE + speed badge -->\n <div style=\"display:flex;align-items:center;gap:8px;flex-shrink:0\">\n <div\n (click)=\"dateTimeClick.emit()\"\n [title]=\"dateTimeClick.observed ? 'Click to jump to a date/time' : ''\"\n [style.color]=\"theme.labelColor\"\n style=\"font-family:monospace;line-height:1.15;border-radius:4px;padding:2px 4px;transition:background 0.15s\"\n [style.cursor]=\"dateTimeClick.observed ? 'pointer' : 'default'\"\n >\n @if (timeFormat) {\n <div style=\"font-size:2em;font-weight:bold;letter-spacing:0.02em\">\n {{ formattedTime }}\n </div>\n }\n @if (dateFormat) {\n <div style=\"display:flex;align-items:center;gap:6px\">\n <span [style.color]=\"theme.buttonActiveColor\" style=\"font-size:1.15em;letter-spacing:0.03em\">\n {{ formattedDate }}\n </span>\n @if (timezoneAbbr) {\n <span\n [style.color]=\"theme.labelColor\"\n style=\"font-size:1.04em;font-weight:bold;letter-spacing:0.04em;opacity:0.7\"\n >{{ timezoneAbbr }}</span>\n }\n </div>\n }\n </div>\n\n <div style=\"display:flex;flex-direction:column;gap:2px;justify-content:center\">\n <!-- LIVE button -->\n <button\n (click)=\"jumpToLive.emit()\"\n [style.color]=\"isLive ? theme.controlBarBackground : theme.buttonActiveColor\"\n [style.background-color]=\"isLive ? theme.buttonActiveColor : 'transparent'\"\n [style.border-color]=\"theme.buttonActiveColor\"\n [style.opacity]=\"isLive ? 1 : 0.55\"\n style=\"background:none;border:1px solid;cursor:pointer;font-size:11px;font-weight:bold;letter-spacing:0.05em;width:52px;min-width:52px;height:20px;border-radius:3px;display:flex;align-items:center;justify-content:center;padding:0;font-family:system-ui,-apple-system,sans-serif;transition:opacity 0.15s\"\n [title]=\"isLive ? 'Currently live' : 'Jump to live (now)'\"\n >\n {{ isLive ? '● LIVE' : 'LIVE' }}\n </button>\n\n <!-- Speed badge -->\n <div style=\"height:20px;display:flex;align-items:center\">\n @if (!isNormalSpeed) {\n <button\n (click)=\"resetSpeed.emit()\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '44'\"\n style=\"background:none;border:1px solid;cursor:pointer;font-size:11px;width:52px;min-width:52px;height:20px;border-radius:4px;display:flex;align-items:center;justify-content:center;padding:0;font-family:system-ui,-apple-system,sans-serif;transition:background-color 0.15s\"\n title=\"Reset to 1× speed\"\n >\n {{ isRewinding ? '◀ ' + absMultiplier + '×' : absMultiplier + '× ▶' }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Center: Transport buttons -->\n <div\n style=\"display:flex;align-items:center;gap:2px\"\n [style.flex]=\"isNarrow ? '1' : undefined\"\n [style.justify-content]=\"isNarrow ? 'center' : undefined\"\n >\n @if (showJumpToStart !== false) {\n <button\n (click)=\"hasStartTime && jumpToStart.emit()\"\n [disabled]=\"!hasStartTime\"\n [style.color]=\"theme.buttonColor\"\n [style.opacity]=\"hasStartTime ? 1 : 0.3\"\n [style.cursor]=\"hasStartTime ? 'pointer' : 'default'\"\n class=\"ct-btn\"\n [title]=\"hasStartTime ? 'Jump to start' : 'No start time set'\"\n >⏮</button>\n }\n\n <button\n (click)=\"rewind.emit()\"\n [style.color]=\"isRewinding ? theme.buttonActiveColor : theme.buttonColor\"\n [style.border-color]=\"isRewinding ? theme.buttonActiveColor + '33' : 'transparent'\"\n class=\"ct-btn ct-btn-wide\"\n [title]=\"isRewinding ? 'Reverse ' + absMultiplier + '× — click to speed up' : 'Rewind'\"\n >\n @if (isRewinding) {\n <span style=\"font-size:11px;font-weight:bold\">{{ absMultiplier }}×</span>◀◀\n } @else {\n ◀◀\n }\n </button>\n\n <button\n (click)=\"playPause.emit(!isPlaying)\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '55'\"\n [style.padding-left]=\"isPlaying ? '0' : '2px'\"\n class=\"ct-btn ct-btn-play\"\n [title]=\"isPlaying ? 'Pause' : (isRewinding ? 'Play (reset to 1×)' : 'Play')\"\n >\n @if (isPlaying) {\n <svg width=\"14\" height=\"16\" viewBox=\"0 0 14 16\" fill=\"currentColor\">\n <rect x=\"1\" y=\"0\" width=\"4\" height=\"16\" rx=\"1\"/>\n <rect x=\"9\" y=\"0\" width=\"4\" height=\"16\" rx=\"1\"/>\n </svg>\n } @else {\n ▶\n }\n </button>\n\n <button\n (click)=\"fastForward.emit()\"\n [style.color]=\"isFastForward ? theme.buttonActiveColor : theme.buttonColor\"\n [style.border-color]=\"isFastForward ? theme.buttonActiveColor + '33' : 'transparent'\"\n class=\"ct-btn ct-btn-wide\"\n [title]=\"isFastForward ? absMultiplier + '× speed — click to increase' : 'Fast forward'\"\n >\n @if (isFastForward) {\n ▶▶<span style=\"font-size:11px;font-weight:bold\">{{ absMultiplier }}×</span>\n } @else {\n ▶▶\n }\n </button>\n\n @if (showJumpToEnd !== false) {\n <button\n (click)=\"hasEndTime && jumpToEnd.emit()\"\n [disabled]=\"!hasEndTime\"\n [style.color]=\"theme.buttonColor\"\n [style.opacity]=\"hasEndTime ? 1 : 0.3\"\n [style.cursor]=\"hasEndTime ? 'pointer' : 'default'\"\n class=\"ct-btn\"\n [title]=\"hasEndTime ? 'Jump to end' : 'No end time set'\"\n >⏭</button>\n }\n </div>\n\n <!-- Right: swim-lane toggle -->\n @if (!isNarrow) {\n <div style=\"display:flex;justify-content:flex-end;align-items:center\">\n @if (hasSwimLaneToggle) {\n <button\n (click)=\"toggleSwimLanes.emit()\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '33'\"\n class=\"ct-btn\"\n [title]=\"swimLanesVisible ? 'Collapse swim lanes' : 'Expand swim lanes'\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n @if (swimLanesVisible) {\n <polyline points=\"3,5 7,9 11,5\"/>\n } @else {\n <polyline points=\"3,9 7,5 11,9\"/>\n }\n </svg>\n </button>\n }\n </div>\n }\n\n @if (isNarrow && hasSwimLaneToggle) {\n <button\n (click)=\"toggleSwimLanes.emit()\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '33'\"\n class=\"ct-btn\"\n style=\"margin-left:4px\"\n [title]=\"swimLanesVisible ? 'Collapse swim lanes' : 'Expand swim lanes'\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n @if (swimLanesVisible) {\n <polyline points=\"3,5 7,9 11,5\"/>\n } @else {\n <polyline points=\"3,9 7,5 11,9\"/>\n }\n </svg>\n </button>\n }\n </div>\n `,\n styles: [`\n :host { display: block; }\n .ct-btn {\n background: none;\n border: 1px solid transparent;\n cursor: pointer;\n font-size: 16px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n width: 32px;\n height: 32px;\n border-radius: 4px;\n transition: background-color 0.15s, color 0.15s;\n font-family: system-ui, -apple-system, sans-serif;\n flex-shrink: 0;\n line-height: 1;\n }\n .ct-btn:hover { background-color: rgba(255,255,255,0.1); }\n .ct-btn-wide { width: 64px; min-width: 64px; gap: 3px; }\n .ct-btn-play {\n font-size: 18px;\n width: 40px;\n min-width: 40px;\n height: 40px;\n border-radius: 50%;\n }\n `],\n})\nexport class TimelineControlsComponent implements AfterViewInit, OnDestroy {\n @Input() currentTime!: Cesium.JulianDate;\n @Input() isPlaying = false;\n @Input() multiplier = 1;\n @Input() dateTimeFormat?: string;\n @Input() timezone?: string;\n @Input() isLive = false;\n @Input() hasStartTime = false;\n @Input() hasEndTime = false;\n @Input() showJumpToStart?: boolean;\n @Input() showJumpToEnd?: boolean;\n @Input() theme!: TimelineTheme;\n @Input() swimLanesVisible?: boolean;\n\n @Output() dateTimeClick = new EventEmitter<void>();\n @Output() playPause = new EventEmitter<boolean>();\n @Output() jumpToStart = new EventEmitter<void>();\n @Output() rewind = new EventEmitter<void>();\n @Output() fastForward = new EventEmitter<void>();\n @Output() jumpToEnd = new EventEmitter<void>();\n @Output() jumpToLive = new EventEmitter<void>();\n @Output() resetSpeed = new EventEmitter<void>();\n @Output() toggleSwimLanes = new EventEmitter<void>();\n\n @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n\n isNarrow = false;\n private ro?: ResizeObserver;\n\n get isRewinding(): boolean { return this.multiplier < 0; }\n get isFastForward(): boolean { return this.multiplier > 1; }\n get isNormalSpeed(): boolean { return this.multiplier === 1; }\n get absMultiplier(): number { return Math.abs(this.multiplier); }\n get hasSwimLaneToggle(): boolean { return this.swimLanesVisible != null; }\n\n get timeFormat(): string { return splitForDisplay(this.dateTimeFormat).timeFormat; }\n get dateFormat(): string { return splitForDisplay(this.dateTimeFormat).dateFormat; }\n get formattedTime(): string { return formatDateTime(this.currentTime, this.timeFormat, this.timezone); }\n get formattedDate(): string { return formatDateTime(this.currentTime, this.dateFormat, this.timezone); }\n get timezoneAbbr(): string | null { return getTimezoneAbbr(this.currentTime, this.timezone); }\n\n ngAfterViewInit(): void {\n const el = this.containerRef?.nativeElement;\n if (!el) return;\n this.ro = new ResizeObserver(([entry]) => {\n this.isNarrow = entry.contentRect.width < 520;\n });\n this.ro.observe(el);\n }\n\n ngOnDestroy(): void {\n this.ro?.disconnect();\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n NgZone,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n type SwimLane,\n type SwimLaneItem,\n type SwimLaneEventInfo,\n type ReorderState,\n DEFAULT_LANE_HEIGHT,\n TICK_AREA_HEIGHT,\n LANE_GAP,\n SWIM_LANE_SCROLL_SPEED,\n MIN_SPAN_MS,\n MAX_SPAN_MS,\n drawTimeline,\n hitTestSwimLane as coreHitTestSwimLane,\n hitTestLaneLabel as coreHitTestLaneLabel,\n isInSwimLaneRegion as coreIsInSwimLaneRegion,\n zoomRange,\n totalSwimLaneHeight,\n} from '@kteneyck/cesium-timeline-core';\n\nexport { TICK_AREA_HEIGHT };\n\n/**\n * TimelineCanvasComponent – Angular wrapper around the core canvas rendering engine.\n *\n * All mutable state lives as class properties (equivalent to React refs) — no\n * change detection cycles are triggered from drawing or mouse handlers.\n * The core drawTimeline() function handles all rendering.\n */\n@Component({\n selector: 'ct-timeline-canvas',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<canvas #canvas\n style=\"width:100%;flex:1;min-height:0;display:block;cursor:default\"\n (mousedown)=\"onCanvasMouseDown($event)\"\n (mousemove)=\"onCanvasMouseMove($event)\"\n (click)=\"onCanvasClick($event)\"\n (dblclick)=\"onCanvasDblClick($event)\"\n (contextmenu)=\"onCanvasContextMenu($event)\"\n (mouseleave)=\"onCanvasMouseLeave()\"\n ></canvas>`,\n styles: [`:host { display: flex; flex: 1; min-height: 0; }`],\n})\nexport class TimelineCanvasComponent implements AfterViewInit, OnChanges, OnDestroy {\n @Input() currentTime!: Cesium.JulianDate;\n @Input() defaultStartMs!: number;\n @Input() defaultEndMs!: number;\n @Input() theme!: TimelineTheme;\n @Input() maxTicks?: number;\n @Input() timezone?: string;\n @Input() swimLanes?: SwimLane[];\n @Input() showSwimLanes?: boolean;\n\n @Output() timeChange = new EventEmitter<Cesium.JulianDate>();\n @Output() dragStart = new EventEmitter<void>();\n @Output() dragEnd = new EventEmitter<void>();\n @Output() swimLaneItemClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemHover = new EventEmitter<SwimLaneEventInfo | null>();\n @Output() swimLaneItemDoubleClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemContextMenu = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneReorder = new EventEmitter<string[]>();\n\n @ViewChild('canvas') canvasRef!: ElementRef<HTMLCanvasElement>;\n\n // ── Mutable render state (equivalent to React refs) ────────────────────\n private startMs = 0;\n private endMs = 0;\n private curMs = 0;\n private scrollTop = 0;\n private swimLanesState: SwimLane[] = [];\n private showSwimLanesState = false;\n private hoveredItem: { lane: SwimLane; item: SwimLaneItem } | null = null;\n private reorderState: ReorderState | null = null;\n\n // Mouse state\n private mouseMode: 'none' | 'scrub' | 'slide' | 'zoom' = 'none';\n private mouseX = 0;\n private scrubClientX = 0;\n private swimLaneDownTime = 0;\n\n // Touch state\n private touchMode: 'none' | 'scrub' | 'slide' | 'pinch' = 'none';\n private touchX = 0;\n private pinchDist = 0;\n\n // Edge-scroll animation\n private edgeRAF: number | null = null;\n\n // Follow-scroll (playback auto-scroll)\n private followRAF: number | null = null;\n private following = false;\n private followRate = 0;\n\n private ro?: ResizeObserver;\n\n // Bound handlers for cleanup\n private boundMouseMove = this.onDocMouseMove.bind(this);\n private boundMouseUp = this.onDocMouseUp.bind(this);\n private boundTouchStart = this.onTouchStart.bind(this);\n private boundTouchMove = this.onTouchMove.bind(this);\n private boundTouchEnd = this.onTouchEnd.bind(this);\n private boundWheel = this.onWheel.bind(this);\n\n constructor(private ngZone: NgZone) {}\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n ngAfterViewInit(): void {\n this.startMs = this.defaultStartMs;\n this.endMs = this.defaultEndMs;\n this.curMs = Cesium.JulianDate.toDate(this.currentTime).getTime();\n this.swimLanesState = this.swimLanes ?? [];\n this.showSwimLanesState = this.showSwimLanes ?? (this.swimLanesState.length > 0);\n\n // Run outside Angular zone for performance — no change detection on draw/mouse\n this.ngZone.runOutsideAngular(() => {\n this.draw();\n\n const canvas = this.canvasRef.nativeElement;\n this.ro = new ResizeObserver(() => this.draw());\n this.ro.observe(canvas);\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n canvas.addEventListener('wheel', this.boundWheel, { passive: false });\n canvas.addEventListener('touchstart', this.boundTouchStart, { passive: false });\n canvas.addEventListener('touchmove', this.boundTouchMove, { passive: false });\n canvas.addEventListener('touchend', this.boundTouchEnd, { passive: false });\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['currentTime'] && !this.following) {\n const newMs = Cesium.JulianDate.toDate(this.currentTime).getTime();\n if (this.curMs !== newMs) {\n this.curMs = newMs;\n this.draw();\n }\n }\n if (changes['theme'] || changes['maxTicks'] || changes['timezone']) {\n this.draw();\n }\n if (changes['swimLanes']) {\n this.swimLanesState = this.swimLanes ?? [];\n this.draw();\n }\n if (changes['showSwimLanes']) {\n this.showSwimLanesState = this.showSwimLanes ?? (this.swimLanesState.length > 0);\n this.draw();\n }\n }\n\n ngOnDestroy(): void {\n this.ro?.disconnect();\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) {\n canvas.removeEventListener('wheel', this.boundWheel);\n canvas.removeEventListener('touchstart', this.boundTouchStart);\n canvas.removeEventListener('touchmove', this.boundTouchMove);\n canvas.removeEventListener('touchend', this.boundTouchEnd);\n }\n\n if (this.edgeRAF !== null) cancelAnimationFrame(this.edgeRAF);\n if (this.followRAF !== null) cancelAnimationFrame(this.followRAF);\n }\n\n // ── Public API (called by parent via ViewChild) ────────────────────────\n\n zoomTo(startMs: number, endMs: number, currentMs?: number): void {\n const span = Math.max(MIN_SPAN_MS, Math.min(MAX_SPAN_MS, endMs - startMs));\n const center = (startMs + endMs) / 2;\n this.startMs = center - span / 2;\n this.endMs = center + span / 2;\n if (currentMs !== undefined) this.curMs = currentMs;\n this.draw();\n }\n\n getVisibleRange(): { startMs: number; endMs: number } {\n return { startMs: this.startMs, endMs: this.endMs };\n }\n\n startFollow(rate: number): void {\n this.followRate = rate;\n if (this.followRAF !== null) return;\n this.following = true;\n let lastTime = performance.now();\n\n const scroll = () => {\n const now = performance.now();\n const dt = now - lastTime;\n lastTime = now;\n const shift = dt * this.followRate;\n this.startMs += shift;\n this.endMs += shift;\n this.curMs += shift;\n this.draw();\n this.followRAF = requestAnimationFrame(scroll);\n };\n this.followRAF = requestAnimationFrame(scroll);\n }\n\n stopFollow(): void {\n this.following = false;\n if (this.followRAF !== null) {\n cancelAnimationFrame(this.followRAF);\n this.followRAF = null;\n }\n }\n\n correctFollow(currentMs: number): void {\n if (!this.following) return;\n const drift = currentMs - this.curMs;\n this.curMs = currentMs;\n this.startMs += drift;\n this.endMs += drift;\n }\n\n appendSwimLane(lane: SwimLane): void {\n this.swimLanesState = [...this.swimLanesState, lane];\n this.draw();\n }\n\n updateSwimLane(id: string, updates: Partial<SwimLane>): void {\n this.swimLanesState = this.swimLanesState.map(l =>\n l.id === id ? { ...l, ...updates, id: l.id } : l\n );\n this.draw();\n }\n\n removeSwimLane(id: string): void {\n this.swimLanesState = this.swimLanesState.filter(l => l.id !== id);\n this.draw();\n }\n\n reorderSwimLanes(orderedIds: string[]): void {\n const byId = new Map(this.swimLanesState.map(l => [l.id, l]));\n const reordered: SwimLane[] = [];\n for (const id of orderedIds) {\n const lane = byId.get(id);\n if (lane) reordered.push(lane);\n }\n this.swimLanesState = reordered;\n this.draw();\n }\n\n // ── Core draw ──────────────────────────────────────────────────────────\n\n private draw(): void {\n const canvas = this.canvasRef?.nativeElement;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const rect = canvas.getBoundingClientRect();\n const w = rect.width;\n const h = rect.height;\n if (w === 0 || h === 0) return;\n\n const dpr = window.devicePixelRatio || 1;\n const physW = Math.round(w * dpr);\n const physH = Math.round(h * dpr);\n if (canvas.width !== physW || canvas.height !== physH) {\n canvas.width = physW;\n canvas.height = physH;\n }\n\n ctx.save();\n ctx.scale(dpr, dpr);\n\n const clampedScrollTop = drawTimeline(ctx, w, h, {\n startMs: this.startMs,\n endMs: this.endMs,\n currentMs: this.curMs,\n theme: this.theme,\n maxTicks: this.maxTicks,\n timezone: this.timezone,\n swimLanes: this.swimLanesState,\n showSwimLanes: this.showSwimLanesState,\n scrollTop: this.scrollTop,\n reorderState: this.reorderState,\n });\n\n if (clampedScrollTop !== this.scrollTop) {\n this.scrollTop = clampedScrollTop;\n }\n\n ctx.restore();\n }\n\n // ── Hit testing (delegates to core) ────────────────────────────────────\n\n private hitTestSwimLane(x: number, y: number, w: number, h: number) {\n return coreHitTestSwimLane(x, y, w, h, {\n startMs: this.startMs, endMs: this.endMs,\n theme: this.theme,\n swimLanes: this.swimLanesState, showSwimLanes: this.showSwimLanesState,\n scrollTop: this.scrollTop,\n });\n }\n\n private hitTestLaneLabel(x: number, y: number, h: number) {\n return coreHitTestLaneLabel(x, y, h, {\n swimLanes: this.swimLanesState, showSwimLanes: this.showSwimLanesState,\n scrollTop: this.scrollTop,\n });\n }\n\n private isInSwimLaneRegion(y: number, h: number): boolean {\n return coreIsInSwimLaneRegion(y, h, {\n swimLanes: this.swimLanesState, showSwimLanes: this.showSwimLanesState,\n });\n }\n\n // ── Zoom helper ────────────────────────────────────────────────────────\n\n private zoomFrom(amount: number): void {\n const result = zoomRange(this.startMs, this.endMs, amount);\n this.startMs = result.startMs;\n this.endMs = result.endMs;\n this.draw();\n }\n\n // ── Edge scroll ────────────────────────────────────────────────────────\n\n private startEdgeScroll(direction: -1 | 1): void {\n if (this.edgeRAF !== null) return;\n const scroll = () => {\n const canvas = this.canvasRef?.nativeElement;\n const span = this.endMs - this.startMs;\n const shift = direction * span * 0.01;\n this.startMs += shift;\n this.endMs += shift;\n\n if (canvas) {\n const rect = canvas.getBoundingClientRect();\n const cx = Math.max(0, Math.min(rect.width, this.scrubClientX - rect.left));\n const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n }\n\n this.draw();\n this.edgeRAF = requestAnimationFrame(scroll);\n };\n this.edgeRAF = requestAnimationFrame(scroll);\n }\n\n private stopEdgeScroll(): void {\n if (this.edgeRAF !== null) {\n cancelAnimationFrame(this.edgeRAF);\n this.edgeRAF = null;\n }\n }\n\n private getTouchDist(a: Touch, b: Touch): number {\n return Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY);\n }\n\n // ── Mouse handlers (template-bound) ────────────────────────────────────\n\n onCanvasMouseDown(e: MouseEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n // Reorder drag on lane label\n if (e.button === 0 && this.swimLaneReorder.observed) {\n const labelLane = this.hitTestLaneLabel(x, y, rect.height);\n if (labelLane) {\n const lanes = this.swimLanesState;\n const dragIdx = lanes.findIndex(l => l.id === labelLane.id);\n this.reorderState = {\n dragging: true,\n dragLaneId: labelLane.id,\n dragStartY: e.clientY,\n currentY: e.clientY,\n insertIndex: dragIdx,\n };\n canvas.style.cursor = 'grabbing';\n return;\n }\n }\n\n // Swim lane item click detection\n if (e.button === 0 && this.isInSwimLaneRegion(y, rect.height)) {\n const needleX = ((this.curMs - this.startMs) / (this.endMs - this.startMs)) * rect.width;\n const nearNeedle = Math.abs(x - needleX) <= 10;\n if (!nearNeedle) {\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit) {\n this.swimLaneDownTime = performance.now();\n return;\n }\n }\n }\n\n if (e.button === 0) {\n this.mouseMode = 'scrub';\n this.scrubClientX = e.clientX;\n canvas.style.cursor = 'grabbing';\n this.ngZone.run(() => this.dragStart.emit());\n const ms = this.startMs + (x / rect.width) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n } else if (e.button === 1) {\n this.mouseMode = 'slide';\n this.mouseX = e.clientX;\n } else if (e.button === 2) {\n if (this.swimLaneItemContextMenu.observed && this.isInSwimLaneRegion(y, rect.height)) return;\n this.mouseMode = 'zoom';\n this.mouseX = e.clientX;\n }\n }\n\n private onDocMouseMove(e: MouseEvent): void {\n // Reorder drag\n const rs = this.reorderState;\n if (rs && rs.dragging) {\n rs.currentY = e.clientY;\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) {\n const rect = canvas.getBoundingClientRect();\n const canvasY = e.clientY - rect.top;\n let y = -this.scrollTop;\n const lanes = this.swimLanesState;\n let idx = lanes.length;\n for (let i = 0; i < lanes.length; i++) {\n const laneH = lanes[i].height ?? DEFAULT_LANE_HEIGHT;\n const mid = y + laneH / 2;\n if (canvasY < mid) { idx = i; break; }\n y += laneH + LANE_GAP;\n }\n rs.insertIndex = idx;\n }\n this.draw();\n return;\n }\n\n if (this.mouseMode === 'none') return;\n const canvas = this.canvasRef?.nativeElement;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const w = rect.width;\n\n if (this.mouseMode === 'scrub') {\n this.scrubClientX = e.clientX;\n const x = e.clientX - rect.left;\n const edge = w * 0.08;\n if (x < edge) this.startEdgeScroll(-1);\n else if (x > w - edge) this.startEdgeScroll(1);\n else this.stopEdgeScroll();\n const cx = Math.max(0, Math.min(w, x));\n const ms = this.startMs + (cx / w) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n } else if (this.mouseMode === 'slide') {\n const dx = this.mouseX - e.clientX;\n this.mouseX = e.clientX;\n if (dx !== 0) {\n const shift = (dx / w) * (this.endMs - this.startMs);\n this.startMs += shift;\n this.endMs += shift;\n this.draw();\n }\n } else if (this.mouseMode === 'zoom') {\n const dx = this.mouseX - e.clientX;\n this.mouseX = e.clientX;\n if (dx !== 0) this.zoomFrom(Math.pow(1.01, dx));\n }\n }\n\n private onDocMouseUp(): void {\n // Finish reorder drag\n const rs = this.reorderState;\n if (rs && rs.dragging) {\n const dragDistance = Math.abs(rs.currentY - rs.dragStartY);\n const lanes = this.swimLanesState;\n const dragIdx = lanes.findIndex(l => l.id === rs.dragLaneId);\n if (dragDistance > 5 && dragIdx >= 0 && rs.insertIndex !== dragIdx && rs.insertIndex !== dragIdx + 1) {\n const newLanes = [...lanes];\n const [removed] = newLanes.splice(dragIdx, 1);\n const insertAt = rs.insertIndex > dragIdx ? rs.insertIndex - 1 : rs.insertIndex;\n newLanes.splice(insertAt, 0, removed);\n this.swimLanesState = newLanes;\n this.ngZone.run(() => this.swimLaneReorder.emit(newLanes.map(l => l.id)));\n }\n this.reorderState = null;\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) canvas.style.cursor = 'default';\n this.draw();\n return;\n }\n\n this.stopEdgeScroll();\n this.mouseMode = 'none';\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) canvas.style.cursor = 'default';\n this.ngZone.run(() => this.dragEnd.emit());\n }\n\n onCanvasMouseMove(e: MouseEvent): void {\n if (this.mouseMode !== 'none') return;\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const needleX = ((this.curMs - this.startMs) / (this.endMs - this.startMs)) * rect.width;\n const nearNeedle = Math.abs(x - needleX) <= 10;\n\n if (this.isInSwimLaneRegion(y, rect.height)) {\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n const prev = this.hoveredItem;\n if (hit) {\n canvas.style.cursor = nearNeedle ? 'grab' : 'pointer';\n if (!prev || prev.item.id !== hit.item.id || prev.lane.id !== hit.lane.id) {\n this.hoveredItem = hit;\n this.ngZone.run(() =>\n this.swimLaneItemHover.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n this.draw();\n }\n } else {\n if (prev) {\n this.hoveredItem = null;\n this.ngZone.run(() => this.swimLaneItemHover.emit(null));\n this.draw();\n }\n if (nearNeedle) {\n canvas.style.cursor = 'grab';\n } else {\n const labelLane = this.hitTestLaneLabel(x, y, rect.height);\n canvas.style.cursor = labelLane && this.swimLaneReorder.observed ? 'grab' : 'default';\n }\n }\n return;\n }\n\n if (this.hoveredItem) {\n this.hoveredItem = null;\n this.ngZone.run(() => this.swimLaneItemHover.emit(null));\n this.draw();\n }\n\n canvas.style.cursor = nearNeedle ? 'grab' : 'default';\n }\n\n onCanvasClick(e: MouseEvent): void {\n const elapsed = performance.now() - this.swimLaneDownTime;\n if (elapsed > 300) return;\n\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit) {\n this.ngZone.run(() =>\n this.swimLaneItemClick.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n }\n }\n\n onCanvasDblClick(e: MouseEvent): void {\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit) {\n this.ngZone.run(() =>\n this.swimLaneItemDoubleClick.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n }\n }\n\n onCanvasContextMenu(e: MouseEvent): void {\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit && this.swimLaneItemContextMenu.observed) {\n e.preventDefault();\n this.ngZone.run(() =>\n this.swimLaneItemContextMenu.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n } else {\n e.preventDefault();\n }\n }\n\n onCanvasMouseLeave(): void {\n if (this.hoveredItem) {\n this.hoveredItem = null;\n this.ngZone.run(() => this.swimLaneItemHover.emit(null));\n this.draw();\n }\n const canvas = this.canvasRef?.nativeElement;\n if (this.mouseMode === 'none' && canvas) canvas.style.cursor = 'default';\n }\n\n // ── Wheel handler ──────────────────────────────────────────────────────\n\n private onWheel(e: WheelEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef?.nativeElement;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n if (this.isInSwimLaneRegion(y, rect.height)) {\n const lanes = this.swimLanesState;\n const totalH = totalSwimLaneHeight(lanes);\n const laneRegionH = Math.max(0, rect.height - TICK_AREA_HEIGHT);\n const maxScroll = Math.max(0, totalH - laneRegionH);\n if (maxScroll > 0) {\n this.scrollTop = Math.max(0, Math.min(maxScroll, this.scrollTop + e.deltaY * SWIM_LANE_SCROLL_SPEED));\n this.draw();\n return;\n }\n }\n\n this.zoomFrom(Math.pow(1.05, e.deltaY > 0 ? -1 : 1));\n }\n\n // ── Touch handlers ─────────────────────────────────────────────────────\n\n private onTouchStart(e: TouchEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n\n if (e.touches.length === 1) {\n const x = e.touches[0].clientX - rect.left;\n const cx = Math.max(0, Math.min(rect.width, x));\n const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);\n this.touchMode = 'scrub';\n this.touchX = e.touches[0].clientX;\n this.scrubClientX = e.touches[0].clientX;\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => {\n this.dragStart.emit();\n this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms)));\n });\n } else if (e.touches.length >= 2) {\n this.touchMode = 'pinch';\n this.pinchDist = this.getTouchDist(e.touches[0], e.touches[1]);\n }\n }\n\n private onTouchMove(e: TouchEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n\n if (this.touchMode === 'scrub' && e.touches.length >= 1) {\n const x = e.touches[0].clientX - rect.left;\n const edge = rect.width * 0.08;\n this.scrubClientX = e.touches[0].clientX;\n\n if (x < edge) {\n this.startEdgeScroll(-1);\n } else if (x > rect.width - edge) {\n this.startEdgeScroll(1);\n } else {\n this.stopEdgeScroll();\n const cx = Math.max(0, Math.min(rect.width, x));\n const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n }\n } else if (this.touchMode === 'slide' && e.touches.length >= 1) {\n const dx = this.touchX - e.touches[0].clientX;\n this.touchX = e.touches[0].clientX;\n if (dx !== 0) {\n const shift = (dx / rect.width) * (this.endMs - this.startMs);\n this.startMs += shift;\n this.endMs += shift;\n this.draw();\n }\n } else if (this.touchMode === 'pinch' && e.touches.length >= 2) {\n const newDist = this.getTouchDist(e.touches[0], e.touches[1]);\n if (newDist > 0 && this.pinchDist > 0) {\n this.zoomFrom(this.pinchDist / newDist);\n }\n this.pinchDist = newDist;\n }\n }\n\n private onTouchEnd(e: TouchEvent): void {\n this.stopEdgeScroll();\n if (this.touchMode === 'scrub') {\n this.ngZone.run(() => this.dragEnd.emit());\n }\n\n if (e.touches.length === 0) {\n this.touchMode = 'none';\n } else if (e.touches.length === 1) {\n this.touchMode = 'slide';\n this.touchX = e.touches[0].clientX;\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnInit,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n NgZone,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n type SwimLane,\n type SwimLaneEventInfo,\n defaultTheme,\n toJulianDate,\n TICK_AREA_HEIGHT,\n} from '@kteneyck/cesium-timeline-core';\nimport { TimelineControlsComponent } from './timeline-controls.component';\nimport { TimelineCanvasComponent } from './timeline-canvas.component';\n\nconst DEFAULT_FF_SPEEDS = [2, 4, 8, 16, 32, 100, 1];\nconst DEFAULT_RW_SPEEDS = [1, 2, 4, 8, 16, 32, 100];\n\n@Component({\n selector: 'ct-timeline',\n standalone: true,\n imports: [TimelineControlsComponent, TimelineCanvasComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n [class]=\"cssClass\"\n [style.width]=\"'100%'\"\n [style.height]=\"heightStyle\"\n [style.overflow]=\"'hidden'\"\n [style.display]=\"'flex'\"\n [style.flex-direction]=\"'column'\"\n [style.font-family]=\"'system-ui, -apple-system, sans-serif'\"\n [style.transition]=\"swimLaneTransition === 'animated' ? 'height 0.2s ease' : undefined\"\n >\n @if (showControls) {\n <div #controlsEl>\n <ct-timeline-controls\n [currentTime]=\"currentTimeState\"\n [isPlaying]=\"isPlayingState\"\n [multiplier]=\"multiplierState\"\n [isLive]=\"isLive\"\n [hasStartTime]=\"startTime != null\"\n [hasEndTime]=\"endTime != null\"\n [showJumpToStart]=\"showJumpToStart\"\n [showJumpToEnd]=\"showJumpToEnd\"\n [dateTimeFormat]=\"dateTimeFormat\"\n [timezone]=\"timezone\"\n [theme]=\"finalTheme\"\n [swimLanesVisible]=\"hasSwimLanes ? swimLanesExpanded : undefined\"\n (playPause)=\"handlePlayPause($event)\"\n (jumpToStart)=\"handleJumpToStart()\"\n (rewind)=\"handleRewindSpeed()\"\n (fastForward)=\"handleFastForward()\"\n (jumpToEnd)=\"handleJumpToEnd()\"\n (jumpToLive)=\"handleJumpToLive()\"\n (resetSpeed)=\"applyMultiplier(1)\"\n (dateTimeClick)=\"dateTimeClick.emit()\"\n (toggleSwimLanes)=\"handleToggleSwimLanes()\"\n />\n </div>\n }\n\n @if (enableDrag !== false) {\n <ct-timeline-canvas\n [currentTime]=\"currentTimeState\"\n [defaultStartMs]=\"defaultStartMs\"\n [defaultEndMs]=\"defaultEndMs\"\n [theme]=\"finalTheme\"\n [maxTicks]=\"maxTicks\"\n [timezone]=\"timezone\"\n [swimLanes]=\"swimLanes\"\n [showSwimLanes]=\"swimLanesExpanded\"\n (timeChange)=\"handleTimeChange($event)\"\n (dragStart)=\"isDragging = true\"\n (dragEnd)=\"isDragging = false\"\n (swimLaneItemClick)=\"swimLaneItemClick.emit($event)\"\n (swimLaneItemHover)=\"swimLaneItemHover.emit($event)\"\n (swimLaneItemDoubleClick)=\"swimLaneItemDoubleClick.emit($event)\"\n (swimLaneItemContextMenu)=\"swimLaneItemContextMenu.emit($event)\"\n (swimLaneReorder)=\"swimLaneReorder.emit($event)\"\n />\n }\n </div>\n `,\n styles: [`:host { display: block; }`],\n})\nexport class TimelineComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n // ── Inputs ─────────────────────────────────────────────────────────────\n @Input() startTime?: Cesium.JulianDate | Date;\n @Input() endTime?: Cesium.JulianDate | Date;\n @Input() currentTime?: Cesium.JulianDate | Date;\n @Input() clock?: Cesium.Clock;\n @Input() height?: number;\n @Input() showControls = true;\n @Input() showJumpToStart?: boolean;\n @Input() showJumpToEnd?: boolean;\n @Input() enableDrag = true;\n @Input() dateTimeFormat?: string;\n @Input() jumpToTime?: Cesium.JulianDate | Date;\n @Input() maxTicks?: number;\n @Input() ffSpeeds: number[] = DEFAULT_FF_SPEEDS;\n @Input() rwSpeeds: number[] = DEFAULT_RW_SPEEDS;\n @Input() theme?: Partial<TimelineTheme>;\n @Input() cssClass?: string;\n @Input() timezone?: string;\n @Input() swimLanes?: SwimLane[];\n @Input() showSwimLanes?: boolean;\n @Input() swimLaneTransition: 'animated' | 'instant' = 'animated';\n\n // ── Outputs ────────────────────────────────────────────────────────────\n @Output() timeChange = new EventEmitter<Cesium.JulianDate>();\n @Output() playPause = new EventEmitter<boolean>();\n @Output() multiplierChange = new EventEmitter<number>();\n @Output() dateTimeClick = new EventEmitter<void>();\n @Output() showSwimLanesChange = new EventEmitter<boolean>();\n @Output() swimLaneItemClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemHover = new EventEmitter<SwimLaneEventInfo | null>();\n @Output() swimLaneItemDoubleClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemContextMenu = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneReorder = new EventEmitter<string[]>();\n\n // ── ViewChild refs ─────────────────────────────────────────────────────\n @ViewChild(TimelineCanvasComponent) canvasComp?: TimelineCanvasComponent;\n @ViewChild('controlsEl') controlsRef?: ElementRef<HTMLDivElement>;\n\n // ── Internal state ─────────────────────────────────────────────────────\n currentTimeState!: Cesium.JulianDate;\n isPlayingState = false;\n multiplierState = 1;\n swimLanesExpanded = true;\n controlsHeight = 0;\n isDragging = false;\n defaultStartMs = 0;\n defaultEndMs = 0;\n finalTheme: TimelineTheme = { ...defaultTheme };\n\n private ro?: ResizeObserver;\n private clockCleanup?: () => void;\n private fallbackInterval?: ReturnType<typeof setInterval>;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone,\n ) {}\n\n get hasSwimLanes(): boolean {\n return this.swimLanes != null && this.swimLanes.length > 0;\n }\n\n get isLive(): boolean {\n return Math.abs(Cesium.JulianDate.toDate(this.currentTimeState).getTime() - Date.now()) < 10_000;\n }\n\n get isCollapsed(): boolean {\n return this.hasSwimLanes && !this.swimLanesExpanded;\n }\n\n get heightStyle(): string {\n if (this.isCollapsed) return `${this.controlsHeight + TICK_AREA_HEIGHT}px`;\n if (this.height != null) return `${this.height}px`;\n return '100%';\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n const now = Date.now();\n this.defaultStartMs = this.startTime\n ? Cesium.JulianDate.toDate(toJulianDate(this.startTime)).getTime()\n : now - 12 * 3600 * 1000;\n this.defaultEndMs = this.endTime\n ? Cesium.JulianDate.toDate(toJulianDate(this.endTime)).getTime()\n : now + 12 * 3600 * 1000;\n\n this.currentTimeState = toJulianDate(\n this.currentTime ?? (this.startTime ?? Cesium.JulianDate.fromDate(new Date()))\n );\n this.isPlayingState = this.clock?.shouldAnimate ?? false;\n this.multiplierState = this.clock?.multiplier ?? 1;\n this.swimLanesExpanded = this.showSwimLanes ?? true;\n this.finalTheme = { ...defaultTheme, ...this.theme };\n }\n\n ngAfterViewInit(): void {\n const el = this.controlsRef?.nativeElement;\n if (el) {\n this.ro = new ResizeObserver(([entry]) => {\n this.controlsHeight = entry.borderBoxSize[0].blockSize;\n this.cdr.markForCheck();\n });\n this.ro.observe(el);\n }\n\n // Clock sync\n this.setupClockSync();\n\n this.cdr.detectChanges();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['theme']) {\n this.finalTheme = { ...defaultTheme, ...this.theme };\n }\n if (changes['showSwimLanes'] && this.showSwimLanes != null) {\n this.swimLanesExpanded = this.showSwimLanes;\n }\n if (changes['clock'] && !changes['clock'].firstChange) {\n this.cleanupClockSync();\n this.setupClockSync();\n }\n if (changes['jumpToTime'] && this.jumpToTime) {\n const t = toJulianDate(this.jumpToTime);\n this.handleTimeChange(t);\n if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n const newMs = Cesium.JulianDate.toDate(t).getTime();\n this.canvasComp.zoomTo(newMs - span / 2, newMs + span / 2);\n }\n }\n }\n\n ngOnDestroy(): void {\n this.cleanupClockSync();\n this.ro?.disconnect();\n if (this.fallbackInterval) clearInterval(this.fallbackInterval);\n }\n\n // ── Clock sync ─────────────────────────────────────────────────────────\n\n private setupClockSync(): void {\n if (this.clock) {\n const onTick = () => {\n if (this.isDragging) return;\n const ct = Cesium.JulianDate.clone(this.clock!.currentTime);\n this.currentTimeState = ct;\n this.isPlayingState = this.clock!.shouldAnimate;\n this.multiplierState = this.clock!.multiplier;\n\n if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n const ctMs = Cesium.JulianDate.toDate(ct).getTime();\n const pos = ctMs - startMs;\n if (pos <= span * 0.1) {\n this.canvasComp.zoomTo(ctMs - span * 0.1, ctMs + span * 0.9, ctMs);\n } else if (pos >= span * 0.9) {\n this.canvasComp.zoomTo(ctMs - span * 0.9, ctMs + span * 0.1, ctMs);\n }\n }\n this.cdr.markForCheck();\n };\n this.clock.onTick.addEventListener(onTick);\n this.clockCleanup = () => this.clock!.onTick.removeEventListener(onTick);\n } else {\n this.ngZone.runOutsideAngular(() => {\n this.fallbackInterval = setInterval(() => {\n if (this.isDragging) return;\n const ct = Cesium.JulianDate.fromDate(new Date());\n this.currentTimeState = ct;\n if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n const ctMs = Cesium.JulianDate.toDate(ct).getTime();\n const pos = ctMs - startMs;\n if (pos <= span * 0.1) this.canvasComp.zoomTo(ctMs - span * 0.1, ctMs + span * 0.9, ctMs);\n else if (pos >= span * 0.9) this.canvasComp.zoomTo(ctMs - span * 0.9, ctMs + span * 0.1, ctMs);\n }\n this.ngZone.run(() => this.cdr.markForCheck());\n }, 1000);\n });\n }\n }\n\n private cleanupClockSync(): void {\n this.clockCleanup?.();\n this.clockCleanup = undefined;\n if (this.fallbackInterval) {\n clearInterval(this.fallbackInterval);\n this.fallbackInterval = undefined;\n }\n }\n\n // ── Handlers ───────────────────────────────────────────────────────────\n\n handleTimeChange(t: Cesium.JulianDate): void {\n this.currentTimeState = t;\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.timeChange.emit(t);\n this.cdr.markForCheck();\n }\n\n handlePlayPause(playing: boolean): void {\n if (playing && this.multiplierState < 0) {\n this.applyMultiplier(1, false);\n }\n if (this.clock) this.clock.shouldAnimate = playing;\n this.isPlayingState = playing;\n this.playPause.emit(playing);\n this.cdr.markForCheck();\n }\n\n handleFastForward(): void {\n const speeds = this.ffSpeeds.length > 0 ? this.ffSpeeds : DEFAULT_FF_SPEEDS;\n const cur = this.multiplierState > 1 ? this.multiplierState : 1;\n const idx = speeds.indexOf(cur);\n const next = speeds[idx < 0 || idx === speeds.length - 1 ? 0 : idx + 1];\n this.applyMultiplier(next);\n }\n\n handleRewindSpeed(): void {\n const speeds = this.rwSpeeds.length > 0 ? this.rwSpeeds : DEFAULT_RW_SPEEDS;\n const curAbs = this.multiplierState < 0 ? Math.abs(this.multiplierState) : 0;\n const idx = speeds.indexOf(curAbs);\n const next = -(speeds[idx < 0 || idx === speeds.length - 1 ? 0 : idx + 1]);\n this.applyMultiplier(next);\n }\n\n handleJumpToStart(): void {\n const t = toJulianDate(this.startTime ?? Cesium.JulianDate.fromDate(new Date(this.defaultStartMs)));\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.currentTimeState = t;\n this.canvasComp?.zoomTo(this.defaultStartMs, this.defaultEndMs);\n this.cdr.markForCheck();\n }\n\n handleJumpToEnd(): void {\n const t = toJulianDate(this.endTime ?? Cesium.JulianDate.fromDate(new Date(this.defaultEndMs)));\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.currentTimeState = t;\n this.canvasComp?.zoomTo(this.defaultStartMs, this.defaultEndMs);\n this.cdr.markForCheck();\n }\n\n handleJumpToLive(): void {\n const t = Cesium.JulianDate.fromDate(new Date());\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.currentTimeState = t;\n this.applyMultiplier(1);\n const nowMs = Date.now();\n this.canvasComp?.zoomTo(nowMs - 12 * 3600 * 1000, nowMs + 12 * 3600 * 1000);\n this.cdr.markForCheck();\n }\n\n handleToggleSwimLanes(): void {\n this.swimLanesExpanded = !this.swimLanesExpanded;\n this.showSwimLanesChange.emit(this.swimLanesExpanded);\n this.cdr.markForCheck();\n }\n\n applyMultiplier(m: number, play = true): void {\n if (this.clock) { this.clock.multiplier = m; if (play) this.clock.shouldAnimate = true; }\n this.multiplierState = m;\n if (play) this.isPlayingState = true;\n this.multiplierChange.emit(m);\n this.cdr.markForCheck();\n }\n}\n","// Components\nexport { TimelineComponent } from './lib/timeline.component';\nexport { TimelineCanvasComponent, TICK_AREA_HEIGHT } from './lib/timeline-canvas.component';\nexport { TimelineControlsComponent } from './lib/timeline-controls.component';\n\n// Re-export core types and utilities\nexport * from '@kteneyck/cesium-timeline-core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["coreHitTestSwimLane","coreHitTestLaneLabel","coreIsInSwimLaneRegion"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kteneyck/cesium-timeline-angular",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Angular timeline component for Cesium with clock integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "kteneyck",
|
|
@@ -24,35 +24,29 @@
|
|
|
24
24
|
},
|
|
25
25
|
"publishConfig": {
|
|
26
26
|
"access": "public",
|
|
27
|
-
"registry": "https://registry.npmjs.org"
|
|
27
|
+
"registry": "https://registry.npmjs.org",
|
|
28
|
+
"directory": "dist"
|
|
28
29
|
},
|
|
29
30
|
"peerDependencies": {
|
|
30
31
|
"@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
|
|
31
32
|
"@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
|
|
32
|
-
"@kteneyck/cesium-timeline-core": "0.3.0",
|
|
33
33
|
"cesium": "^1.100.0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
+
"@kteneyck/cesium-timeline-core": "0.5.0",
|
|
36
37
|
"tslib": "^2.6.0"
|
|
37
38
|
},
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"zone.js": "^0.15.0"
|
|
39
|
+
"sideEffects": false,
|
|
40
|
+
"module": "fesm2022/kteneyck-cesium-timeline-angular.mjs",
|
|
41
|
+
"typings": "types/kteneyck-cesium-timeline-angular.d.ts",
|
|
42
|
+
"exports": {
|
|
43
|
+
"./package.json": {
|
|
44
|
+
"default": "./package.json"
|
|
45
|
+
},
|
|
46
|
+
".": {
|
|
47
|
+
"types": "./types/kteneyck-cesium-timeline-angular.d.ts",
|
|
48
|
+
"default": "./fesm2022/kteneyck-cesium-timeline-angular.mjs"
|
|
49
|
+
}
|
|
50
50
|
},
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
"files": [
|
|
55
|
-
"dist"
|
|
56
|
-
],
|
|
57
|
-
"sideEffects": false
|
|
58
|
-
}
|
|
51
|
+
"type": "module"
|
|
52
|
+
}
|