@kteneyck/cesium-timeline-angular 0.4.0 → 0.6.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kteneyck-cesium-timeline-angular.mjs","sources":["../../src/lib/timeline-controls.component.ts","../../src/lib/timeline-canvas.component.ts","../../src/lib/timeline.component.ts","../../src/public-api.ts","../../src/kteneyck-cesium-timeline-angular.ts"],"sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kteneyck/cesium-timeline-angular",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Angular timeline component for Cesium with clock integration",
5
5
  "license": "MIT",
6
6
  "author": "kteneyck",
@@ -24,35 +24,29 @@
24
24
  },
25
25
  "publishConfig": {
26
26
  "access": "public",
27
- "registry": "https://registry.npmjs.org"
27
+ "registry": "https://registry.npmjs.org",
28
+ "directory": "dist"
28
29
  },
29
30
  "peerDependencies": {
30
31
  "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
31
32
  "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
32
- "@kteneyck/cesium-timeline-core": "0.4.0",
33
33
  "cesium": "^1.100.0"
34
34
  },
35
35
  "dependencies": {
36
+ "@kteneyck/cesium-timeline-core": "0.6.0",
36
37
  "tslib": "^2.6.0"
37
38
  },
38
- "devDependencies": {
39
- "@angular/common": "^21.0.0",
40
- "@angular/compiler": "^21.0.0",
41
- "@angular/compiler-cli": "^21.0.0",
42
- "@angular/core": "^21.0.0",
43
- "@angular/platform-browser": "^21.0.0",
44
- "cesium": "^1.100.0",
45
- "ng-packagr": "^21.0.0",
46
- "rxjs": "^7.8.0",
47
- "tslib": "^2.6.0",
48
- "typescript": "~5.9.0",
49
- "zone.js": "^0.15.0"
39
+ "sideEffects": false,
40
+ "module": "fesm2022/kteneyck-cesium-timeline-angular.mjs",
41
+ "typings": "types/kteneyck-cesium-timeline-angular.d.ts",
42
+ "exports": {
43
+ "./package.json": {
44
+ "default": "./package.json"
45
+ },
46
+ ".": {
47
+ "types": "./types/kteneyck-cesium-timeline-angular.d.ts",
48
+ "default": "./fesm2022/kteneyck-cesium-timeline-angular.mjs"
49
+ }
50
50
  },
51
- "scripts": {
52
- "build": "ng-packagr -p ng-package.json"
53
- },
54
- "files": [
55
- "dist"
56
- ],
57
- "sideEffects": false
58
- }
51
+ "type": "module"
52
+ }
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { AfterViewInit, OnChanges, OnDestroy, EventEmitter, ElementRef, NgZone, SimpleChanges, OnInit, ChangeDetectorRef } from '@angular/core';
3
3
  import * as Cesium from 'cesium';
4
- import { TimelineTheme, SwimLane, SwimLaneEventInfo } from '@kteneyck/cesium-timeline-core';
4
+ import { TimelineTheme, SwimLane, SwimLaneEventInfo, TimelineLabels } 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
 
@@ -120,6 +120,8 @@ declare class TimelineComponent implements OnInit, AfterViewInit, OnChanges, OnD
120
120
  swimLanes?: SwimLane[];
121
121
  showSwimLanes?: boolean;
122
122
  swimLaneTransition: 'animated' | 'instant';
123
+ /** Overrides for control-bar labels and tooltips (i18n / custom verbiage). */
124
+ labels?: Partial<TimelineLabels>;
123
125
  timeChange: EventEmitter<Cesium.JulianDate>;
124
126
  playPause: EventEmitter<boolean>;
125
127
  multiplierChange: EventEmitter<number>;
@@ -165,7 +167,7 @@ declare class TimelineComponent implements OnInit, AfterViewInit, OnChanges, OnD
165
167
  handleToggleSwimLanes(): void;
166
168
  applyMultiplier(m: number, play?: boolean): void;
167
169
  static ɵfac: i0.ɵɵFactoryDeclaration<TimelineComponent, never>;
