phoenix-ui-components 4.0.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,31 +1,34 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, EventEmitter, ElementRef, ChangeDetectorRef, NgZone, OnDestroy, ComponentRef, AfterViewInit, QueryList, OnChanges, SimpleChanges, PipeTransform } from '@angular/core';
3
- import * as i71 from '@angular/material/checkbox';
2
+ import { OnInit, EventEmitter, ElementRef, ChangeDetectorRef, OnDestroy, NgZone, ComponentRef, AfterViewInit, QueryList, OnChanges, SimpleChanges, PipeTransform } from '@angular/core';
3
+ import * as i76 from '@angular/material/checkbox';
4
4
  import { MatCheckboxChange } from '@angular/material/checkbox';
5
5
  import * as phoenix_event_display from 'phoenix-event-display';
6
- import { PhoenixMenuNode, EventDisplay, Configuration, AnimationPreset, PrettySymbols, ActiveVariable, PresetView, KinematicsConfig, MasterclassConfig, EventSummary, KinematicsColumn, TaggedParticle, ParticleTagDef } from 'phoenix-event-display';
7
- import * as i65 from '@angular/cdk/overlay';
8
- import { Overlay } from '@angular/cdk/overlay';
9
- import { Object3D, Object3DEventMap, Vector3 } from 'three';
10
- import * as i62 from '@angular/material/dialog';
6
+ import { PhoenixMenuNode, EventDisplay, Configuration, AnimationPreset, PrettySymbols, ActiveVariable, PresetView, KinematicsConfig, MasterclassConfig, EventSummary, KinematicsColumn, TaggedParticle, ParticleTagDef, SessionState } from 'phoenix-event-display';
7
+ import * as i67 from '@angular/material/dialog';
11
8
  import { MatDialog, MatDialogRef } from '@angular/material/dialog';
12
- import { Subscription } from 'rxjs';
13
- import * as i67 from '@angular/material/menu';
9
+ import * as i62 from '@angular/material/snack-bar';
10
+ import { MatSnackBar } from '@angular/material/snack-bar';
11
+ import { Observable, Subscription } from 'rxjs';
12
+ import * as i70 from '@angular/cdk/overlay';
13
+ import { Overlay, GlobalPositionStrategy } from '@angular/cdk/overlay';
14
+ import { Object3D, Object3DEventMap, Vector3 } from 'three';
15
+ import * as i72 from '@angular/material/menu';
14
16
  import { MatMenuTrigger } from '@angular/material/menu';
15
- import * as i73 from '@angular/cdk/tree';
17
+ import * as i78 from '@angular/cdk/tree';
16
18
  import { NestedTreeControl } from '@angular/cdk/tree';
17
19
  import { MatTreeNestedDataSource } from '@angular/material/tree';
18
- import * as i59 from '@angular/common';
19
- import * as i60 from '@angular/router';
20
- import * as i61 from '@angular/cdk/drag-drop';
21
- import * as i63 from '@angular/material/button';
22
- import * as i64 from '@angular/material/tooltip';
23
- import * as i66 from '@angular/forms';
24
- import * as i68 from '@angular/material/radio';
25
- import * as i69 from '@angular/material/slider';
26
- import * as i70 from '@angular/material/slide-toggle';
27
- import * as i72 from '@angular/material/icon';
28
- import * as i74 from '@angular/material/tabs';
20
+ import * as i64 from '@angular/common';
21
+ import * as i65 from '@angular/router';
22
+ import * as i66 from '@angular/cdk/drag-drop';
23
+ import * as i68 from '@angular/material/button';
24
+ import * as i69 from '@angular/material/tooltip';
25
+ import * as i71 from '@angular/forms';
26
+ import * as i73 from '@angular/material/radio';
27
+ import * as i74 from '@angular/material/slider';
28
+ import * as i75 from '@angular/material/slide-toggle';
29
+ import * as i77 from '@angular/material/icon';
30
+ import * as i79 from '@angular/material/tabs';
31
+ import * as i80 from '@angular/material/progress-bar';
29
32
 
