@kteneyck/cesium-timeline-angular 0.6.0 → 0.8.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.
@@ -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, getTimezoneAbbr, DEFAULT_LABELS, resolveLabel, 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, DEFAULT_LABELS, resolveLabel, MIN_SPAN_MS, MAX_SPAN_MS, drawTimeline, hitTestSwimLane, hitTestLaneLabel, isInSwimLaneRegion, zoomRange, DEFAULT_LANE_HEIGHT, LANE_GAP, totalSwimLaneHeight, TICK_AREA_HEIGHT, SWIM_LANE_SCROLL_SPEED, zoomAroundMs, 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
 
@@ -507,6 +507,8 @@ class TimelineCanvasComponent {
507
507
  theme;
508
508
  maxTicks;
509
509
  timezone;
510
+ dateTimeFormat;
511
+ months;
510
512
  swimLanes;
511
513
  showSwimLanes;
512
514
  timeChange = new EventEmitter();
@@ -536,6 +538,11 @@ class TimelineCanvasComponent {
536
538
  touchMode = 'none';
537
539
  touchX = 0;
538
540
  pinchDist = 0;
541
+ // Canvas-relative X of the midpoint between the two pinch fingers (pixels).
542
+ pinchMidX = 0;
543
+ // Needle position saved just before a single-finger scrub begins, so it can
544
+ // be restored if a second finger lands and the gesture becomes a pinch-zoom.
545
+ prePinchCurMs = 0;
539
546
  // Edge-scroll animation
540
547
  edgeRAF = null;
541
548
  // Follow-scroll (playback auto-scroll)
@@ -709,6 +716,8 @@ class TimelineCanvasComponent {
709
716
  theme: this.theme,
710
717
  maxTicks: this.maxTicks,
711
718
  timezone: this.timezone,
719
+ use12h: /h/.test(this.dateTimeFormat ?? ''),
720
+ months: this.months,
712
721
  swimLanes: this.swimLanesState,
713
722
  showSwimLanes: this.showSwimLanesState,
714
723
  scrollTop: this.scrollTop,
@@ -1046,6 +1055,7 @@ class TimelineCanvasComponent {
1046
1055
  const x = e.touches[0].clientX - rect.left;
1047
1056
  const cx = Math.max(0, Math.min(rect.width, x));
1048
1057
  const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);
1058
+ this.prePinchCurMs = this.curMs;
1049
1059
  this.touchMode = 'scrub';
1050
1060
  this.touchX = e.touches[0].clientX;
1051
1061
  this.scrubClientX = e.touches[0].clientX;
@@ -1057,8 +1067,16 @@ class TimelineCanvasComponent {
1057
1067
  });
1058
1068
  }
1059
1069
  else if (e.touches.length >= 2) {
1070
+ // If we were scrubbing, undo the needle move — pinch-zoom should not
1071
+ // change the current time.
1072
+ if (this.touchMode === 'scrub') {
1073
+ this.curMs = this.prePinchCurMs;
1074
+ this.draw();
1075
+ this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(this.prePinchCurMs))));
1076
+ }
1060
1077
  this.touchMode = 'pinch';
1061
1078
  this.pinchDist = this.getTouchDist(e.touches[0], e.touches[1]);
1079
+ this.pinchMidX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left;
1062
1080
  }
1063
1081
  }
1064
1082
  onTouchMove(e) {
@@ -1096,10 +1114,16 @@ class TimelineCanvasComponent {
1096
1114
  }
1097
1115
  else if (this.touchMode === 'pinch' && e.touches.length >= 2) {
1098
1116
  const newDist = this.getTouchDist(e.touches[0], e.touches[1]);
1117
+ const newMidX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left;
1099
1118
  if (newDist > 0 && this.pinchDist > 0) {
1100
- this.zoomFrom(this.pinchDist / newDist);
1119
+ const pivotMs = this.startMs + (this.pinchMidX / rect.width) * (this.endMs - this.startMs);
1120
+ const result = zoomAroundMs(this.startMs, this.endMs, this.pinchDist / newDist, pivotMs);
1121
+ this.startMs = result.startMs;
1122
+ this.endMs = result.endMs;
1123
+ this.draw();
1101
1124
  }
1102
1125
  this.pinchDist = newDist;
1126
+ this.pinchMidX = newMidX;
1103
1127
  }
1104
1128
  }