168
- static ɵcmp: i0.ɵɵComponentDeclaration<TimelineComponent, "ct-timeline", never, { "startTime": { "alias": "startTime"; "required": false; }; "endTime": { "alias": "endTime"; "required": false; }; "currentTime": { "alias": "currentTime"; "required": false; }; "clock": { "alias": "clock"; "required": false; }; "height": { "alias": "height"; "required": false; }; "showControls": { "alias": "showControls"; "required": false; }; "showJumpToStart": { "alias": "showJumpToStart"; "required": false; }; "showJumpToEnd": { "alias": "showJumpToEnd"; "required": false; }; "enableDrag": { "alias": "enableDrag"; "required": false; }; "dateTimeFormat": { "alias": "dateTimeFormat"; "required": false; }; "jumpToTime": { "alias": "jumpToTime"; "required": false; }; "maxTicks": { "alias": "maxTicks"; "required": false; }; "ffSpeeds": { "alias": "ffSpeeds"; "required": false; }; "rwSpeeds": { "alias": "rwSpeeds"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "cssClass": { "alias": "cssClass"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "swimLanes": { "alias": "swimLanes"; "required": false; }; "showSwimLanes": { "alias": "showSwimLanes"; "required": false; }; "swimLaneTransition": { "alias": "swimLaneTransition"; "required": false; }; }, { "timeChange": "timeChange"; "playPause": "playPause"; "multiplierChange": "multiplierChange"; "dateTimeClick": "dateTimeClick"; "showSwimLanesChange": "showSwimLanesChange"; "swimLaneItemClick": "swimLaneItemClick"; "swimLaneItemHover": "swimLaneItemHover"; "swimLaneItemDoubleClick": "swimLaneItemDoubleClick"; "swimLaneItemContextMenu": "swimLaneItemContextMenu"; "swimLaneReorder": "swimLaneReorder"; }, never, never, true, never>;
170
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimelineComponent, "ct-timeline", never, { "startTime": { "alias": "startTime"; "required": false; }; "endTime": { "alias": "endTime"; "required": false; }; "currentTime": { "alias": "currentTime"; "required": false; }; "clock": { "alias": "clock"; "required": false; }; "height": { "alias": "height"; "required": false; }; "showControls": { "alias": "showControls"; "required": false; }; "showJumpToStart": { "alias": "showJumpToStart"; "required": false; }; "showJumpToEnd": { "alias": "showJumpToEnd"; "required": false; }; "enableDrag": { "alias": "enableDrag"; "required": false; }; "dateTimeFormat": { "alias": "dateTimeFormat"; "required": false; }; "jumpToTime": { "alias": "jumpToTime"; "required": false; }; "maxTicks": { "alias": "maxTicks"; "required": false; }; "ffSpeeds": { "alias": "ffSpeeds"; "required": false; }; "rwSpeeds": { "alias": "rwSpeeds"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "cssClass": { "alias": "cssClass"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "swimLanes": { "alias": "swimLanes"; "required": false; }; "showSwimLanes": { "alias": "showSwimLanes"; "required": false; }; "swimLaneTransition": { "alias": "swimLaneTransition"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, { "timeChange": "timeChange"; "playPause": "playPause"; "multiplierChange": "multiplierChange"; "dateTimeClick": "dateTimeClick"; "showSwimLanesChange": "showSwimLanesChange"; "swimLaneItemClick": "swimLaneItemClick"; "swimLaneItemHover": "swimLaneItemHover"; "swimLaneItemDoubleClick": "swimLaneItemDoubleClick"; "swimLaneItemContextMenu": "swimLaneItemContextMenu"; "swimLaneReorder": "swimLaneReorder"; }, never, never, true, never>;
169
171
  }
170
172
 
171
173
  declare class TimelineControlsComponent implements AfterViewInit, OnDestroy {
@@ -181,6 +183,7 @@ declare class TimelineControlsComponent implements AfterViewInit, OnDestroy {
181
183
  showJumpToEnd?: boolean;
182
184
  theme: TimelineTheme;
183
185
  swimLanesVisible?: boolean;
186
+ labels?: Partial<TimelineLabels>;
184
187
  dateTimeClick: EventEmitter<void>;
185
188
  playPause: EventEmitter<boolean>;
186
189
  jumpToStart: EventEmitter<void>;
@@ -203,10 +206,14 @@ declare class TimelineControlsComponent implements AfterViewInit, OnDestroy {
203
206
  get formattedTime(): string;
204
207
  get formattedDate(): string;
205
208
  get timezoneAbbr(): string | null;
209
+ /** Merged labels — defaults overridden by whatever the consumer provides. */
210
+ get l(): Required<TimelineLabels>;
211
+ resolveRewindActive(multiplier: number): string;
212
+ resolveFastForwardActive(multiplier: number): string;
206
213
  ngAfterViewInit(): void;
207
214
  ngOnDestroy(): void;
208
215
  static ɵfac: i0.ɵɵFactoryDeclaration<TimelineControlsComponent, never>;
209
- static ɵcmp: i0.ɵɵComponentDeclaration<TimelineControlsComponent, "ct-timeline-controls", never, { "currentTime": { "alias": "currentTime"; "required": false; }; "isPlaying": { "alias": "isPlaying"; "required": false; }; "multiplier": { "alias": "multiplier"; "required": false; }; "dateTimeFormat": { "alias": "dateTimeFormat"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "isLive": { "alias": "isLive"; "required": false; }; "hasStartTime": { "alias": "hasStartTime"; "required": false; }; "hasEndTime": { "alias": "hasEndTime"; "required": false; }; "showJumpToStart": { "alias": "showJumpToStart"; "required": false; }; "showJumpToEnd": { "alias": "showJumpToEnd"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "swimLanesVisible": { "alias": "swimLanesVisible"; "required": false; }; }, { "dateTimeClick": "dateTimeClick"; "playPause": "playPause"; "jumpToStart": "jumpToStart"; "rewind": "rewind"; "fastForward": "fastForward"; "jumpToEnd": "jumpToEnd"; "jumpToLive": "jumpToLive"; "resetSpeed": "resetSpeed"; "toggleSwimLanes": "toggleSwimLanes"; }, never, never, true, never>;
216
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimelineControlsComponent, "ct-timeline-controls", never, { "currentTime": { "alias": "currentTime"; "required": false; }; "isPlaying": { "alias": "isPlaying"; "required": false; }; "multiplier": { "alias": "multiplier"; "required": false; }; "dateTimeFormat": { "alias": "dateTimeFormat"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "isLive": { "alias": "isLive"; "required": false; }; "hasStartTime": { "alias": "hasStartTime"; "required": false; }; "hasEndTime": { "alias": "hasEndTime"; "required": false; }; "showJumpToStart": { "alias": "showJumpToStart"; "required": false; }; "showJumpToEnd": { "alias": "showJumpToEnd"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "swimLanesVisible": { "alias": "swimLanesVisible"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, { "dateTimeClick": "dateTimeClick"; "playPause": "playPause"; "jumpToStart": "jumpToStart"; "rewind": "rewind"; "fastForward": "fastForward"; "jumpToEnd": "jumpToEnd"; "jumpToLive": "jumpToLive"; "resetSpeed": "resetSpeed"; "toggleSwimLanes": "toggleSwimLanes"; }, never, never, true, never>;
210
217
  }
211
218
 
212
219
  export { TimelineCanvasComponent, TimelineComponent, TimelineControlsComponent };