30
33
  declare class NavComponent implements OnInit {
31
34
  constructor();
@@ -56,6 +59,17 @@ declare class PhoenixMenuItemComponent {
56
59
  phoenixMenuItem: ElementRef<HTMLDivElement>;
57
60
  configTop: number;
58
61
  constructor(cdr: ChangeDetectorRef);
62
+ /**
63
+ * Whether a node is a leaf holding only configs (like the collections'
64
+ * "Draw/Cut/Color Options"), which is displayed as a compact icon button
65
+ * in a toolbar instead of a full menu row.
66
+ */
67
+ isCompactOptionsNode(node: PhoenixMenuNode): boolean;
68
+ get isCompact(): boolean;
69
+ /** Label for the compact icon button, e.g. "Draw Options" -> "Draw". */
70
+ get compactLabel(): string;
71
+ get compactChildren(): PhoenixMenuNode[];
72
+ get regularChildren(): PhoenixMenuNode[];
59
73
  calculateConfigTop(): void;
60
74
  castConfigsToAny(configs: PhoenixMenuNode['configs']): any[];
61
75
  static ɵfac: i0.ɵɵFactoryDeclaration<PhoenixMenuItemComponent, never>;
@@ -63,11 +77,110 @@ declare class PhoenixMenuItemComponent {
63
77
  }
64
78
 
65
79
  declare class PhoenixMenuComponent {
80
+ private dialog;
66
81
  rootNode: PhoenixMenuNode;
82
+ constructor(dialog: MatDialog);
83
+ openShortcutsDialog(): void;
67
84
  static ɵfac: i0.ɵɵFactoryDeclaration<PhoenixMenuComponent, never>;
68
85
  static ɵcmp: i0.ɵɵComponentDeclaration<PhoenixMenuComponent, "app-phoenix-menu", never, { "rootNode": { "alias": "rootNode"; "required": false; }; }, {}, never, never, false, never>;
69
86
  }
70
87
 
88
+ declare class ShortcutsDialogComponent {
89
+ dialogRef: MatDialogRef<ShortcutsDialogComponent>;
90
+ constructor(dialogRef: MatDialogRef<ShortcutsDialogComponent>);
91
+ onClose(): void;
92
+ static ɵfac: i0.ɵɵFactoryDeclaration<ShortcutsDialogComponent, never>;
93
+ static ɵcmp: i0.ɵɵComponentDeclaration<ShortcutsDialogComponent, "app-shortcuts-dialog", never, {}, {}, never, never, false, never>;
94
+ }
95
+
96
+ /** Severity levels for notifications. */
97
+ type NotificationSeverity = 'success' | 'info' | 'warning' | 'error';
98
+ /** A notification message with severity and content. */
99
+ interface Notification {
100
+ /** The message to display to the user. */
101
+ message: string;
102
+ /** The severity level of the notification. */
103
+ severity: NotificationSeverity;
104
+ /** Duration in milliseconds before auto-dismiss. 0 means no auto-dismiss. */
105
+ duration: number;
106
+ }
107
+ /**
108
+ * Service for displaying user-facing notifications with severity levels.
109
+ * Provides success, info, warning, and error notifications with
110
+ * configurable auto-dismiss durations. Replaces silent console errors
111
+ * with actionable user feedback across all Phoenix components.
112
+ */
113
+ declare class NotificationService {
114
+ /** Default auto-dismiss durations in milliseconds per severity level. */
115
+ private readonly defaultDurations;
116
+ /** Active variable that stores the latest notification. */
117
+ private notification;
118
+ /**
119
+ * Subscribe to incoming notifications.
120
+ * @param callback Function called when a notification is emitted.
121
+ * @returns A function that can be called to unsubscribe.
122
+ */
123
+ subscribeToNotifications(callback: (notification: Notification) => void): () => void;
124
+ /**
125
+ * Display a success notification.
126
+ * Auto-dismisses after 5 seconds by default.
127
+ * @param message The message to display.
128
+ * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
129
+ */
130
+ success(message: string, duration?: number): void;
131
+ /**
132
+ * Display an info notification.
133
+ * Auto-dismisses after 5 seconds by default.
134
+ * @param message The message to display.
135
+ * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
136
+ */
137
+ info(message: string, duration?: number): void;
138
+ /**
139
+ * Display a warning notification.
140
+ * Auto-dismisses after 8 seconds by default.
141
+ * @param message The message to display.
142
+ * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
143
+ */
144
+ warning(message: string, duration?: number): void;
145
+ /**
146
+ * Display an error notification.
147
+ * Does not auto-dismiss by default — requires manual dismissal.
148
+ * @param message The message to display.
149
+ * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
150
+ */
151
+ error(message: string, duration?: number): void;
152
+ /**
153
+ * Internal method to emit a notification.
154
+ * @param message The message to display.
155
+ * @param severity The severity level.
156
+ * @param duration Optional custom duration override.
157
+ */
158
+ private notify;
159
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
160
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
161
+ }
162
+
163
+ /**
164
+ * Component that subscribes to NotificationService and displays
165
+ * transient toast notifications via MatSnackBar.
166
+ *
167
+ * Severity levels map to CSS panel classes:
168
+ * - success → notification-success
169
+ * - info → notification-info
170
+ * - warning → notification-warning
171
+ * - error → notification-error
172
+ */
173
+ declare class NotificationToastComponent implements OnInit, OnDestroy {
174
+ private notificationService;
175
+ private snackBar;
176
+ private unsubscribe;
177
+ constructor(notificationService: NotificationService, snackBar: MatSnackBar);
178
+ ngOnInit(): void;
179
+ ngOnDestroy(): void;
180
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationToastComponent, never>;
181
+ static ɵcmp: i0.ɵɵComponentDeclaration<NotificationToastComponent, "app-notification-toast", never, {}, {}, never, never, false, never>;
182
+ }
183
+
71
184
  /**
72
185
  * Service for all event display related functions.
73
186
  */
@@ -101,19 +214,47 @@ declare const defaultAnimationPresets: {
101
214
  };
102
215
  declare class AnimateCameraComponent {
103
216
  private eventDisplay;
217
+ private dialog;
104
218
  animationPresets: {
105
219
  [key: string]: AnimationPreset;
106
220
  };
107
221
  animationPresetsKeys: string[];
108
222
  isAnimating: boolean;
109
- constructor(eventDisplay: EventDisplayService);
110
- animatePreset(preset: string): void;
111
- animateCamera(): void;
223
+ constructor(eventDisplay: EventDisplayService, dialog: MatDialog);
224
+ playPreset(preset: string): void;
225
+ playAnimateCamera(): void;
226
+ downloadAnimation(preset?: string): void;
227
+ /**
228
+ * Animate through the given preset.
229
+ * @returns Whether the animation was started.
230
+ */
231
+ animatePreset(preset: string, onEnd?: () => void): boolean;
232
+ /**
233
+ * Animate the camera through the event.
234
+ * @returns Whether the animation was started. It is refused while another
235
+ * animation is already running.
236
+ */
237
+ animateCamera(onEnd?: () => void): boolean;
112
238
  private setDetectorOpacity;
113
239
  static ɵfac: i0.ɵɵFactoryDeclaration<AnimateCameraComponent, never>;
114
240
  static ɵcmp: i0.ɵɵComponentDeclaration<AnimateCameraComponent, "app-animate-camera", never, { "animationPresets": { "alias": "animationPresets"; "required": false; }; }, {}, never, never, false, never>;
115
241
  }
116
242
 
243
+ declare class DownloadAnimationDialogComponent implements OnInit, OnDestroy {
244
+ data: {
245
+ progress$: Observable<number>;
246
+ };
247
+ progress: number;
248
+ private progressSub?;
249
+ constructor(data: {
250
+ progress$: Observable<number>;
251
+ });
252
+ ngOnInit(): void;
253
+ ngOnDestroy(): void;
254
+ static ɵfac: i0.ɵɵFactoryDeclaration<DownloadAnimationDialogComponent, never>;
255
+ static ɵcmp: i0.ɵɵComponentDeclaration<DownloadAnimationDialogComponent, "app-download-animation-dialog", never, {}, {}, never, never, false, never>;
256
+ }
257
+
117
258
  declare class AnimateEventComponent {
118
259
  private eventDisplay;
119
260
  isAnimating: boolean;
@@ -164,6 +305,7 @@ declare class CollectionsInfoOverlayComponent implements OnInit, OnDestroy {
164
305
  enableHighlighting(): void;
165
306
  disableHighlighting(): void;
166
307
  toggleInvisible(checked: boolean): void;
308
+ formatValue(value: any): string;
167
309
  addLabel(index: number, uuid: string): void;
168
310
  private getEventDataGroup;
169
311
  static ɵfac: i0.ɵɵFactoryDeclaration<CollectionsInfoOverlayComponent, never>;
@@ -276,11 +418,24 @@ declare class InfoPanelOverlayComponent implements OnInit {
276
418
  static ɵcmp: i0.ɵɵComponentDeclaration<InfoPanelOverlayComponent, "app-info-panel-overlay", never, { "showInfoPanel": { "alias": "showInfoPanel"; "required": false; }; }, {}, never, never, false, never>;
277
419
  }
278
420
 
421
+ declare class OverlayCascadeService {
422
+ private overlay;
423
+ private cascadeCount;
424
+ private topOffset;
425
+ private leftOffset;
426
+ private step;
427
+ constructor(overlay: Overlay);
428
+ getCascadePositionStrategy(): GlobalPositionStrategy;
429
+ static ɵfac: i0.ɵɵFactoryDeclaration<OverlayCascadeService, never>;
430
+ static ɵprov: i0.ɵɵInjectableDeclaration<OverlayCascadeService>;
431
+ }
432
+
279
433
  /**
280
434
  * Component for toggling info panel overlay
281
435
  */
282
436
  declare class InfoPanelComponent implements OnInit, OnDestroy {
283
437
  private overlay;
438
+ private overlayCascade;
284
439
  /** @ignore */
285
440
  showInfoPanel: boolean;
286
441
  /** Information panel overlay window */
@@ -289,7 +444,7 @@ declare class InfoPanelComponent implements OnInit, OnDestroy {
289
444
  * Create the info panel toggle
290
445
  * @param overlay Info panel overlay containing logger data
291
446
  */
292
- constructor(overlay: Overlay);
447
+ constructor(overlay: Overlay, overlayCascade: OverlayCascadeService);
293
448
  /**
294
449
  * Create the info panel overlay
295
450
  */
@@ -311,6 +466,7 @@ declare enum EventDataFormat {
311
466
  EDM4HEPJSON = "EDM4HEPJSON",
312
467
  JIVEXML = "JIVEXML",
313
468
  PHYSLITE = "PHYSLITE",
469
+ ATLASESD = "ATLASESD",
314
470
  IG = "IG",
315
471
  ZIP = "ZIP"
316
472
  }
@@ -335,10 +491,11 @@ declare class IoOptionsComponent {
335
491
  declare class IOOptionsDialogComponent implements OnInit {
336
492
  private eventDisplay;
337
493
  dialogRef: MatDialogRef<IOOptionsDialogComponent>;
494
+ private notificationService;
338
495
  eventDataImportOptions: EventDataImportOption[];
339
496
  eventDataOptionsWithHandler: ImportOption[];
340
497
  private supportedEventDataFormats;
341
- constructor(eventDisplay: EventDisplayService, dialogRef: MatDialogRef<IOOptionsDialogComponent>);
498
+ constructor(eventDisplay: EventDisplayService, dialogRef: MatDialogRef<IOOptionsDialogComponent>, notificationService: NotificationService);
342
499
  ngOnInit(): void;
343
500
  getSupportedEventDataFormats(): string;
344
501
  onClose(): void;
@@ -353,6 +510,7 @@ declare class IOOptionsDialogComponent implements OnInit {
353
510
  handleROOTInput(files: FileList): Promise<void>;
354
511
  handleRootJSONInput(files: FileList): Promise<void>;
355
512
  handlePHYSLITEInput(files: FileList): Promise<void>;
513
+ handleATLASESDInput(files: FileList): Promise<void>;
356
514
  handleIgEventDataInput(files: FileList): void;
357
515
  handleZipEventDataInput(files: FileList): Promise<void>;
358
516
  handleFileInput(file: File, extensions: string, callback: (result: string, fileName?: string) => void): void;
@@ -426,12 +584,15 @@ declare class ObjectSelectionComponent implements OnInit, OnDestroy {
426
584
  /**
427
585
  * Component for overlay panel.
428
586
  */
429
- declare class OverlayComponent implements AfterViewInit, OnDestroy {
587
+ declare class OverlayComponent implements OnInit, AfterViewInit, OnDestroy {
430
588
  private eventDisplay;
589
+ private elementRef;
431
590
  /** Title of the overlay. */
432
591
  overlayTitle: string;
433
592
  /** If the overlay is open or not. */
434
- active: boolean;
593
+ private _active;
594
+ set active(value: boolean);
595
+ get active(): boolean;
435
596
  /** Icon of the overlay header. */
436
597
  icon: string;
437
598
  /** If the overlay is resizable. */
@@ -456,7 +617,11 @@ declare class OverlayComponent implements AfterViewInit, OnDestroy {
456
617
  private MIN_RES_WIDTH;
457
618
  /** Minimum resizable height */
458
619
  private MIN_RES_HEIGHT;
459
- constructor(eventDisplay: EventDisplayService);
620
+ constructor(eventDisplay: EventDisplayService, elementRef: ElementRef);
621
+ ngOnInit(): void;
622
+ toggleBodyAndEmit(): void;
623
+ /** Bring the overlay to the front. */
624
+ bringToFront(): void;
460
625
  /**
461
626
  * Move the resizable handle to the bottom right after the component is created.
462
627
  */
@@ -566,7 +731,7 @@ declare class ViewOptionsComponent implements OnInit, OnDestroy {
566
731
  static ɵcmp: i0.ɵɵComponentDeclaration<ViewOptionsComponent, "app-view-options", never, {}, {}, never, never, false, never>;
567
732
  }
568
733
 
569
- declare class CartesianGridConfigComponent implements OnInit {
734
+ declare class CartesianGridConfigComponent implements OnInit, OnDestroy {
570
735
  data: {
571
736
  gridVisible: boolean;
572
737
  scale: number;
@@ -596,6 +761,11 @@ declare class CartesianGridConfigComponent implements OnInit {
596
761
  onClose(): void;
597
762
  onSave(x: any, y: any, z: any): void;
598
763
  shiftCartesianGridByPointer(): void;
764
+ /**
765
+ * Unsubscribe from the grid-shifting subscriptions, if any are active.
766
+ */
767
+ private clearShiftSubscriptions;
768
+ ngOnDestroy(): void;
599
769
  shiftCartesianGridByValues(position: Vector3): void;
600
770
  translateGrid(position: Vector3): void;
601
771
  addXYPlanes(zDistance: Event): void;
@@ -768,6 +938,8 @@ declare class ShareLinkDialogComponent implements AfterViewInit, OnDestroy {
768
938
  state: string;
769
939
  hideWidgets: boolean;
770
940
  embed: boolean;
941
+ replay: string;
942
+ session: string;
771
943
  };
772
944
  qrcodeCanvas: ElementRef<HTMLCanvasElement>;
773
945
  private unsubscribe;
@@ -1042,9 +1214,10 @@ declare class EtaPhiPanelOverlayComponent implements OnInit, OnDestroy, AfterVie
1042
1214
 
1043
1215
  declare class EtaPhiPanelComponent implements OnInit, OnDestroy {
1044
1216
  private overlay;
1217
+ private overlayCascade;
1045
1218
  showPanel: boolean;
1046
1219
  overlayWindow: ComponentRef<EtaPhiPanelOverlayComponent>;
1047
- constructor(overlay: Overlay);
1220
+ constructor(overlay: Overlay, overlayCascade: OverlayCascadeService);
1048
1221
  ngOnInit(): void;
1049
1222
  ngOnDestroy(): void;
1050
1223
  toggleOverlay(): void;
@@ -1121,10 +1294,11 @@ declare class KinematicsPanelOverlayComponent implements OnInit, OnDestroy {
1121
1294
 
1122
1295
  declare class KinematicsPanelComponent implements OnInit, OnDestroy, OnChanges {
1123
1296
  private overlay;
1297
+ private overlayCascade;
1124
1298
  showKinematics: boolean;
1125
1299
  overlayWindow: ComponentRef<KinematicsPanelOverlayComponent>;
1126
1300
  config?: KinematicsConfig;
1127
- constructor(overlay: Overlay);
1301
+ constructor(overlay: Overlay, overlayCascade: OverlayCascadeService);
1128
1302
  ngOnInit(): void;
1129
1303
  ngOnChanges(changes: SimpleChanges): void;
1130
1304
  ngOnDestroy(): void;
@@ -1232,6 +1406,82 @@ declare class MasterclassPanelComponent implements OnInit, OnDestroy, OnChanges
1232
1406
  static ɵcmp: i0.ɵɵComponentDeclaration<MasterclassPanelComponent, "app-masterclass-panel", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, false, never>;
1233
1407
  }
1234
1408
 
1409
+ /**
1410
+ * Floating session pill (#883). Renders only while the session manager is
1411
+ * recording, paused, finished, or playing a replay. Idle state hides the
1412
+ * pill entirely so it adds zero footprint to the toolbar.
1413
+ */
1414
+ declare class SessionPillComponent implements OnInit, OnDestroy {
1415
+ private eventDisplay;
1416
+ private cdr;
1417
+ /** Current session-manager state, kept in component for template binding. */
1418
+ state: SessionState;
1419
+ /** Cached duration label for the recording elapsed clock. */
1420
+ durationLabel: string;
1421
+ /** Cached current/total label for the playback clock. */
1422
+ playbackLabel: string;
1423
+ /** Cached event count for the recording badge. */
1424
+ eventCount: number;
1425
+ /** Last computed scrub percent (0-100). */
1426
+ scrubPercent: number;
1427
+ /** Saved copy-link feedback flag (resets after a tick). */
1428
+ linkCopied: boolean;
1429
+ /** Available playback speeds for the speed selector. */
1430
+ speeds: readonly (1 | 2 | 4 | 0.5)[];
1431
+ private sessionManager;
1432
+ private unsubscribeState;
1433
+ private recordingClockId;
1434
+ private copiedResetTimer;
1435
+ constructor(eventDisplay: EventDisplayService, cdr: ChangeDetectorRef);
1436
+ ngOnInit(): void;
1437
+ ngOnDestroy(): void;
1438
+ /** True when the pill should be visible. Idle state hides it. */
1439
+ get visible(): boolean;
1440
+ /** Stop an active recording from the pill's stop button. */
1441
+ onStopRecording(): void;
1442
+ /** Dismiss a recorded/finished/errored state and return to idle. */
1443
+ onDismiss(): void;
1444
+ /** Start a pending (link-supplied) session after explicit user confirmation. */
1445
+ onPlayPending(): void;
1446
+ /** Source label + duration/event summary for the pending confirm prompt. */
1447
+ get pendingSummary(): string;
1448
+ /** Toggle play/pause on the active player. */
1449
+ onTogglePlayback(): void;
1450
+ /** Scrub to the playhead position the user clicked. */
1451
+ onScrub(value: number): void;
1452
+ /** Change the active player's speed. */
1453
+ onSpeed(speed: 0.5 | 1 | 2 | 4): void;
1454
+ /** Download the recorded session as a .phnxreplay JSON file. */
1455
+ onDownload(): void;
1456
+ /**
1457
+ * Copy a ?replay=... share link to the clipboard. The base64 is precomputed
1458
+ * when recording stops, so the common path writes synchronously inside the
1459
+ * click gesture (the async Clipboard API rejects writes that happen after an
1460
+ * await, which expires the user activation). Falls back to execCommand.
1461
+ */
1462
+ onCopyLink(): void;
1463
+ /** Build the share URL for a base64 payload and copy it to the clipboard. */
1464
+ private copyShareLink;
1465
+ /**
1466
+ * Legacy clipboard copy via a temporary textarea + execCommand. Used as a
1467
+ * fallback when the async Clipboard API is unavailable or rejected. Mirrors
1468
+ * the share-link dialog's proven approach.
1469
+ * @param text The text to copy.
1470
+ * @returns True if the copy command reported success.
1471
+ */
1472
+ private legacyCopy;
1473
+ /** Active player duration (ms) for the scrub bar max value. */
1474
+ get playerDuration(): number;
1475
+ /** Active player current speed for the selector highlight. */
1476
+ get currentSpeed(): number;
1477
+ private refreshDerived;
1478
+ private startRecordingClock;
1479
+ private stopRecordingClock;
1480
+ private updateRecordingDerived;
1481
+ static ɵfac: i0.ɵɵFactoryDeclaration<SessionPillComponent, never>;
1482
+ static ɵcmp: i0.ɵɵComponentDeclaration<SessionPillComponent, "app-session-pill", never, {}, {}, never, never, false, never>;
1483
+ }
1484
+
1235
1485
  declare class ErrorMessageService {
1236
1486
  /** A variable that stores the latest error thrown. */
1237
1487
  private error;
@@ -1297,76 +1547,9 @@ declare class AttributePipe implements PipeTransform {
1297
1547
 
1298
1548
  declare class PhoenixUIModule {
1299
1549
  static ɵfac: i0.ɵɵFactoryDeclaration<PhoenixUIModule, never>;
1300
- static ɵmod: i0.ɵɵNgModuleDeclaration<PhoenixUIModule, [typeof NavComponent, typeof UiMenuWrapperComponent, typeof UiMenuComponent, typeof MoreInfoComponent, typeof CollectionsInfoComponent, typeof GeometryBrowserComponent, typeof GeometryBrowserOverlayComponent, typeof MenuToggleComponent, typeof CollectionsInfoOverlayComponent, typeof IoOptionsComponent, typeof IOOptionsDialogComponent, typeof OverlayViewComponent, typeof ObjectSelectionComponent, typeof ObjectSelectionOverlayComponent, typeof EventSelectorComponent, typeof ObjectClippingComponent, typeof DarkThemeComponent, typeof AutoRotateComponent, typeof ViewOptionsComponent, typeof CartesianGridConfigComponent, typeof OverlayViewWindowComponent, typeof OverlayComponent, typeof ExperimentInfoComponent, typeof InfoPanelComponent, typeof InfoPanelOverlayComponent, typeof MainViewToggleComponent, typeof ZoomControlsComponent, typeof TreeMenuComponent, typeof TreeMenuItemComponent, typeof PhoenixMenuComponent, typeof PhoenixMenuItemComponent, typeof ConfigSliderComponent, typeof AnimateCameraComponent, typeof AnimateEventComponent, typeof VrToggleComponent, typeof ArToggleComponent, typeof SSModeComponent, typeof MakePictureComponent, typeof PerformanceToggleComponent, typeof LoaderComponent, typeof ShareLinkComponent, typeof ShareLinkDialogComponent, typeof EmbedMenuComponent, typeof ExperimentLinkComponent, typeof EventDataExplorerComponent, typeof EventDataExplorerDialogComponent, typeof FileExplorerComponent, typeof RingLoaderComponent, typeof CycleEventsComponent, typeof EventBrowserComponent, typeof EventBrowserOverlayComponent, typeof EtaPhiPanelComponent, typeof EtaPhiPanelOverlayComponent, typeof KinematicsPanelComponent, typeof KinematicsPanelOverlayComponent, typeof MasterclassPanelComponent, typeof MasterclassPanelOverlayComponent], [typeof AttributePipe, typeof i59.CommonModule, typeof i60.RouterModule, typeof i61.DragDropModule, typeof i62.MatDialogModule, typeof i63.MatButtonModule, typeof i64.MatTooltipModule, typeof i65.OverlayModule, typeof i66.FormsModule, typeof i66.ReactiveFormsModule, typeof i67.MatMenuModule, typeof i68.MatRadioModule, typeof i69.MatSliderModule, typeof i70.MatSlideToggleModule, typeof i71.MatCheckboxModule, typeof i72.MatIconModule, typeof i73.CdkTreeModule, typeof i74.MatTabsModule], [typeof NavComponent, typeof UiMenuWrapperComponent, typeof UiMenuComponent, typeof MoreInfoComponent, typeof CollectionsInfoComponent, typeof GeometryBrowserComponent, typeof GeometryBrowserOverlayComponent, typeof MenuToggleComponent, typeof CollectionsInfoOverlayComponent, typeof IoOptionsComponent, typeof IOOptionsDialogComponent, typeof OverlayViewComponent, typeof ObjectSelectionComponent, typeof ObjectSelectionOverlayComponent, typeof EventSelectorComponent, typeof ObjectClippingComponent, typeof DarkThemeComponent, typeof AutoRotateComponent, typeof ViewOptionsComponent, typeof CartesianGridConfigComponent, typeof OverlayViewWindowComponent, typeof OverlayComponent, typeof ExperimentInfoComponent, typeof InfoPanelComponent, typeof InfoPanelOverlayComponent, typeof MainViewToggleComponent, typeof ZoomControlsComponent, typeof TreeMenuComponent, typeof TreeMenuItemComponent, typeof PhoenixMenuComponent, typeof PhoenixMenuItemComponent, typeof ConfigSliderComponent, typeof AnimateCameraComponent, typeof AnimateEventComponent, typeof VrToggleComponent, typeof ArToggleComponent, typeof SSModeComponent, typeof MakePictureComponent, typeof PerformanceToggleComponent, typeof LoaderComponent, typeof ShareLinkComponent, typeof ShareLinkDialogComponent, typeof EmbedMenuComponent, typeof ExperimentLinkComponent, typeof EventDataExplorerComponent, typeof EventDataExplorerDialogComponent, typeof FileExplorerComponent, typeof RingLoaderComponent, typeof CycleEventsComponent, typeof EventBrowserComponent, typeof EventBrowserOverlayComponent, typeof EtaPhiPanelComponent, typeof EtaPhiPanelOverlayComponent, typeof KinematicsPanelComponent, typeof KinematicsPanelOverlayComponent, typeof MasterclassPanelComponent, typeof MasterclassPanelOverlayComponent, typeof AttributePipe]>;
1550
+ static ɵmod: i0.ɵɵNgModuleDeclaration<PhoenixUIModule, [typeof NotificationToastComponent, typeof NavComponent, typeof UiMenuWrapperComponent, typeof UiMenuComponent, typeof MoreInfoComponent, typeof CollectionsInfoComponent, typeof GeometryBrowserComponent, typeof GeometryBrowserOverlayComponent, typeof MenuToggleComponent, typeof CollectionsInfoOverlayComponent, typeof IoOptionsComponent, typeof IOOptionsDialogComponent, typeof OverlayViewComponent, typeof ObjectSelectionComponent, typeof ObjectSelectionOverlayComponent, typeof EventSelectorComponent, typeof ObjectClippingComponent, typeof DarkThemeComponent, typeof AutoRotateComponent, typeof ViewOptionsComponent, typeof CartesianGridConfigComponent, typeof OverlayViewWindowComponent, typeof OverlayComponent, typeof ExperimentInfoComponent, typeof InfoPanelComponent, typeof InfoPanelOverlayComponent, typeof MainViewToggleComponent, typeof ZoomControlsComponent, typeof TreeMenuComponent, typeof TreeMenuItemComponent, typeof PhoenixMenuComponent, typeof PhoenixMenuItemComponent, typeof ConfigSliderComponent, typeof AnimateCameraComponent, typeof DownloadAnimationDialogComponent, typeof AnimateEventComponent, typeof VrToggleComponent, typeof ArToggleComponent, typeof SSModeComponent, typeof MakePictureComponent, typeof PerformanceToggleComponent, typeof LoaderComponent, typeof ShareLinkComponent, typeof ShareLinkDialogComponent, typeof EmbedMenuComponent, typeof ExperimentLinkComponent, typeof EventDataExplorerComponent, typeof EventDataExplorerDialogComponent, typeof FileExplorerComponent, typeof RingLoaderComponent, typeof CycleEventsComponent, typeof EventBrowserComponent, typeof EventBrowserOverlayComponent, typeof EtaPhiPanelComponent, typeof EtaPhiPanelOverlayComponent, typeof KinematicsPanelComponent, typeof KinematicsPanelOverlayComponent, typeof MasterclassPanelComponent, typeof MasterclassPanelOverlayComponent, typeof SessionPillComponent, typeof ShortcutsDialogComponent], [typeof i62.MatSnackBarModule, typeof AttributePipe, typeof i64.CommonModule, typeof i65.RouterModule, typeof i66.DragDropModule, typeof i67.MatDialogModule, typeof i68.MatButtonModule, typeof i69.MatTooltipModule, typeof i70.OverlayModule, typeof i71.FormsModule, typeof i71.ReactiveFormsModule, typeof i72.MatMenuModule, typeof i73.MatRadioModule, typeof i74.MatSliderModule, typeof i75.MatSlideToggleModule, typeof i76.MatCheckboxModule, typeof i77.MatIconModule, typeof i78.CdkTreeModule, typeof i79.MatTabsModule, typeof i80.MatProgressBarModule], [typeof NotificationToastComponent, typeof NavComponent, typeof UiMenuWrapperComponent, typeof UiMenuComponent, typeof MoreInfoComponent, typeof CollectionsInfoComponent, typeof GeometryBrowserComponent, typeof GeometryBrowserOverlayComponent, typeof MenuToggleComponent, typeof CollectionsInfoOverlayComponent, typeof IoOptionsComponent, typeof IOOptionsDialogComponent, typeof OverlayViewComponent, typeof ObjectSelectionComponent, typeof ObjectSelectionOverlayComponent, typeof EventSelectorComponent, typeof ObjectClippingComponent, typeof DarkThemeComponent, typeof AutoRotateComponent, typeof ViewOptionsComponent, typeof CartesianGridConfigComponent, typeof OverlayViewWindowComponent, typeof OverlayComponent, typeof ExperimentInfoComponent, typeof InfoPanelComponent, typeof InfoPanelOverlayComponent, typeof MainViewToggleComponent, typeof ZoomControlsComponent, typeof TreeMenuComponent, typeof TreeMenuItemComponent, typeof PhoenixMenuComponent, typeof PhoenixMenuItemComponent, typeof ConfigSliderComponent, typeof AnimateCameraComponent, typeof DownloadAnimationDialogComponent, typeof AnimateEventComponent, typeof VrToggleComponent, typeof ArToggleComponent, typeof SSModeComponent, typeof MakePictureComponent, typeof PerformanceToggleComponent, typeof LoaderComponent, typeof ShareLinkComponent, typeof ShareLinkDialogComponent, typeof EmbedMenuComponent, typeof ExperimentLinkComponent, typeof EventDataExplorerComponent, typeof EventDataExplorerDialogComponent, typeof FileExplorerComponent, typeof RingLoaderComponent, typeof CycleEventsComponent, typeof EventBrowserComponent, typeof EventBrowserOverlayComponent, typeof EtaPhiPanelComponent, typeof EtaPhiPanelOverlayComponent, typeof KinematicsPanelComponent, typeof KinematicsPanelOverlayComponent, typeof MasterclassPanelComponent, typeof MasterclassPanelOverlayComponent, typeof SessionPillComponent, typeof ShortcutsDialogComponent, typeof AttributePipe]>;
1301
1551
  static ɵinj: i0.ɵɵInjectorDeclaration<PhoenixUIModule>;
1302
1552
  }
1303
1553
 
1304
- /** Severity levels for notifications. */
1305
- type NotificationSeverity = 'success' | 'info' | 'warning' | 'error';
1306
- /** A notification message with severity and content. */
1307
- interface Notification {
1308
- /** The message to display to the user. */
1309
- message: string;
1310
- /** The severity level of the notification. */
1311
- severity: NotificationSeverity;
1312
- /** Duration in milliseconds before auto-dismiss. 0 means no auto-dismiss. */
1313
- duration: number;
1314
- }
1315
- /**
1316
- * Service for displaying user-facing notifications with severity levels.
1317
- * Provides success, info, warning, and error notifications with
1318
- * configurable auto-dismiss durations. Replaces silent console errors
1319
- * with actionable user feedback across all Phoenix components.
1320
- */
1321
- declare class NotificationService {
1322
- /** Default auto-dismiss durations in milliseconds per severity level. */
1323
- private readonly defaultDurations;
1324
- /** Active variable that stores the latest notification. */
1325
- private notification;
1326
- /**
1327
- * Subscribe to incoming notifications.
1328
- * @param callback Function called when a notification is emitted.
1329
- * @returns A function that can be called to unsubscribe.
1330
- */
1331
- subscribeToNotifications(callback: (notification: Notification) => void): () => void;
1332
- /**
1333
- * Display a success notification.
1334
- * Auto-dismisses after 5 seconds by default.
1335
- * @param message The message to display.
1336
- * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
1337
- */
1338
- success(message: string, duration?: number): void;
1339
- /**
1340
- * Display an info notification.
1341
- * Auto-dismisses after 5 seconds by default.
1342
- * @param message The message to display.
1343
- * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
1344
- */
1345
- info(message: string, duration?: number): void;
1346
- /**
1347
- * Display a warning notification.
1348
- * Auto-dismisses after 8 seconds by default.
1349
- * @param message The message to display.
1350
- * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
1351
- */
1352
- warning(message: string, duration?: number): void;
1353
- /**
1354
- * Display an error notification.
1355
- * Does not auto-dismiss by default — requires manual dismissal.
1356
- * @param message The message to display.
1357
- * @param duration Optional custom duration in ms. 0 means no auto-dismiss.
1358
- */
1359
- error(message: string, duration?: number): void;
1360
- /**
1361
- * Internal method to emit a notification.
1362
- * @param message The message to display.
1363
- * @param severity The severity level.
1364
- * @param duration Optional custom duration override.
1365
- */
1366
- private notify;
1367
- static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
1368
- static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
1369
- }
1370
-
1371
- export { AnimateCameraComponent, AnimateEventComponent, ArToggleComponent, AttributePipe, AutoRotateComponent, CartesianGridConfigComponent, CollectionsInfoComponent, CollectionsInfoOverlayComponent, ConfigSliderComponent, CycleEventsComponent, DarkThemeComponent, EmbedMenuComponent, EtaPhiPanelComponent, EtaPhiPanelOverlayComponent, EventBrowserComponent, EventBrowserOverlayComponent, EventDataExplorerComponent, EventDataExplorerDialogComponent, EventDataFormat, EventDisplayService, EventSelectorComponent, ExperimentInfoComponent, ExperimentLinkComponent, FileEvent, FileExplorerComponent, FileNode, GeometryBrowserComponent, GeometryBrowserOverlayComponent, IOOptionsDialogComponent, ImportOption, InfoPanelComponent, InfoPanelOverlayComponent, IoOptionsComponent, KinematicsPanelComponent, KinematicsPanelOverlayComponent, LoaderComponent, MainViewToggleComponent, MakePictureComponent, MasterclassPanelComponent, MasterclassPanelOverlayComponent, MenuToggleComponent, MoreInfoComponent, NavComponent, NotificationService, ObjectClippingComponent, ObjectSelectionComponent, ObjectSelectionOverlayComponent, OverlayComponent, OverlayViewComponent, OverlayViewWindowComponent, PerformanceToggleComponent, PhoenixMenuComponent, PhoenixMenuItemComponent, PhoenixUIModule, RingLoaderComponent, SSModeComponent, ShareLinkComponent, ShareLinkDialogComponent, TreeMenuComponent, TreeMenuItemComponent, UiMenuComponent, UiMenuWrapperComponent, ViewOptionsComponent, VrToggleComponent, ZoomControlsComponent, defaultAnimationPresets, defaultUIMenuConfig };
1554
+ export { AnimateCameraComponent, AnimateEventComponent, ArToggleComponent, AttributePipe, AutoRotateComponent, CartesianGridConfigComponent, CollectionsInfoComponent, CollectionsInfoOverlayComponent, ConfigSliderComponent, CycleEventsComponent, DarkThemeComponent, DownloadAnimationDialogComponent, EmbedMenuComponent, EtaPhiPanelComponent, EtaPhiPanelOverlayComponent, EventBrowserComponent, EventBrowserOverlayComponent, EventDataExplorerComponent, EventDataExplorerDialogComponent, EventDataFormat, EventDisplayService, EventSelectorComponent, ExperimentInfoComponent, ExperimentLinkComponent, FileEvent, FileExplorerComponent, FileNode, GeometryBrowserComponent, GeometryBrowserOverlayComponent, IOOptionsDialogComponent, ImportOption, InfoPanelComponent, InfoPanelOverlayComponent, IoOptionsComponent, KinematicsPanelComponent, KinematicsPanelOverlayComponent, LoaderComponent, MainViewToggleComponent, MakePictureComponent, MasterclassPanelComponent, MasterclassPanelOverlayComponent, MenuToggleComponent, MoreInfoComponent, NavComponent, NotificationService, NotificationToastComponent, ObjectClippingComponent, ObjectSelectionComponent, ObjectSelectionOverlayComponent, OverlayCascadeService, OverlayComponent, OverlayViewComponent, OverlayViewWindowComponent, PerformanceToggleComponent, PhoenixMenuComponent, PhoenixMenuItemComponent, PhoenixUIModule, RingLoaderComponent, SSModeComponent, SessionPillComponent, ShareLinkComponent, ShareLinkDialogComponent, ShortcutsDialogComponent, TreeMenuComponent, TreeMenuItemComponent, UiMenuComponent, UiMenuWrapperComponent, ViewOptionsComponent, VrToggleComponent, ZoomControlsComponent, defaultAnimationPresets, defaultUIMenuConfig };
1372
1555
  export type { EventDataExplorerDialogData, EventDataImportOption, FileResponse, Notification, NotificationSeverity, TreeMenuNode, UIMenuConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phoenix-ui-components",
3
- "version": "4.0.1",
3
+ "version": "4.2.0",
4
4
  "description": "Reusable Angular components of the Phoenix event display application.",
5
5
  "author": "Phoenix contributors (https://github.com/HSF/phoenix/graphs/contributors)",
6
6
  "license": "Apache-2.0",
@@ -25,15 +25,15 @@
25
25
  "zone.js": "*"
26
26
  },
27
27
  "dependencies": {
28
- "@angular/animations": "^20.3.23",
28
+ "@angular/animations": "^20.3.28",
29
29
  "@angular/cdk": "^20.2.14",
30
- "@angular/forms": "^20.3.23",
30
+ "@angular/forms": "^20.3.28",
31
31
  "@angular/material": "^20.2.14",
32
- "@angular/platform-browser": "^20.3.23",
32
+ "@angular/platform-browser": "^20.3.28",
33
33
  "css-element-queries": "^1.2.3",
34
34
  "qrcode": "1.5.4",
35
35
  "rxjs": "^7.8.2",
36
- "three": "~0.178.0",
36
+ "three": "~0.184.0",
37
37
  "tslib": "^2.8.1"
38
38
  },
39
39
  "devDependencies": {
@@ -53,5 +53,5 @@
53
53
  "sass": "./_theming.scss"
54
54
  }
55
55
  },
56
- "gitHead": "ac0f92015dea43ef9da91ad8bc574740817cdad0"
56
+ "gitHead": "64e6e89d7c5fc4a3fe013c3a65b21bdf9469233b"
57
57
  }