1105
1129
  onTouchEnd(e) {
@@ -1116,7 +1140,7 @@ class TimelineCanvasComponent {
1116
1140
  }
1117
1141
  }
1118
1142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineCanvasComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
1119
- 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
1143
+ 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", dateTimeFormat: "dateTimeFormat", months: "months", 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
1120
1144
  style="width:100%;flex:1;min-height:0;display:block;cursor:default"
1121
1145
  (mousedown)="onCanvasMouseDown($event)"
1122
1146
  (mousemove)="onCanvasMouseMove($event)"
@@ -1149,6 +1173,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
1149
1173
  type: Input
1150
1174
  }], timezone: [{
1151
1175
  type: Input
1176
+ }], dateTimeFormat: [{
1177
+ type: Input
1178
+ }], months: [{
1179
+ type: Input
1152
1180
  }], swimLanes: [{
1153
1181
  type: Input
1154
1182
  }], showSwimLanes: [{
@@ -1417,7 +1445,11 @@ class TimelineComponent {
1417
1445
  this.currentTimeState = t;
1418
1446
  this.applyMultiplier(1);
1419
1447
  const nowMs = Date.now();
1420
- this.canvasComp?.zoomTo(nowMs - 12 * 3600 * 1000, nowMs + 12 * 3600 * 1000);
1448
+ if (this.canvasComp) {
1449
+ const { startMs, endMs } = this.canvasComp.getVisibleRange();
1450
+ const span = endMs - startMs;
1451
+ this.canvasComp.zoomTo(nowMs - span / 2, nowMs + span / 2);
1452
+ }
1421
1453
  this.cdr.markForCheck();
1422
1454
  }
1423
1455
  handleToggleSwimLanes() {
@@ -1486,6 +1518,8 @@ class TimelineComponent {
1486
1518
  [theme]="finalTheme"
1487
1519
  [maxTicks]="maxTicks"
1488
1520
  [timezone]="timezone"
1521
+ [dateTimeFormat]="dateTimeFormat"
1522
+ [months]="labels?.months"
1489
1523
  [swimLanes]="swimLanes"
1490
1524
  [showSwimLanes]="swimLanesExpanded"
1491
1525
  (timeChange)="handleTimeChange($event)"
@@ -1499,7 +1533,7 @@ class TimelineComponent {
1499
1533
  />
1500
1534
  }
1501
1535
  </div>
1502
- `, 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", "labels"], 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 });
1536
+ `, 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", "labels"], 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", "dateTimeFormat", "months", "swimLanes", "showSwimLanes"], outputs: ["timeChange", "dragStart", "dragEnd", "swimLaneItemClick", "swimLaneItemHover", "swimLaneItemDoubleClick", "swimLaneItemContextMenu", "swimLaneReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1503
1537
  }
1504
1538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineComponent, decorators: [{
1505
1539
  type: Component,
@@ -1551,6 +1585,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
1551
1585
  [theme]="finalTheme"
1552
1586
  [maxTicks]="maxTicks"
1553
1587
  [timezone]="timezone"
1588
+ [dateTimeFormat]="dateTimeFormat"
1589
+ [months]="labels?.months"
1554
1590
  [swimLanes]="swimLanes"
1555
1591
  [showSwimLanes]="swimLanesExpanded"
1556
1592
  (timeChange)="handleTimeChange($event)"
@@ -1 +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 type TimelineLabels,\n DEFAULT_LABELS,\n resolveLabel,\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 ? l.dateTimeClickTooltip : ''\"\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 ? l.liveActiveTooltip : l.liveTooltip\"\n >\n {{ isLive ? l.liveActiveLabel : l.liveLabel }}\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]=\"l.resetSpeedTooltip\"\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 ? l.jumpToStartTooltip : l.noStartTimeTooltip\"\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 ? resolveRewindActive(absMultiplier) : l.rewindTooltip\"\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 ? l.pauseTooltip : (isRewinding ? l.playFromRewindTooltip : l.playTooltip)\"\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 ? resolveFastForwardActive(absMultiplier) : l.fastForwardTooltip\"\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 ? l.jumpToEndTooltip : l.noEndTimeTooltip\"\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 ? l.collapseSwimLanesTooltip : l.expandSwimLanesTooltip\"\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 ? l.collapseSwimLanesTooltip : l.expandSwimLanesTooltip\"\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 @Input() labels?: Partial<TimelineLabels>;\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 /** Merged labels — defaults overridden by whatever the consumer provides. */\n get l(): Required<TimelineLabels> { return { ...DEFAULT_LABELS, ...this.labels }; }\n\n resolveRewindActive(multiplier: number): string { return resolveLabel(this.l.rewindActiveTooltip, multiplier); }\n resolveFastForwardActive(multiplier: number): string { return resolveLabel(this.l.fastForwardActiveTooltip, multiplier); }\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 TimelineLabels,\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 [labels]=\"labels\"\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 /** Overrides for control-bar labels and tooltips (i18n / custom verbiage). */\n @Input() labels?: Partial<TimelineLabels>;\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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"}
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 type TimelineLabels,\n DEFAULT_LABELS,\n resolveLabel,\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 ? l.dateTimeClickTooltip : ''\"\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 ? l.liveActiveTooltip : l.liveTooltip\"\n >\n {{ isLive ? l.liveActiveLabel : l.liveLabel }}\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]=\"l.resetSpeedTooltip\"\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 ? l.jumpToStartTooltip : l.noStartTimeTooltip\"\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 ? resolveRewindActive(absMultiplier) : l.rewindTooltip\"\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 ? l.pauseTooltip : (isRewinding ? l.playFromRewindTooltip : l.playTooltip)\"\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 ? resolveFastForwardActive(absMultiplier) : l.fastForwardTooltip\"\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 ? l.jumpToEndTooltip : l.noEndTimeTooltip\"\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 ? l.collapseSwimLanesTooltip : l.expandSwimLanesTooltip\"\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 ? l.collapseSwimLanesTooltip : l.expandSwimLanesTooltip\"\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 @Input() labels?: Partial<TimelineLabels>;\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 /** Merged labels — defaults overridden by whatever the consumer provides. */\n get l(): Required<TimelineLabels> { return { ...DEFAULT_LABELS, ...this.labels }; }\n\n resolveRewindActive(multiplier: number): string { return resolveLabel(this.l.rewindActiveTooltip, multiplier); }\n resolveFastForwardActive(multiplier: number): string { return resolveLabel(this.l.fastForwardActiveTooltip, multiplier); }\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 zoomAroundMs,\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() dateTimeFormat?: string;\n @Input() months?: 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 // Canvas-relative X of the midpoint between the two pinch fingers (pixels).\n private pinchMidX = 0;\n // Needle position saved just before a single-finger scrub begins, so it can\n // be restored if a second finger lands and the gesture becomes a pinch-zoom.\n private prePinchCurMs = 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 use12h: /h/.test(this.dateTimeFormat ?? ''),\n months: this.months,\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.prePinchCurMs = this.curMs;\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 // If we were scrubbing, undo the needle move — pinch-zoom should not\n // change the current time.\n if (this.touchMode === 'scrub') {\n this.curMs = this.prePinchCurMs;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(this.prePinchCurMs))));\n }\n this.touchMode = 'pinch';\n this.pinchDist = this.getTouchDist(e.touches[0], e.touches[1]);\n this.pinchMidX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left;\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 const newMidX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left;\n if (newDist > 0 && this.pinchDist > 0) {\n const pivotMs = this.startMs + (this.pinchMidX / rect.width) * (this.endMs - this.startMs);\n const result = zoomAroundMs(this.startMs, this.endMs, this.pinchDist / newDist, pivotMs);\n this.startMs = result.startMs;\n this.endMs = result.endMs;\n this.draw();\n }\n this.pinchDist = newDist;\n this.pinchMidX = newMidX;\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 TimelineLabels,\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 [labels]=\"labels\"\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 [dateTimeFormat]=\"dateTimeFormat\"\n [months]=\"labels?.months\"\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 /** Overrides for control-bar labels and tooltips (i18n / custom verbiage). */\n @Input() labels?: Partial<TimelineLabels>;\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 if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n this.canvasComp.zoomTo(nowMs - span / 2, nowMs + span / 2);\n }\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.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Angular timeline component for Cesium with clock integration",
5
5
  "license": "MIT",
6
6
  "author": "kteneyck",
@@ -28,12 +28,12 @@
28
28
  "directory": "dist"
29
29
  },
30
30
  "peerDependencies": {
31
- "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
32
- "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
31
+ "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
32
+ "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
33
33
  "cesium": "^1.100.0"
34
34
  },
35
35
  "dependencies": {
36
- "@kteneyck/cesium-timeline-core": "0.6.0",
36
+ "@kteneyck/cesium-timeline-core": "0.8.0",
37
37
  "tslib": "^2.6.0"
38
38
  },
39
39
  "sideEffects": false,
@@ -20,6 +20,8 @@ declare class TimelineCanvasComponent implements AfterViewInit, OnChanges, OnDes
20
20
  theme: TimelineTheme;
21
21
  maxTicks?: number;
22
22
  timezone?: string;
23
+ dateTimeFormat?: string;
24
+ months?: string[];
23
25
  swimLanes?: SwimLane[];
24
26
  showSwimLanes?: boolean;
25
27
  timeChange: EventEmitter<Cesium.JulianDate>;
@@ -46,6 +48,8 @@ declare class TimelineCanvasComponent implements AfterViewInit, OnChanges, OnDes
46
48
  private touchMode;
47
49
  private touchX;
48
50
  private pinchDist;
51
+ private pinchMidX;
52
+ private prePinchCurMs;
49
53
  private edgeRAF;
50
54
  private followRAF;
51
55
  private following;
@@ -94,7 +98,7 @@ declare class TimelineCanvasComponent implements AfterViewInit, OnChanges, OnDes
94
98
  private onTouchMove;
95
99
  private onTouchEnd;
96
100
  static ɵfac: i0.ɵɵFactoryDeclaration<TimelineCanvasComponent, never>;
97
- static ɵcmp: i0.ɵɵComponentDeclaration<TimelineCanvasComponent, "ct-timeline-canvas", never, { "currentTime": { "alias": "currentTime"; "required": false; }; "defaultStartMs": { "alias": "defaultStartMs"; "required": false; }; "defaultEndMs": { "alias": "defaultEndMs"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "maxTicks": { "alias": "maxTicks"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "swimLanes": { "alias": "swimLanes"; "required": false; }; "showSwimLanes": { "alias": "showSwimLanes"; "required": false; }; }, { "timeChange": "timeChange"; "dragStart": "dragStart"; "dragEnd": "dragEnd"; "swimLaneItemClick": "swimLaneItemClick"; "swimLaneItemHover": "swimLaneItemHover"; "swimLaneItemDoubleClick": "swimLaneItemDoubleClick"; "swimLaneItemContextMenu": "swimLaneItemContextMenu"; "swimLaneReorder": "swimLaneReorder"; }, never, never, true, never>;
101
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimelineCanvasComponent, "ct-timeline-canvas", never, { "currentTime": { "alias": "currentTime"; "required": false; }; "defaultStartMs": { "alias": "defaultStartMs"; "required": false; }; "defaultEndMs": { "alias": "defaultEndMs"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "maxTicks": { "alias": "maxTicks"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "dateTimeFormat": { "alias": "dateTimeFormat"; "required": false; }; "months": { "alias": "months"; "required": false; }; "swimLanes": { "alias": "swimLanes"; "required": false; }; "showSwimLanes": { "alias": "showSwimLanes"; "required": false; }; }, { "timeChange": "timeChange"; "dragStart": "dragStart"; "dragEnd": "dragEnd"; "swimLaneItemClick": "swimLaneItemClick"; "swimLaneItemHover": "swimLaneItemHover"; "swimLaneItemDoubleClick": "swimLaneItemDoubleClick"; "swimLaneItemContextMenu": "swimLaneItemContextMenu"; "swimLaneReorder": "swimLaneReorder"; }, never, never, true, never>;
98
102
  }
99
103
 
100
104
  declare class TimelineComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {