phoenix-ui-components 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +1 -1
  2. package/_theming.scss +5 -1
  3. package/dist/README.md +1 -1
  4. package/dist/components/embed-menu/embed-menu.component.d.ts +3 -0
  5. package/dist/components/embed-menu/experiment-link/experiment-link.component.d.ts +3 -0
  6. package/dist/components/loader/loader.component.d.ts +3 -0
  7. package/dist/components/nav/nav.component.d.ts +3 -0
  8. package/dist/components/phoenix-menu/config/config-slider/config-slider.component.d.ts +3 -0
  9. package/dist/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.d.ts +3 -0
  10. package/dist/components/phoenix-menu/phoenix-menu.component.d.ts +3 -0
  11. package/dist/components/phoenix-ui.module.d.ts +56 -0
  12. package/dist/components/ui-menu/animate-camera/animate-camera.component.d.ts +3 -0
  13. package/dist/components/ui-menu/animate-event/animate-event.component.d.ts +3 -0
  14. package/dist/components/ui-menu/ar-toggle/ar-toggle.component.d.ts +3 -0
  15. package/dist/components/ui-menu/auto-rotate/auto-rotate.component.d.ts +3 -0
  16. package/dist/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.d.ts +6 -0
  17. package/dist/components/ui-menu/collections-info/collections-info.component.d.ts +3 -0
  18. package/dist/components/ui-menu/dark-theme/dark-theme.component.d.ts +3 -0
  19. package/dist/components/ui-menu/event-selector/event-selector.component.d.ts +3 -0
  20. package/dist/components/ui-menu/experiment-info/experiment-info.component.d.ts +3 -0
  21. package/dist/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.d.ts +3 -0
  22. package/dist/components/ui-menu/info-panel/info-panel.component.d.ts +3 -0
  23. package/dist/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.d.ts +3 -0
  24. package/dist/components/ui-menu/io-options/io-options.component.d.ts +3 -0
  25. package/dist/components/ui-menu/main-view-toggle/main-view-toggle.component.d.ts +3 -0
  26. package/dist/components/ui-menu/menu-toggle/menu-toggle.component.d.ts +3 -0
  27. package/dist/components/ui-menu/object-clipping/object-clipping.component.d.ts +3 -0
  28. package/dist/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.d.ts +3 -0
  29. package/dist/components/ui-menu/object-selection/object-selection.component.d.ts +3 -0
  30. package/dist/components/ui-menu/overlay/overlay.component.d.ts +3 -0
  31. package/dist/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.d.ts +3 -0
  32. package/dist/components/ui-menu/overlay-view/overlay-view.component.d.ts +3 -0
  33. package/dist/components/ui-menu/performance-toggle/performance-toggle.component.d.ts +3 -0
  34. package/dist/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.d.ts +10 -2
  35. package/dist/components/ui-menu/share-link/share-link.component.d.ts +3 -0
  36. package/dist/components/ui-menu/ss-mode/ss-mode.component.d.ts +3 -0
  37. package/dist/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.d.ts +3 -0
  38. package/dist/components/ui-menu/tree-menu/tree-menu.component.d.ts +3 -0
  39. package/dist/components/ui-menu/ui-menu.component.d.ts +3 -0
  40. package/dist/components/ui-menu/view-options/view-options.component.d.ts +3 -0
  41. package/dist/components/ui-menu/vr-toggle/vr-toggle.component.d.ts +3 -0
  42. package/dist/components/ui-menu/zoom-controls/zoom-controls.component.d.ts +3 -0
  43. package/dist/esm2020/components/embed-menu/embed-menu.component.mjs +17 -0
  44. package/dist/esm2020/components/embed-menu/experiment-link/experiment-link.component.mjs +18 -0
  45. package/dist/esm2020/components/loader/loader.component.mjs +19 -0
  46. package/dist/esm2020/components/nav/nav.component.mjs +14 -0
  47. package/dist/esm2020/components/phoenix-menu/config/config-slider/config-slider.component.mjs +38 -0
  48. package/dist/{esm2015/components/phoenix-menu/index.js → esm2020/components/phoenix-menu/index.mjs} +1 -1
  49. package/dist/esm2020/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.mjs +32 -0
  50. package/dist/esm2020/components/phoenix-menu/phoenix-menu.component.mjs +14 -0
  51. package/dist/esm2020/components/phoenix-ui.module.mjs +201 -0
  52. package/dist/esm2020/components/ui-menu/animate-camera/animate-camera.component.mjs +76 -0
  53. package/dist/esm2020/components/ui-menu/animate-event/animate-event.component.mjs +25 -0
  54. package/dist/esm2020/components/ui-menu/ar-toggle/ar-toggle.component.mjs +47 -0
  55. package/dist/esm2020/components/ui-menu/auto-rotate/auto-rotate.component.mjs +21 -0
  56. package/dist/esm2020/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.mjs +81 -0
  57. package/dist/esm2020/components/ui-menu/collections-info/collections-info.component.mjs +32 -0
  58. package/dist/esm2020/components/ui-menu/dark-theme/dark-theme.component.mjs +24 -0
  59. package/dist/esm2020/components/ui-menu/event-selector/event-selector.component.mjs +24 -0
  60. package/dist/esm2020/components/ui-menu/experiment-info/experiment-info.component.mjs +26 -0
  61. package/dist/{esm2015/components/ui-menu/index.js → esm2020/components/ui-menu/index.mjs} +1 -1
  62. package/dist/esm2020/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.mjs +37 -0
  63. package/dist/esm2020/components/ui-menu/info-panel/info-panel.component.mjs +49 -0
  64. package/dist/esm2020/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.mjs +196 -0
  65. package/dist/esm2020/components/ui-menu/io-options/io-options.component.mjs +28 -0
  66. package/dist/esm2020/components/ui-menu/main-view-toggle/main-view-toggle.component.mjs +24 -0
  67. package/dist/esm2020/components/ui-menu/menu-toggle/menu-toggle.component.mjs +24 -0
  68. package/dist/esm2020/components/ui-menu/object-clipping/object-clipping.component.mjs +31 -0
  69. package/dist/esm2020/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.mjs +24 -0
  70. package/dist/esm2020/components/ui-menu/object-selection/object-selection.component.mjs +36 -0
  71. package/dist/esm2020/components/ui-menu/overlay/overlay.component.mjs +99 -0
  72. package/dist/esm2020/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.mjs +53 -0
  73. package/dist/esm2020/components/ui-menu/overlay-view/overlay-view.component.mjs +32 -0
  74. package/dist/esm2020/components/ui-menu/performance-toggle/performance-toggle.component.mjs +21 -0
  75. package/dist/esm2020/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.mjs +73 -0
  76. package/dist/esm2020/components/ui-menu/share-link/share-link.component.mjs +20 -0
  77. package/dist/esm2020/components/ui-menu/ss-mode/ss-mode.component.mjs +41 -0
  78. package/dist/esm2020/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.mjs +33 -0
  79. package/dist/esm2020/components/ui-menu/tree-menu/tree-menu.component.mjs +71 -0
  80. package/dist/esm2020/components/ui-menu/ui-menu.component.mjs +43 -0
  81. package/dist/esm2020/components/ui-menu/view-options/view-options.component.mjs +34 -0
  82. package/dist/esm2020/components/ui-menu/vr-toggle/vr-toggle.component.mjs +44 -0
  83. package/dist/esm2020/components/ui-menu/zoom-controls/zoom-controls.component.mjs +61 -0
  84. package/dist/esm2020/phoenix-ui-components.mjs +5 -0
  85. package/dist/esm2020/public_api.mjs +9 -0
  86. package/dist/esm2020/services/event-display.service.mjs +23 -0
  87. package/dist/esm2020/services/extras/attribute.pipe.mjs +33 -0
  88. package/dist/{esm2015/services/extras/event-data-import.js → esm2020/services/extras/event-data-import.mjs} +1 -1
  89. package/dist/esm2020/services/index.mjs +4 -0
  90. package/dist/fesm2015/phoenix-ui-components.mjs +1644 -0
  91. package/dist/fesm2015/phoenix-ui-components.mjs.map +1 -0
  92. package/dist/fesm2020/phoenix-ui-components.mjs +1644 -0
  93. package/dist/fesm2020/phoenix-ui-components.mjs.map +1 -0
  94. package/dist/phoenix-ui-components.d.ts +2 -6
  95. package/dist/{index.d.ts → public_api.d.ts} +2 -0
  96. package/dist/services/event-display.service.d.ts +3 -0
  97. package/dist/services/extras/attribute.pipe.d.ts +3 -0
  98. package/dist/services/index.d.ts +1 -0
  99. package/package.json +6 -5
  100. package/dist/bundles/phoenix-ui-components.umd.js +0 -2148
  101. package/dist/bundles/phoenix-ui-components.umd.js.map +0 -1
  102. package/dist/esm2015/components/embed-menu/embed-menu.component.js +0 -11
  103. package/dist/esm2015/components/embed-menu/experiment-link/experiment-link.component.js +0 -17
  104. package/dist/esm2015/components/loader/loader.component.js +0 -18
  105. package/dist/esm2015/components/nav/nav.component.js +0 -14
  106. package/dist/esm2015/components/phoenix-menu/config/config-slider/config-slider.component.js +0 -32
  107. package/dist/esm2015/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.js +0 -29
  108. package/dist/esm2015/components/phoenix-menu/phoenix-menu.component.js +0 -14
  109. package/dist/esm2015/components/phoenix-ui.module.js +0 -94
  110. package/dist/esm2015/components/ui-menu/animate-camera/animate-camera.component.js +0 -77
  111. package/dist/esm2015/components/ui-menu/animate-event/animate-event.component.js +0 -27
  112. package/dist/esm2015/components/ui-menu/ar-toggle/ar-toggle.component.js +0 -45
  113. package/dist/esm2015/components/ui-menu/auto-rotate/auto-rotate.component.js +0 -23
  114. package/dist/esm2015/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.js +0 -72
  115. package/dist/esm2015/components/ui-menu/collections-info/collections-info.component.js +0 -34
  116. package/dist/esm2015/components/ui-menu/dark-theme/dark-theme.component.js +0 -26
  117. package/dist/esm2015/components/ui-menu/event-selector/event-selector.component.js +0 -25
  118. package/dist/esm2015/components/ui-menu/experiment-info/experiment-info.component.js +0 -27
  119. package/dist/esm2015/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.js +0 -39
  120. package/dist/esm2015/components/ui-menu/info-panel/info-panel.component.js +0 -51
  121. package/dist/esm2015/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.js +0 -202
  122. package/dist/esm2015/components/ui-menu/io-options/io-options.component.js +0 -31
  123. package/dist/esm2015/components/ui-menu/main-view-toggle/main-view-toggle.component.js +0 -25
  124. package/dist/esm2015/components/ui-menu/menu-toggle/menu-toggle.component.js +0 -20
  125. package/dist/esm2015/components/ui-menu/object-clipping/object-clipping.component.js +0 -30
  126. package/dist/esm2015/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.js +0 -25
  127. package/dist/esm2015/components/ui-menu/object-selection/object-selection.component.js +0 -39
  128. package/dist/esm2015/components/ui-menu/overlay/overlay.component.js +0 -90
  129. package/dist/esm2015/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.js +0 -52
  130. package/dist/esm2015/components/ui-menu/overlay-view/overlay-view.component.js +0 -34
  131. package/dist/esm2015/components/ui-menu/performance-toggle/performance-toggle.component.js +0 -23
  132. package/dist/esm2015/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.js +0 -64
  133. package/dist/esm2015/components/ui-menu/share-link/share-link.component.js +0 -22
  134. package/dist/esm2015/components/ui-menu/ss-mode/ss-mode.component.js +0 -43
  135. package/dist/esm2015/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.js +0 -32
  136. package/dist/esm2015/components/ui-menu/tree-menu/tree-menu.component.js +0 -71
  137. package/dist/esm2015/components/ui-menu/ui-menu.component.js +0 -22
  138. package/dist/esm2015/components/ui-menu/view-options/view-options.component.js +0 -33
  139. package/dist/esm2015/components/ui-menu/vr-toggle/vr-toggle.component.js +0 -44
  140. package/dist/esm2015/components/ui-menu/zoom-controls/zoom-controls.component.js +0 -63
  141. package/dist/esm2015/index.js +0 -7
  142. package/dist/esm2015/phoenix-ui-components.js +0 -10
  143. package/dist/esm2015/services/event-display.service.js +0 -22
  144. package/dist/esm2015/services/extras/attribute.pipe.js +0 -29
  145. package/dist/esm2015/services/index.js +0 -3
  146. package/dist/fesm2015/phoenix-ui-components.js +0 -1620
  147. package/dist/fesm2015/phoenix-ui-components.js.map +0 -1
  148. package/dist/phoenix-ui-components.metadata.json +0 -1
@@ -1,1620 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Component, EventEmitter, Input, Output, ViewEncapsulation, ChangeDetectorRef, ViewChild, Injectable, ElementRef, ViewChildren, Pipe, NgModule } from '@angular/core';
3
- import { EventDisplay, SceneManager, PrettySymbols, JiveXMLLoader, ScriptLoader, CMSLoader, VRManager, XRSessionType, ARManager, phoenixURLOptions } from 'phoenix-event-display';
4
- import { Overlay, OverlayModule } from '@angular/cdk/overlay';
5
- import { ComponentPortal } from '@angular/cdk/portal';
6
- import packageJson from 'phoenix-event-display/package.json';
7
- import { MatDialogRef, MatDialog, MatDialogModule } from '@angular/material/dialog';
8
- import { __awaiter } from 'tslib';
9
- import JSZip from 'jszip';
10
- import { ResizeSensor } from 'css-element-queries';
11
- import { DragDropModule } from '@angular/cdk/drag-drop';
12
- import { MatButtonModule } from '@angular/material/button';
13
- import { MatCheckboxModule } from '@angular/material/checkbox';
14
- import { MatIconModule } from '@angular/material/icon';
15
- import { MatMenuModule } from '@angular/material/menu';
16
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
17
- import { MatSliderModule } from '@angular/material/slider';
18
- import { MatTooltipModule } from '@angular/material/tooltip';
19
- import { NgxSliderModule } from '@angular-slider/ngx-slider';
20
- import { CommonModule } from '@angular/common';
21
- import { RouterModule } from '@angular/router';
22
-
23
- class NavComponent {
24
- constructor() { }
25
- ngOnInit() { }
26
- }
27
- NavComponent.decorators = [
28
- { type: Component, args: [{
29
- selector: 'app-nav',
30
- template: "<a id=\"mainLogo\" class=\"main-logo fixed-top p-2 mx-auto mt-2\" routerLink=\"/\">\n <img src=\"assets/images/logo-text.svg\" />\n</a>\n",
31
- styles: [".main-logo{width:140px;z-index:9999}.main-logo img{transition:all .5s}.main-logo:hover img{filter:drop-shadow(0px 0px 10px var(--phoenix-text-color));transition:all .5s}\n"]
32
- },] }
33
- ];
34
- NavComponent.ctorParameters = () => [];
35
-
36
- class ConfigSliderComponent {
37
- constructor() {
38
- this.value = 0;
39
- this.min = 0;
40
- this.max = 100;
41
- this.step = 1;
42
- this.allowCustomValue = false;
43
- this.onChange = new EventEmitter();
44
- }
45
- onValueChange(value) {
46
- if (value) {
47
- this.onChange.emit(value);
48
- }
49
- }
50
- }
51
- ConfigSliderComponent.decorators = [
52
- { type: Component, args: [{
53
- selector: 'app-config-slider',
54
- template: "<div class=\"d-flex flex-row align-items-center\">\n <mat-slider\n #configSlider\n class=\"mx-2\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n thumbLabel\n (click)=\"$event.stopPropagation()\"\n (input)=\"onValueChange($event.value)\"\n >\n </mat-slider>\n <input\n #configSliderInput\n *ngIf=\"allowCustomValue\"\n class=\"config-slider-input\"\n type=\"number\"\n [value]=\"value\"\n (input)=\"onValueChange($event.target.value)\"\n />\n</div>\n",
55
- styles: [".config-slider-input{background:transparent;color:var(--phoenix-text-color);border:none;border-bottom:1px solid var(--phoenix-text-color);width:25%;-moz-appearance:textfield}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none}\n"]
56
- },] }
57
- ];
58
- ConfigSliderComponent.propDecorators = {
59
- value: [{ type: Input }],
60
- min: [{ type: Input }],
61
- max: [{ type: Input }],
62
- step: [{ type: Input }],
63
- allowCustomValue: [{ type: Input }],
64
- onChange: [{ type: Output }]
65
- };
66
-
67
- class PhoenixMenuItemComponent {
68
- constructor(cdr) {
69
- this.cdr = cdr;
70
- }
71
- calculateConfigTop() {
72
- if (this.phoenixMenuItem) {
73
- this.configTop =
74
- this.phoenixMenuItem.nativeElement.getBoundingClientRect().top;
75
- this.cdr.detectChanges();
76
- }
77
- }
78
- }
79
- PhoenixMenuItemComponent.decorators = [
80
- { type: Component, args: [{
81
- selector: 'app-phoenix-menu-item',
82
- template: "<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of currentNode.configs\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n",
83
- encapsulation: ViewEncapsulation.None,
84
- styles: [".phoenix-menu-item{width:100%;padding:.6rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color);font-size:.8rem;transition:all .5s;display:flex;justify-content:space-between;align-items:center}.phoenix-menu-item-left{display:flex;justify-content:flex-start;min-width:0;padding-right:.5rem;overflow:hidden}.phoenix-menu-item-left .item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phoenix-menu-item-left .item-icon{margin-right:.2rem}.phoenix-menu-item-right{display:flex;justify-content:flex-end}.phoenix-menu-item-right .item-expand.expanded{transform:scaleY(-1)}.phoenix-menu-item-right .item-settings{margin-right:.2rem}.phoenix-menu-item-right .item-config-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:110}.phoenix-menu-item-right .item-config{position:absolute;margin-top:-5rem;right:100%;width:14rem;padding:.5rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color-secondary);box-shadow:var(--phoenix-box-shadow);display:flex;flex-direction:column;z-index:120}.phoenix-menu-item-right .item-config>*{margin-bottom:.4rem}.phoenix-menu-item-right .item-config>*:last-child{margin-bottom:0}.phoenix-menu-item-right .item-config .item-config-single{display:flex;flex-direction:row}.phoenix-menu-item-right .item-config .item-config-single .item-config-label{width:30%}.phoenix-menu-item-right .item-config .item-config-single .item-config-data{flex-grow:1;padding-left:.5rem}.phoenix-menu-item .icon-wrapper{display:inline-block;width:1.3rem;height:1.3rem;padding:.23rem;transition:all .4s}.phoenix-menu-item .icon-wrapper.icon-button:hover{background:var(--phoenix-options-icon-bg);border-radius:40%;cursor:pointer}.phoenix-menu-item .icon-wrapper svg{width:100%;height:100%;vertical-align:top}.phoenix-menu-item .mat-slide-toggle-bar{width:30px!important}.phoenix-menu-item .mat-slide-toggle-thumb{width:15px!important;height:15px!important;position:absolute;top:2px}.phoenix-menu-item .mat-slider-horizontal{min-width:0;width:100%;height:20px}.phoenix-menu-item .mat-slider-horizontal .mat-slider-wrapper{top:10px}.phoenix-menu-item label.mat-checkbox-layout{margin:0}@media screen and (max-width: 768px){.phoenix-menu-item{font-size:.75rem;padding:.5rem}.phoenix-menu-item .icon-wrapper{width:1rem;height:1rem;padding:.15rem}}.phoenix-menu-children{margin-left:.5rem;border-left:1px solid var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-bar{background:var(--phoenix-text-color-secondary);height:.2rem}.range-slider.ngx-slider .ngx-slider-selection{background:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer{width:1rem;height:1rem;top:-.45rem;bottom:0;background-color:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer:after{display:none}.range-slider.ngx-slider .ngx-slider-bubble{color:var(--phoenix-text-color);font-size:.8rem}.range-slider.ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:var(--phoenix-text-color-secondary)}\n"]
85
- },] }
86
- ];
87
- PhoenixMenuItemComponent.ctorParameters = () => [
88
- { type: ChangeDetectorRef }
89
- ];
90
- PhoenixMenuItemComponent.propDecorators = {
91
- currentNode: [{ type: Input }],
92
- phoenixMenuItem: [{ type: ViewChild, args: ['phoenixMenuItem',] }]
93
- };
94
-
95
- class PhoenixMenuComponent {
96
- }
97
- PhoenixMenuComponent.decorators = [
98
- { type: Component, args: [{
99
- selector: 'app-phoenix-menu',
100
- template: "<div id=\"phoenixMenu\">\n <app-phoenix-menu-item [currentNode]=\"rootNode\"></app-phoenix-menu-item>\n</div>\n",
101
- styles: [":host{width:15rem;max-width:45%;position:absolute;top:5rem;right:1rem}#phoenixMenu{background:var(--phoenix-background-color-secondary);max-height:75vh;overflow-y:auto;box-shadow:var(--phoenix-box-shadow);z-index:100}@media screen and (max-width: 768px){#phoenixMenu{top:4rem}}\n"]
102
- },] }
103
- ];
104
- PhoenixMenuComponent.propDecorators = {
105
- rootNode: [{ type: Input }]
106
- };
107
-
108
- /**
109
- * Service for all event display related functions.
110
- */
111
- class EventDisplayService extends EventDisplay {
112
- /**
113
- * Instantiate the event display by calling the parent constructor.
114
- */
115
- constructor() {
116
- super();
117
- }
118
- }
119
- EventDisplayService.ɵprov = i0.ɵɵdefineInjectable({ factory: function EventDisplayService_Factory() { return new EventDisplayService(); }, token: EventDisplayService, providedIn: "root" });
120
- EventDisplayService.decorators = [
121
- { type: Injectable, args: [{
122
- providedIn: 'root',
123
- },] }
124
- ];
125
- EventDisplayService.ctorParameters = () => [];
126
-
127
- const defaultAnimationPresets = {
128
- 'Preset 1': {
129
- positions: [
130
- {
131
- position: [11976, 7262, 11927],
132
- duration: 1000,
133
- },
134
- {
135
- position: [-1000, 0, 11927],
136
- duration: 2000,
137
- },
138
- {
139
- position: [2000, 500, 1000],
140
- duration: 3500,
141
- },
142
- {
143
- position: [5000, 2000, 1000],
144
- duration: 3000,
145
- },
146
- {
147
- position: [5000, 2000, 1000],
148
- duration: 2000,
149
- },
150
- {
151
- position: [11976, 7262, 11927],
152
- duration: 1000,
153
- },
154
- ],
155
- animateEventAfterInterval: 5000,
156
- collisionDuration: 6000,
157
- },
158
- };
159
- class AnimateCameraComponent {
160
- constructor(eventDisplay) {
161
- this.eventDisplay = eventDisplay;
162
- this.animationPresets = defaultAnimationPresets;
163
- this.animationPresetsKeys = Object.keys(this.animationPresets);
164
- this.isAnimating = false;
165
- }
166
- animatePreset(preset) {
167
- this.setDetectorOpacity(0.2);
168
- this.eventDisplay.animatePreset(this.animationPresets[preset], () => {
169
- this.setDetectorOpacity(1);
170
- });
171
- }
172
- animateCamera() {
173
- if (!this.isAnimating) {
174
- this.isAnimating = true;
175
- this.eventDisplay.animateThroughEvent([11976, 7262, 11927], 3000, () => {
176
- this.isAnimating = false;
177
- });
178
- }
179
- }
180
- setDetectorOpacity(opacity) {
181
- this.eventDisplay
182
- .getThreeManager()
183
- .getSceneManager()
184
- .setGeometryOpacity(SceneManager.GEOMETRIES_ID, opacity);
185
- }
186
- }
187
- AnimateCameraComponent.decorators = [
188
- { type: Component, args: [{
189
- selector: 'app-animate-camera',
190
- template: "<mat-menu #animationPresets>\n <button\n mat-menu-item\n *ngFor=\"let preset of animationPresetsKeys\"\n (click)=\"animatePreset(preset)\"\n >\n {{ preset }}\n </button>\n <button mat-menu-item (click)=\"animateCamera()\">Animate camera</button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"animationPresets\"\n tooltip=\"Preset animations\"\n icon=\"animate-camera\"\n>\n</app-menu-toggle>\n",
191
- styles: [""]
192
- },] }
193
- ];
194
- AnimateCameraComponent.ctorParameters = () => [
195
- { type: EventDisplayService }
196
- ];
197
- AnimateCameraComponent.propDecorators = {
198
- animationPresets: [{ type: Input }]
199
- };
200
-
201
- class AnimateEventComponent {
202
- constructor(eventDisplay) {
203
- this.eventDisplay = eventDisplay;
204
- this.isAnimating = false;
205
- }
206
- toggleAnimateEvent() {
207
- if (!this.isAnimating) {
208
- this.isAnimating = true;
209
- this.eventDisplay.animateEventWithCollision(10000, () => {
210
- this.isAnimating = false;
211
- });
212
- }
213
- }
214
- }
215
- AnimateEventComponent.decorators = [
216
- { type: Component, args: [{
217
- selector: 'app-animate-event',
218
- template: "<app-menu-toggle\n tooltip=\"Animate event\"\n icon=\"event-folder\"\n [active]=\"isAnimating\"\n (click)=\"toggleAnimateEvent()\"\n>\n</app-menu-toggle>\n",
219
- styles: [""]
220
- },] }
221
- ];
222
- AnimateEventComponent.ctorParameters = () => [
223
- { type: EventDisplayService }
224
- ];
225
-
226
- class AutoRotateComponent {
227
- constructor(eventDisplay) {
228
- this.eventDisplay = eventDisplay;
229
- this.autoRotate = false;
230
- }
231
- toggleAutoRotate() {
232
- this.autoRotate = !this.autoRotate;
233
- this.eventDisplay.getUIManager().setAutoRotate(this.autoRotate);
234
- }
235
- }
236
- AutoRotateComponent.decorators = [
237
- { type: Component, args: [{
238
- selector: 'app-auto-rotate',
239
- template: "<app-menu-toggle\n tooltip=\"Auto rotate\"\n icon=\"rotate\"\n [active]=\"autoRotate\"\n (click)=\"toggleAutoRotate()\"\n>\n</app-menu-toggle>\n",
240
- styles: [""]
241
- },] }
242
- ];
243
- AutoRotateComponent.ctorParameters = () => [
244
- { type: EventDisplayService }
245
- ];
246
-
247
- class CollectionsInfoOverlayComponent {
248
- constructor(elementRef, eventDisplay) {
249
- this.elementRef = elementRef;
250
- this.eventDisplay = eventDisplay;
251
- this.getPrettySymbol = PrettySymbols.getPrettySymbol;
252
- }
253
- ngOnInit() {
254
- this.eventDisplay.listenToDisplayedEventChange((_event) => (this.collections = this.eventDisplay.getCollections()));
255
- this.activeObject = this.eventDisplay.getActiveObjectId();
256
- this.activeObject.onUpdate((value) => {
257
- if (document.getElementById(value)) {
258
- document.getElementById(value).scrollIntoView(false);
259
- }
260
- });
261
- }
262
- changeCollection(selectedCollection) {
263
- const eventDataGroup = this.getEventDataGroup();
264
- this.selectedCollection = selectedCollection;
265
- this.showingCollection = this.eventDisplay
266
- .getCollection(selectedCollection)
267
- .map((object) => {
268
- var _a;
269
- return (Object.assign(Object.assign({}, object), { isCut: !((_a = eventDataGroup.getObjectByProperty('uuid', object.uuid)) === null || _a === void 0 ? void 0 : _a.visible) }));
270
- });
271
- this.collectionColumns = Object.keys(this.showingCollection[0]).filter((column) => !['uuid', 'hits', 'isCut'].includes(column) // FIXME - this is an ugly hack. But currently hits from tracks make track collections unusable. Better to have exlusion list passed in.
272
- );
273
- }
274
- lookAtObject(uuid) {
275
- if (uuid) {
276
- this.activeObject.update(uuid);
277
- this.eventDisplay.lookAtObject(uuid);
278
- }
279
- }
280
- highlightObject(uuid) {
281
- if (uuid) {
282
- this.activeObject.update(uuid);
283
- this.eventDisplay.highlightObject(uuid);
284
- }
285
- }
286
- addLabel(index, uuid) {
287
- const labelValue = this.elementRef.nativeElement.querySelector(`#label${index}`).value;
288
- if (this.selectedCollection) {
289
- // Empty labelValue will remove the label object
290
- this.eventDisplay.addLabelToObject(labelValue, this.selectedCollection, index, uuid);
291
- }
292
- }
293
- getEventDataGroup() {
294
- return this.eventDisplay
295
- .getThreeManager()
296
- .getSceneManager()
297
- .getScene()
298
- .getObjectByName(SceneManager.EVENT_DATA_ID);
299
- }
300
- }
301
- CollectionsInfoOverlayComponent.decorators = [
302
- { type: Component, args: [{
303
- selector: 'app-collections-info-overlay',
304
- template: "<!-- Show objects -->\n<app-overlay\n overlayTitle=\"Collections Info\"\n icon=\"info\"\n [resizable]=\"true\"\n [active]=\"showObjectsInfo\"\n>\n <!-- Using ngIf to remove it from DOM since this panel requires heavy computing -->\n <div *ngIf=\"showObjectsInfo\" class=\"collectionsInfo m-2\">\n <div\n class=\"collectionSelector mb-2 d-flex align-items-center\"\n *ngIf=\"collections != null\"\n >\n <span>Choose a collection: </span>\n <div class=\"eventSelector\">\n <label for=\"event\">Event</label>\n <select\n id=\"collection\"\n name=\"collection\"\n (change)=\"changeCollection($event.target.value)\"\n >\n <option value=\"\" selected disabled hidden>Choose Collection</option>\n <option *ngFor=\"let collection of collections\" [value]=\"collection\">\n {{ collection }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"boxBody table-responsive\">\n <table\n id=\"collectionTable\"\n class=\"table table-borderless table-sm\"\n *ngIf=\"showingCollection\"\n >\n <thead>\n <tr>\n <th>No.</th>\n <th>Selection</th>\n <th>Label</th>\n <th *ngFor=\"let column of collectionColumns\">\n {{ getPrettySymbol(column) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let object of showingCollection; index as i\"\n [attr.id]=\"object.uuid\"\n [ngClass]=\"{\n 'active-object':\n activeObject && activeObject.value === object.uuid,\n 'is-cut': object.isCut\n }\"\n >\n <td>#{{ i }}</td>\n <td>\n <div\n *ngIf=\"object.uuid\"\n class=\"row justify-content-center icon-wrapper\"\n >\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Move camera to object\"\n (click)=\"lookAtObject(object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/views.svg#views\"></use>\n </svg>\n </button>\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Highlight object\"\n (click)=\"highlightObject(object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/cursor.svg#cursor\"></use>\n </svg>\n </button>\n </div>\n </td>\n <td>\n <div class=\"row m-0 add-label\">\n <div class=\"col-10 p-0\">\n <input\n class=\"form-control form-control-sm\"\n type=\"text\"\n [id]=\"'label' + i\"\n />\n </div>\n <div class=\"col-2 p-0 pl-2 text-center icon-wrapper\">\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Add, update or remove object label\"\n (click)=\"addLabel(i, object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/update.svg#update\"></use>\n </svg>\n </button>\n </div>\n </div>\n </td>\n <td *ngFor=\"let column of collectionColumns\">\n {{ object[column] }}\n </td>\n </tr>\n </tbody>\n </table>\n <p class=\"emptyBox\" *ngIf=\"!collections\">\n Load event data to be able to display information about the collections\n here.\n </p>\n </div>\n </div>\n</app-overlay>\n",
305
- styles: [".collectionsInfo{height:95%}.collectionsInfo .collectionSelector{height:15%;min-height:2rem}.collectionsInfo .collectionSelector span{color:var(--phoenix-text-color-secondary);margin-right:1rem}.boxBody{height:85%;overflow:scroll}.boxBody p.emptyBox{max-width:21em}.boxBody .add-label{min-width:8rem}.boxBody .add-label input{padding:.1rem .3rem;font-size:.75rem}#collectionTable{position:relative;color:var(--phoenix-text-color-secondary)}#collectionTable thead tr th{position:sticky;top:0;z-index:100;background:var(--phoenix-background-color-secondary)}#collectionTable tr *{padding-right:1.2rem}#collectionTable tr *:last-child{padding-right:0}#collectionTable tr.is-cut{opacity:.5}#collectionTable tr.active-object{color:var(--phoenix-background-color);background:var(--phoenix-text-color);box-shadow:0 0 15px var(--phoenix-text-color)}#collectionTable tr.active-object div.icon-wrapper{--phoenix-options-icon-path: var(--phoenix-background-color);--phoenix-options-icon-bg: var(--phoenix-text-color-hover)}#collectionTable tr.active-object .add-label input{--phoenix-text-color: var(--phoenix-background-color);--phoenix-background-color-tertiary: var( --phoenix-text-color-secondary );--phoenix-border: var(--phoenix-background-color)}#collectionTable td .object-select{position:relative;width:1.6rem;height:1.6rem;margin-right:.4em;text-align:center;background-color:var(--phoenix-options-icon-bg);border-radius:10px;cursor:pointer}#collectionTable td .object-select:last-child{margin-right:0}#collectionTable td .object-select:hover{border:1px solid var(--phoenix-options-icon-path)}#collectionTable td .object-select svg{position:absolute;top:0;left:0;padding:.4rem;width:100%;height:100%;vertical-align:top}.eventSelector{display:flex}.eventSelector label{display:none;color:var(--phoenix-text-color-secondary)}.eventSelector select{width:9rem;padding:5px 10px;font-size:12px;border:1px solid rgba(88,88,88,.08);box-shadow:var(--phoenix-icon-shadow);background-color:var(--phoenix-background-color-tertiary);color:var(--phoenix-text-color-secondary)}\n"]
306
- },] }
307
- ];
308
- CollectionsInfoOverlayComponent.ctorParameters = () => [
309
- { type: ElementRef },
310
- { type: EventDisplayService }
311
- ];
312
- CollectionsInfoOverlayComponent.propDecorators = {
313
- showObjectsInfo: [{ type: Input }]
314
- };
315
-
316
- class CollectionsInfoComponent {
317
- constructor(overlay) {
318
- this.overlay = overlay;
319
- this.showObjectsInfo = false;
320
- }
321
- ngOnInit() {
322
- const overlayRef = this.overlay.create();
323
- const overlayPortal = new ComponentPortal(CollectionsInfoOverlayComponent);
324
- this.overlayWindow = overlayRef.attach(overlayPortal);
325
- this.overlayWindow.instance.showObjectsInfo = this.showObjectsInfo;
326
- }
327
- ngOnDestroy() {
328
- this.overlayWindow.destroy();
329
- }
330
- toggleOverlay() {
331
- this.showObjectsInfo = !this.showObjectsInfo;
332
- this.overlayWindow.instance.showObjectsInfo = this.showObjectsInfo;
333
- }
334
- }
335
- CollectionsInfoComponent.decorators = [
336
- { type: Component, args: [{
337
- selector: 'app-collections-info',
338
- template: "<app-menu-toggle\n tooltip=\"Event data collections info\"\n icon=\"info\"\n [active]=\"showObjectsInfo\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n",
339
- styles: [""]
340
- },] }
341
- ];
342
- CollectionsInfoComponent.ctorParameters = () => [
343
- { type: Overlay }
344
- ];
345
-
346
- class DarkThemeComponent {
347
- constructor(eventDisplay) {
348
- this.eventDisplay = eventDisplay;
349
- this.darkTheme = false;
350
- }
351
- ngOnInit() {
352
- this.darkTheme = this.eventDisplay.getUIManager().getDarkTheme();
353
- }
354
- setDarkTheme() {
355
- this.darkTheme = !this.darkTheme;
356
- this.eventDisplay.getUIManager().setDarkTheme(this.darkTheme);
357
- }
358
- }
359
- DarkThemeComponent.decorators = [
360
- { type: Component, args: [{
361
- selector: 'app-dark-theme',
362
- template: "<app-menu-toggle\n tooltip=\"Dark theme\"\n [active]=\"darkTheme\"\n icon=\"dark\"\n (click)=\"setDarkTheme()\"\n>\n</app-menu-toggle>\n",
363
- styles: [""]
364
- },] }
365
- ];
366
- DarkThemeComponent.ctorParameters = () => [
367
- { type: EventDisplayService }
368
- ];
369
-
370
- class EventSelectorComponent {
371
- constructor(eventDisplay) {
372
- this.eventDisplay = eventDisplay;
373
- }
374
- ngOnInit() {
375
- this.eventDisplay.listenToLoadedEventsChange((events) => (this.events = events));
376
- }
377
- changeEvent(selected) {
378
- const value = selected.target.value;
379
- this.eventDisplay.loadEvent(value);
380
- }
381
- }
382
- EventSelectorComponent.decorators = [
383
- { type: Component, args: [{
384
- selector: 'app-event-selector',
385
- template: "<div\n class=\"eventSelector mx-2\"\n *ngIf=\"events != null\"\n matTooltip=\"Event selector\"\n matTooltipPosition=\"above\"\n>\n <select name=\"event\" (change)=\"changeEvent($event)\">\n <option *ngFor=\"let event of events\" [value]=\"event\">\n {{ event }}\n </option>\n </select>\n</div>\n",
386
- styles: [".eventSelector select{width:9rem;padding:5px 10px;font-size:12px;border:1px solid rgba(88,88,88,.08);box-shadow:var(--phoenix-icon-shadow);background-color:var(--phoenix-background-color-tertiary);color:var(--phoenix-text-color-secondary)}\n"]
387
- },] }
388
- ];
389
- EventSelectorComponent.ctorParameters = () => [
390
- { type: EventDisplayService }
391
- ];
392
-
393
- class ExperimentInfoComponent {
394
- constructor(eventDisplay) {
395
- this.eventDisplay = eventDisplay;
396
- }
397
- ngOnInit() {
398
- this.eventDisplay.listenToDisplayedEventChange(() => {
399
- this.experimentInfo = this.eventDisplay.getEventMetadata();
400
- });
401
- }
402
- }
403
- ExperimentInfoComponent.decorators = [
404
- { type: Component, args: [{
405
- selector: 'app-experiment-info',
406
- template: "<div id=\"experimentInfo\" class=\"experimentInfo\" cdkDrag cdkDragBoundary=\"body\">\n <a\n class=\"experimentLogoWrapper\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n *ngIf=\"experiment\"\n href=\"https://home.cern/science/experiments/{{ experiment }}\"\n >\n <img\n class=\"experimentLogo\"\n src=\"assets/images/{{ experiment }}.svg\"\n alt=\"\"\n />\n </a>\n <div class=\"textInfo\">\n <p *ngIf=\"experimentTagline\">\n <b>{{ experimentTagline }}</b>\n </p>\n <p *ngFor=\"let infoField of experimentInfo\">\n <ng-container *ngIf=\"infoField.label\">\n <b>{{ infoField.label }}: </b>{{ infoField.value }}\n </ng-container>\n <ng-container *ngIf=\"!infoField.label\">\n {{ infoField }}\n </ng-container>\n </p>\n </div>\n</div>\n",
407
- styles: [".experimentInfo{position:absolute;top:5rem;left:1rem;display:flex;flex-direction:row;justify-items:flex-end;justify-content:flex-end;align-items:center;align-content:center;cursor:move}.experimentLogoWrapper{width:6rem}.experimentLogoWrapper .experimentLogo{width:100%;height:100%}.textInfo{margin-left:1rem}.textInfo p{color:var(--phoenix-text-color-secondary);font-size:.8rem;margin-bottom:.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width: 768px){.experimentInfo{top:4rem;max-width:40%}.experimentLogoWrapper{height:4rem}.textInfo{display:none}}\n"]
408
- },] }
409
- ];
410
- ExperimentInfoComponent.ctorParameters = () => [
411
- { type: EventDisplayService }
412
- ];
413
- ExperimentInfoComponent.propDecorators = {
414
- experiment: [{ type: Input }],
415
- experimentTagline: [{ type: Input }]
416
- };
417
-
418
- /**
419
- * Component for displaying information from the logger
420
- */
421
- class InfoPanelOverlayComponent {
422
- /**
423
- * Create the information panel overlay
424
- * @param infoLogger Service containing operations related to info logs
425
- */
426
- constructor(eventDisplay) {
427
- this.eventDisplay = eventDisplay;
428
- /** List of actions to be displayed in the info panel */
429
- this.actionsList = [];
430
- /** Get Phoenix Version */
431
- this.version = packageJson.version;
432
- }
433
- /**
434
- * Get the list of logs from the info logger service
435
- */
436
- ngOnInit() {
437
- this.actionsList = this.eventDisplay.getInfoLogger().getInfoLoggerList();
438
- }
439
- }
440
- InfoPanelOverlayComponent.decorators = [
441
- { type: Component, args: [{
442
- selector: 'app-info-panel-overlay',
443
- template: "<app-overlay\n overlayTitle=\"Info Panel\"\n icon=\"info-panel\"\n [resizable]=\"true\"\n [active]=\"showInfoPanel\"\n>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item\">\n <!-- Show Phoenix Current Version (ON by Default) -->\n Phoenix Version: {{ version }}\n </li>\n <li class=\"list-group-item\" *ngIf=\"actionsList.length === 0\">\n No actions.\n </li>\n <li class=\"list-group-item\" *ngFor=\"let action of actionsList\">\n {{ action }}\n </li>\n </ul>\n</app-overlay>\n",
444
- styles: [".list-group-item{font-size:.8rem;padding:.5rem 1rem}\n"]
445
- },] }
446
- ];
447
- InfoPanelOverlayComponent.ctorParameters = () => [
448
- { type: EventDisplayService }
449
- ];
450
- InfoPanelOverlayComponent.propDecorators = {
451
- showInfoPanel: [{ type: Input }]
452
- };
453
-
454
- /**
455
- * Component for toggling info panel overlay
456
- */
457
- class InfoPanelComponent {
458
- /**
459
- * Create the info panel toggle
460
- * @param overlay Info panel overlay containing logger data
461
- */
462
- constructor(overlay) {
463
- this.overlay = overlay;
464
- /** @ignore */
465
- this.showInfoPanel = false;
466
- }
467
- /**
468
- * Create the info panel overlay
469
- */
470
- ngOnInit() {
471
- const overlayRef = this.overlay.create();
472
- const overlayPortal = new ComponentPortal(InfoPanelOverlayComponent);
473
- this.overlayWindow = overlayRef.attach(overlayPortal);
474
- this.overlayWindow.instance.showInfoPanel = this.showInfoPanel;
475
- }
476
- /**
477
- * Destroy the info panel overlay
478
- */
479
- ngOnDestroy() {
480
- this.overlayWindow.destroy();
481
- }
482
- /**
483
- * Toggle the info panel overlay
484
- */
485
- toggleOverlay() {
486
- this.showInfoPanel = !this.showInfoPanel;
487
- this.overlayWindow.instance.showInfoPanel = this.showInfoPanel;
488
- }
489
- }
490
- InfoPanelComponent.decorators = [
491
- { type: Component, args: [{
492
- selector: 'app-info-panel',
493
- template: "<app-menu-toggle\n tooltip=\"Info panel\"\n icon=\"info-panel\"\n [active]=\"showInfoPanel\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n",
494
- styles: [""]
495
- },] }
496
- ];
497
- InfoPanelComponent.ctorParameters = () => [
498
- { type: Overlay }
499
- ];
500
-
501
- var EventDataFormat;
502
- (function (EventDataFormat) {
503
- EventDataFormat["JSON"] = "JSON";
504
- EventDataFormat["JIVEXML"] = "JIVEXML";
505
- EventDataFormat["IG"] = "IG";
506
- EventDataFormat["ZIP"] = "ZIP";
507
- })(EventDataFormat || (EventDataFormat = {}));
508
- class ImportOption {
509
- constructor(format, fileType, handler, accept) {
510
- this.format = format;
511
- this.fileType = fileType;
512
- this.handler = handler;
513
- this.accept = accept;
514
- }
515
- }
516
-
517
- class IOOptionsDialogComponent {
518
- constructor(eventDisplay, dialogRef) {
519
- this.eventDisplay = eventDisplay;
520
- this.dialogRef = dialogRef;
521
- this.eventDataImportOptions = [EventDataFormat.JSON];
522
- this.supportedEventDataFormats = [
523
- new ImportOption(EventDataFormat.JSON, '.json', this.handleJSONEventDataInput.bind(this), 'application/json'),
524
- new ImportOption(EventDataFormat.JIVEXML, '.xml', this.handleJiveXMLDataInput.bind(this), 'text/xml'),
525
- new ImportOption(EventDataFormat.ZIP, '.zip', this.handleZipEventDataInput.bind(this), '.zip'),
526
- new ImportOption(EventDataFormat.IG, '.ig', this.handleIgEventDataInput.bind(this), '.ig'),
527
- ];
528
- }
529
- ngOnInit() {
530
- this.eventDataOptionsWithHandler = this.supportedEventDataFormats.filter((eventDataFormat) => this.eventDataImportOptions.includes(eventDataFormat.format));
531
- this.eventDataImportOptions.forEach((eventDataImportOption) => {
532
- if (eventDataImportOption instanceof ImportOption) {
533
- const importHandler = eventDataImportOption.handler.bind(this);
534
- eventDataImportOption.handler = (files) => {
535
- importHandler(files);
536
- this.onClose();
537
- };
538
- this.eventDataOptionsWithHandler.push(eventDataImportOption);
539
- }
540
- });
541
- }
542
- getSupportedEventDataFormats() {
543
- return this.eventDataImportOptions
544
- .map((format) => {
545
- if (format instanceof ImportOption) {
546
- return format.format;
547
- }
548
- return format;
549
- })
550
- .filter((format) => format !== 'ZIP')
551
- .join(', ');
552
- }
553
- onClose() {
554
- this.dialogRef.close();
555
- }
556
- handleJSONEventDataInput(files) {
557
- const callback = (content) => {
558
- const json = typeof content === 'string' ? JSON.parse(content) : content;
559
- this.eventDisplay.parsePhoenixEvents(json);
560
- };
561
- this.handleFileInput(files[0], 'json', callback);
562
- }
563
- handleJiveXMLDataInput(files) {
564
- const callback = (content) => {
565
- const jiveloader = new JiveXMLLoader();
566
- jiveloader.process(content);
567
- const eventData = jiveloader.getEventData();
568
- this.eventDisplay.buildEventDataFromJSON(eventData);
569
- };
570
- this.handleFileInput(files[0], 'xml', callback);
571
- }
572
- handleOBJInput(files) {
573
- const callback = (content, name) => {
574
- this.eventDisplay.parseOBJGeometry(content, name);
575
- };
576
- this.handleFileInput(files[0], 'obj', callback);
577
- }
578
- handleSceneInput(files) {
579
- const callback = (content) => {
580
- this.eventDisplay.parsePhoenixDisplay(content);
581
- };
582
- this.handleFileInput(files[0], 'phnx', callback);
583
- }
584
- handleGLTFInput(files) {
585
- const callback = (content, name) => {
586
- this.eventDisplay.parseGLTFGeometry(content, name);
587
- };
588
- this.handleFileInput(files[0], 'gltf', callback);
589
- }
590
- handlePhoenixInput(files) {
591
- const callback = (content) => {
592
- this.eventDisplay.parsePhoenixDisplay(content);
593
- };
594
- this.handleFileInput(files[0], 'phnx', callback);
595
- }
596
- handleROOTInput(files) {
597
- ScriptLoader.loadJSRootScripts().then((JSROOT) => {
598
- const objectName = prompt('Enter object name in ROOT file');
599
- JSROOT.openFile(files[0]).then((file) => {
600
- file.readObject(objectName).then((obj) => {
601
- this.eventDisplay.loadJSONGeometry(JSROOT.GEO.build(obj, { dflt_colors: true }).toJSON(), files[0].name.split('.')[0]);
602
- });
603
- });
604
- });
605
- this.onClose();
606
- }
607
- handleRootJSONInput(files) {
608
- ScriptLoader.loadJSRootScripts().then((JSROOT) => {
609
- const callback = (content, name) => {
610
- this.eventDisplay.loadJSONGeometry(JSROOT.GEO.build(JSROOT.parse(content), {
611
- dflt_colors: true,
612
- }).toJSON(), name);
613
- };
614
- this.handleFileInput(files[0], 'gz', callback);
615
- });
616
- }
617
- handleIgEventDataInput(files) {
618
- const cmsLoader = new CMSLoader();
619
- cmsLoader.readIgArchive(files[0], (allEvents) => {
620
- const allEventsData = cmsLoader.getAllEventsData(allEvents);
621
- this.eventDisplay.parsePhoenixEvents(allEventsData);
622
- this.onClose();
623
- });
624
- }
625
- handleZipEventDataInput(files) {
626
- if (this.isFileOfExtension(files[0], 'zip')) {
627
- this.handleZipInput(files[0], (allFilesWithData) => {
628
- const allEventsObject = {};
629
- // JSON event data
630
- Object.keys(allFilesWithData)
631
- .filter((fileName) => fileName.endsWith('.json'))
632
- .forEach((fileName) => {
633
- Object.assign(allEventsObject, JSON.parse(allFilesWithData[fileName]));
634
- });
635
- // JiveXML event data
636
- const jiveloader = new JiveXMLLoader();
637
- Object.keys(allFilesWithData)
638
- .filter((fileName) => fileName.endsWith('.xml'))
639
- .forEach((fileName) => {
640
- jiveloader.process(allFilesWithData[fileName]);
641
- const eventData = jiveloader.getEventData();
642
- Object.assign(allEventsObject, { [fileName]: eventData });
643
- });
644
- this.eventDisplay.parsePhoenixEvents(allEventsObject);
645
- this.onClose();
646
- });
647
- }
648
- else {
649
- console.error('Error: Invalid file format!');
650
- this.eventDisplay.getInfoLogger().add('Invalid file format!', 'Error');
651
- }
652
- }
653
- handleZipInput(file, callback) {
654
- return __awaiter(this, void 0, void 0, function* () {
655
- const allFilesWithData = {};
656
- // Using a try catch block to catch any errors in Promises
657
- try {
658
- const zipArchive = new JSZip();
659
- yield zipArchive.loadAsync(file);
660
- const allFiles = Object.keys(zipArchive.files);
661
- for (const singleFile of allFiles) {
662
- const fileData = yield zipArchive.file(singleFile).async('string');
663
- allFilesWithData[singleFile] = fileData;
664
- }
665
- callback(allFilesWithData);
666
- }
667
- catch (error) {
668
- console.error('Error while reading zip', error);
669
- this.eventDisplay.getInfoLogger().add('Could not read zip file', 'Error');
670
- }
671
- });
672
- }
673
- handleFileInput(file, extension, callback) {
674
- const reader = new FileReader();
675
- if (this.isFileOfExtension(file, extension)) {
676
- reader.onload = () => {
677
- callback(reader.result.toString(), file.name.split('.')[0]);
678
- };
679
- reader.readAsText(file);
680
- }
681
- else {
682
- console.error('Error: Invalid file format!');
683
- this.eventDisplay.getInfoLogger().add('Invalid file format!', 'Error');
684
- }
685
- this.onClose();
686
- }
687
- isFileOfExtension(file, extension) {
688
- return file.name.split('.').pop() === extension;
689
- }
690
- saveScene() {
691
- this.eventDisplay.exportPhoenixDisplay();
692
- }
693
- exportOBJ() {
694
- this.eventDisplay.exportToOBJ();
695
- }
696
- }
697
- IOOptionsDialogComponent.decorators = [
698
- { type: Component, args: [{
699
- selector: 'app-io-options-dialog',
700
- template: "<div class=\"dialog\">\n <h1 mat-dialog-title>Import and export options</h1>\n <div mat-dialog-content class=\"dialog-content\">\n <div *ngIf=\"eventDataImportOptions.length > 0\">\n <h5>Import</h5>\n\n <h6 class=\"text-center\">Event data</h6>\n\n <div class=\"row centered\">\n <ng-container\n *ngFor=\"let eventDataImportOption of eventDataOptionsWithHandler\"\n >\n <input\n #eventDataFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n [accept]=\"eventDataImportOption.accept\"\n (change)=\"eventDataImportOption.handler($event.target.files)\"\n />\n <button\n class=\"file-input-button\"\n (click)=\"eventDataFileInput.click()\"\n >\n <img src=\"assets/icons/eventData.svg\" alt=\"Event data icon\" />\n Load {{ eventDataImportOption.fileType }}\n </button>\n </ng-container>\n </div>\n\n <p class=\"text-center\">\n Supported formats: {{ getSupportedEventDataFormats() }}\n </p>\n </div>\n\n <h6 class=\"text-center\">Geometries</h6>\n\n <div class=\"row centered\">\n <input\n #objFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".obj\"\n name=\"image\"\n (change)=\"handleOBJInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"objFileInput.click()\">\n <img src=\"assets/icons/obj.svg\" alt=\"\" /> Load .obj\n </button>\n\n <input\n #gltfFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".gltf\"\n name=\"image\"\n (change)=\"handleGLTFInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"gltfFileInput.click()\">\n <img src=\"assets/icons/gltf.svg\" alt=\"\" /> Load .gltf\n </button>\n\n <input\n #rootFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".root\"\n (change)=\"handleROOTInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"rootFileInput.click()\">\n <img src=\"assets/icons/file-import.svg\" alt=\"\" /> Load .root\n </button>\n\n <input\n #rootJSONFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".json.gz\"\n (change)=\"handleRootJSONInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"rootJSONFileInput.click()\">\n <img src=\"assets/icons/file-import.svg\" alt=\"\" /> Load .json.gz\n </button>\n </div>\n\n <p class=\"text-center\">Supported formats: OBJ, GLTF, ROOT, ROOT JSON</p>\n\n <h5>Import / export scene</h5>\n\n <div class=\"row centered\">\n <button\n class=\"file-input-button load-export\"\n id=\"exportScene\"\n (click)=\"saveScene()\"\n >\n <img src=\"assets/icons/save.svg\" alt=\"\" /> Save scene\n </button>\n\n <input\n #loadSceneInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".phnx\"\n name=\"image\"\n (change)=\"handlePhoenixInput($event.target.files)\"\n />\n <button\n class=\"file-input-button load-export\"\n id=\"importScene\"\n (click)=\"loadSceneInput.click()\"\n >\n <img src=\"assets/icons/upload.svg\" alt=\"\" /> Load scene\n </button>\n\n <button\n class=\"file-input-button export-button\"\n id=\"exportOBJ\"\n (click)=\"exportOBJ()\"\n >\n <img src=\"assets/icons/obj.svg\" alt=\"\" /> Save OBJ\n </button>\n </div>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n",
701
- styles: [".row{justify-content:center;margin:1rem 0}.file-input{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}.file-input-button{font-size:1em;font-weight:700;color:#fff;background-color:#6eaece;padding:1em .5em;border:none;border-radius:10px;width:8rem;margin:0 .4rem}.file-input-button.load-export{padding:.8em .2em;width:7rem}.file-input-button.load-export img{max-height:1.2em}.file-input-button.export-button{background-color:#cb7133}.file-input-button.export-button:hover{background-color:#ad5b2d}.file-input-button img{max-height:2em;display:block;width:100%}.file-input-button:hover{background-color:#118ab2}#exportScene{background-color:#5bd99e}#exportScene:hover{background-color:#05c292}#importScene{background-color:#ecc25e}#importScene:hover{background-color:#d6b44d}\n"]
702
- },] }
703
- ];
704
- IOOptionsDialogComponent.ctorParameters = () => [
705
- { type: EventDisplayService },
706
- { type: MatDialogRef }
707
- ];
708
- IOOptionsDialogComponent.propDecorators = {
709
- eventDataImportOptions: [{ type: Input }]
710
- };
711
-
712
- class IoOptionsComponent {
713
- constructor(dialog) {
714
- this.dialog = dialog;
715
- this.eventDataImportOptions = Object.values(EventDataFormat);
716
- }
717
- openIODialog() {
718
- const dialogRef = this.dialog.open(IOOptionsDialogComponent, {
719
- panelClass: 'dialog',
720
- });
721
- dialogRef.componentInstance.eventDataImportOptions =
722
- this.eventDataImportOptions;
723
- }
724
- }
725
- IoOptionsComponent.decorators = [
726
- { type: Component, args: [{
727
- selector: 'app-io-options',
728
- template: "<app-menu-toggle\n tooltip=\"Import and export options\"\n icon=\"import\"\n [active]=\"false\"\n (click)=\"openIODialog()\"\n>\n</app-menu-toggle>\n",
729
- styles: [""]
730
- },] }
731
- ];
732
- IoOptionsComponent.ctorParameters = () => [
733
- { type: MatDialog }
734
- ];
735
- IoOptionsComponent.propDecorators = {
736
- eventDataImportOptions: [{ type: Input }]
737
- };
738
-
739
- class MainViewToggleComponent {
740
- constructor(eventDisplay) {
741
- this.eventDisplay = eventDisplay;
742
- this.orthographicView = false;
743
- }
744
- switchMainView() {
745
- this.orthographicView = !this.orthographicView;
746
- this.eventDisplay
747
- .getUIManager()
748
- .toggleOrthographicView(this.orthographicView);
749
- }
750
- }
751
- MainViewToggleComponent.decorators = [
752
- { type: Component, args: [{
753
- selector: 'app-main-view-toggle',
754
- template: "<app-menu-toggle\n [icon]=\"orthographicView ? 'perspective' : 'orthographic'\"\n [matTooltip]=\"\n 'Switch to ' + (orthographicView ? 'perspective' : 'orthographic') + ' view'\n \"\n (click)=\"switchMainView()\"\n>\n</app-menu-toggle>\n",
755
- styles: [""]
756
- },] }
757
- ];
758
- MainViewToggleComponent.ctorParameters = () => [
759
- { type: EventDisplayService }
760
- ];
761
-
762
- class MenuToggleComponent {
763
- constructor() {
764
- this.disabled = false;
765
- }
766
- }
767
- MenuToggleComponent.decorators = [
768
- { type: Component, args: [{
769
- selector: 'app-menu-toggle',
770
- template: "<button\n class=\"menu-toggle\"\n [ngClass]=\"{ disabled: disabled }\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipTouchGestures=\"off\"\n>\n <svg class=\"menu-toggle-icon\" [ngClass]=\"{ 'active-icon': active }\">\n <use attr.href=\"assets/icons/{{ icon }}.svg#{{ icon }}\"></use>\n </svg>\n</button>\n",
771
- styles: [":host{display:flex;margin:0 .6rem}:host .menu-toggle{display:flex;background:unset;border:none;height:2.5rem;width:2.5rem;min-height:2.5rem;min-width:2.5rem;padding:.65rem;cursor:pointer;align-self:center;transition:all .4s}:host .menu-toggle-icon{width:100%;height:100%}:host .menu-toggle-icon.active-icon{--phoenix-options-icon-path: #00bcd4}:host .menu-toggle:hover{background-color:var(--phoenix-options-icon-bg);border-radius:40%;transition:all .4s}:host .menu-toggle.disabled{cursor:not-allowed;opacity:.4}\n"]
772
- },] }
773
- ];
774
- MenuToggleComponent.propDecorators = {
775
- icon: [{ type: Input }],
776
- active: [{ type: Input }],
777
- tooltip: [{ type: Input }],
778
- disabled: [{ type: Input }]
779
- };
780
-
781
- class ObjectClippingComponent {
782
- constructor(eventDisplay) {
783
- this.eventDisplay = eventDisplay;
784
- const stateManager = this.eventDisplay.getStateManager();
785
- stateManager.clippingEnabled.onUpdate((clippingValue) => (this.clippingEnabled = clippingValue));
786
- stateManager.clippingAngle.onUpdate((value) => (this.clippingAngle = value));
787
- }
788
- changeClippingAngle(change) {
789
- const angle = change.value;
790
- this.eventDisplay.getUIManager().rotateClipping(angle);
791
- }
792
- toggleClipping(change) {
793
- const value = change.checked;
794
- this.eventDisplay.getUIManager().setClipping(value);
795
- this.clippingEnabled = value;
796
- }
797
- }
798
- ObjectClippingComponent.decorators = [
799
- { type: Component, args: [{
800
- selector: 'app-object-clipping',
801
- template: "<mat-menu class=\"mat-menu\" #menu>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n clippingCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #clippingCheckbox\n [checked]=\"clippingEnabled\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleClipping($event)\"\n >Clipping\n </mat-checkbox>\n </button>\n <button class=\"slider-btn\" mat-menu-item (focus)=\"clippingSlider.focus()\">\n <mat-slider\n #clippingSlider\n min=\"0\"\n max=\"180\"\n step=\"1\"\n thumbLabel\n [value]=\"clippingAngle\"\n (click)=\"$event.stopPropagation()\"\n (input)=\"changeClippingAngle($event)\"\n >\n </mat-slider>\n </button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"menu\"\n tooltip=\"Geometry clipping\"\n icon=\"clipping\"\n [active]=\"clippingEnabled\"\n>\n</app-menu-toggle>\n",
802
- styles: [".slider-btn{overflow:visible}mat-slider{margin-left:.75rem;margin-right:.75rem}\n"]
803
- },] }
804
- ];
805
- ObjectClippingComponent.ctorParameters = () => [
806
- { type: EventDisplayService }
807
- ];
808
-
809
- class ObjectSelectionOverlayComponent {
810
- constructor(eventDisplay) {
811
- this.eventDisplay = eventDisplay;
812
- this.selectedObject = { name: 'Object', attributes: [] };
813
- }
814
- ngOnInit() {
815
- this.eventDisplay.allowSelection(this.selectedObject);
816
- }
817
- }
818
- ObjectSelectionOverlayComponent.decorators = [
819
- { type: Component, args: [{
820
- selector: 'app-object-selection-overlay',
821
- template: "<app-overlay\n icon=\"cursor\"\n [overlayTitle]=\"selectedObject.name\"\n [active]=\"!hiddenSelectedInfo\"\n>\n <div\n id=\"selectedObjectPanelBody\"\n class=\"m-1\"\n *ngIf=\"selectedObject.attributes.length > 0\"\n >\n <div\n *ngFor=\"let attribute of selectedObject.attributes\"\n class=\"attributeField\"\n >\n <strong>{{ attribute.attributeName }}</strong>\n : {{ attribute.attributeValue | attributePipe }}\n </div>\n </div>\n</app-overlay>\n",
822
- styles: ["#selectedObjectPanelBody{padding:0 .8em;overflow:auto;max-width:300px;max-height:16rem;min-width:7rem}\n"]
823
- },] }
824
- ];
825
- ObjectSelectionOverlayComponent.ctorParameters = () => [
826
- { type: EventDisplayService }
827
- ];
828
- ObjectSelectionOverlayComponent.propDecorators = {
829
- hiddenSelectedInfo: [{ type: Input }]
830
- };
831
-
832
- class ObjectSelectionComponent {
833
- constructor(overlay, eventDisplay) {
834
- this.overlay = overlay;
835
- this.eventDisplay = eventDisplay;
836
- // Attributes for displaying the information of selected objects
837
- this.hiddenSelectedInfo = true;
838
- }
839
- ngOnInit() {
840
- const overlayRef = this.overlay.create();
841
- const overlayPortal = new ComponentPortal(ObjectSelectionOverlayComponent);
842
- this.overlayWindow = overlayRef.attach(overlayPortal);
843
- this.overlayWindow.instance.hiddenSelectedInfo = this.hiddenSelectedInfo;
844
- }
845
- ngOnDestroy() {
846
- this.overlayWindow.destroy();
847
- }
848
- toggleOverlay() {
849
- this.hiddenSelectedInfo = !this.hiddenSelectedInfo;
850
- this.overlayWindow.instance.hiddenSelectedInfo = this.hiddenSelectedInfo;
851
- this.eventDisplay.enableSelecting(!this.hiddenSelectedInfo);
852
- }
853
- }
854
- ObjectSelectionComponent.decorators = [
855
- { type: Component, args: [{
856
- selector: 'app-object-selection',
857
- template: "<app-menu-toggle\n tooltip=\"Object selection\"\n icon=\"cursor\"\n [active]=\"!hiddenSelectedInfo\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n",
858
- styles: [""]
859
- },] }
860
- ];
861
- ObjectSelectionComponent.ctorParameters = () => [
862
- { type: Overlay },
863
- { type: EventDisplayService }
864
- ];
865
-
866
- /**
867
- * Component for overlay panel.
868
- */
869
- class OverlayComponent {
870
- constructor() {
871
- /** If the overlay is open or not. */
872
- this.active = false;
873
- /** If the overlay is resizable. */
874
- this.resizable = false;
875
- /** If the overlay body is transparent or not. */
876
- this.transparentBody = false;
877
- /** If the overlay body is visible or not. */
878
- this.showBody = true;
879
- /** Minimum resizable width. */
880
- this.MIN_RES_WIDTH = 300;
881
- /** Minimum resizable height */
882
- this.MIN_RES_HEIGHT = 100;
883
- }
884
- /**
885
- * Move the resizable handle to the bottom right after the component is created.
886
- */
887
- ngAfterViewInit() {
888
- if (this.resizable) {
889
- const resizeHandleElement = this.resizeHandleCorner.nativeElement;
890
- resizeHandleElement.style.bottom = '0';
891
- resizeHandleElement.style.right = '0';
892
- new ResizeSensor(this.overlayCard.nativeElement, () => {
893
- this.resetHandlePosition();
894
- });
895
- window.addEventListener('resize', () => {
896
- this.resetHandlePosition();
897
- });
898
- }
899
- }
900
- /**
901
- * Resize the overlay card when the resize handle is dragged.
902
- */
903
- onResize() {
904
- const resizeHandleElement = this.resizeHandleCorner.nativeElement;
905
- const overlayCardElement = this.overlayCard.nativeElement;
906
- const dragRect = resizeHandleElement.getBoundingClientRect();
907
- const overlayRect = overlayCardElement.getBoundingClientRect();
908
- const width = dragRect.left - overlayRect.left + dragRect.width;
909
- const height = dragRect.top - overlayRect.top + dragRect.height;
910
- this.setHandleTransform(overlayRect, dragRect);
911
- if (width > this.MIN_RES_WIDTH && height > this.MIN_RES_HEIGHT) {
912
- overlayCardElement.style.width = width + 'px';
913
- overlayCardElement.style.height = height + 'px';
914
- }
915
- }
916
- /**
917
- * Reset resize handle position.
918
- */
919
- resetHandlePosition() {
920
- const resizeHandleElement = this.resizeHandleCorner.nativeElement;
921
- this.setHandleTransform(this.overlayCard.nativeElement.getBoundingClientRect(), resizeHandleElement.getBoundingClientRect());
922
- resizeHandleElement.style.bottom = null;
923
- resizeHandleElement.style.right = null;
924
- }
925
- /**
926
- * Set the position of the resize handle using transform3d.
927
- * @param overlayRect Bounding client rectangle of the overlay card.
928
- * @param dragRect Bounding client rectangle of the resize handle.
929
- */
930
- setHandleTransform(overlayRect, dragRect) {
931
- const translateX = overlayRect.width - dragRect.width;
932
- const translateY = overlayRect.height - dragRect.height;
933
- this.resizeHandleCorner.nativeElement.style.transform = `translate3d(${translateX}px, ${translateY}px, 0)`;
934
- }
935
- }
936
- OverlayComponent.decorators = [
937
- { type: Component, args: [{
938
- selector: 'app-overlay',
939
- template: "<div\n #overlayCard\n class=\"overlay-card card\"\n [hidden]=\"!active\"\n cdkDrag\n cdkDragBoundary=\"body\"\n>\n <div\n class=\"card-header d-flex justify-content-between\"\n [ngClass]=\"{ 'with-body': showBody }\"\n cdkDragHandle\n *ngIf=\"overlayTitle\"\n >\n <div class=\"align-self-center card-icon\" *ngIf=\"icon\">\n <svg>\n <use attr.href=\"assets/icons/{{ icon }}.svg#{{ icon }}\"></use>\n </svg>\n </div>\n <h5 class=\"align-self-center m-0 px-2\">{{ overlayTitle }}</h5>\n <button\n class=\"align-self-center card-icon btn-blank expandCollapse\"\n matTooltip=\"Expand / Collapse\"\n matTooltipPosition=\"right\"\n [ngClass]=\"{ expand: showBody }\"\n (click)=\"showBody = !showBody\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n <div\n class=\"overlay-card-content\"\n *ngIf=\"showBody\"\n [ngClass]=\"{ 'transparent-bg': transparentBody }\"\n >\n <ng-content></ng-content>\n </div>\n <!-- Making the overlay resizable -->\n <span\n #resizeHandleCorner\n class=\"resize-handle corner\"\n *ngIf=\"resizable\"\n [hidden]=\"!showBody\"\n cdkDrag\n (cdkDragMoved)=\"onResize()\"\n ></span>\n</div>\n",
940
- encapsulation: ViewEncapsulation.None,
941
- styles: [".overlay-card.card{color:var(--phoenix-text-color);background:none;max-width:100vw;font-size:12px;min-width:300px;height:100%;max-height:70vh;box-shadow:none;border:none;position:relative;z-index:200}.overlay-card.card .card-header{width:12rem;background:var(--phoenix-background-color-secondary);box-shadow:var(--phoenix-box-shadow);padding:.4rem .8rem;border-radius:10px;border:none;cursor:move;text-align:center;transition:all .2s}.overlay-card.card .card-header.with-body{border-bottom-left-radius:0;border-bottom-right-radius:0}.overlay-card.card .card-header .card-icon{display:flex;height:.7rem;width:.7rem}.overlay-card.card .card-header h5{font-size:.9rem}.overlay-card.card .card-header .expandCollapse{cursor:pointer;transition:all .2s}.overlay-card.card .card-header .expandCollapse.expand{transform:scaleY(-1)}.overlay-card.card .card-header .expandCollapse svg{width:100%;height:100%}.overlay-card.card .overlay-card-content{background:var(--phoenix-background-color-secondary);box-shadow:var(--phoenix-box-shadow);border-radius:0 10px 10px;overflow:auto;height:100%}.overlay-card.card .overlay-card-content.transparent-bg{background:none}.overlay-card.card .list-group{color:var(--phoenix-text-color-secondary);background:var(--phoenix-background-color-secondary);max-height:40vh;overflow:auto}.overlay-card.card .list-group .list-group-item{background-color:var(--phoenix-background-color-secondary);border-color:var(--phoenix-border)}.overlay-card.card .resize-handle{width:1rem;height:1rem;cursor:nwse-resize;position:absolute}.overlay-card.card .resize-handle.corner{border-right:.2rem solid var(--phoenix-text-color);border-bottom:.2rem solid var(--phoenix-text-color)}\n"]
942
- },] }
943
- ];
944
- OverlayComponent.propDecorators = {
945
- overlayTitle: [{ type: Input }],
946
- active: [{ type: Input }],
947
- icon: [{ type: Input }],
948
- resizable: [{ type: Input }],
949
- transparentBody: [{ type: Input }],
950
- overlayCard: [{ type: ViewChild, args: ['overlayCard',] }],
951
- resizeHandleCorner: [{ type: ViewChild, args: ['resizeHandleCorner',] }]
952
- };
953
-
954
- class OverlayViewWindowComponent {
955
- constructor(eventDisplay) {
956
- this.eventDisplay = eventDisplay;
957
- this.showOverlay = true;
958
- this.transparentBody = false;
959
- this.orthographicView = false;
960
- this.overlayViewFixed = false;
961
- }
962
- ngAfterViewInit() {
963
- const canvas = this.initializeCanvas(this.overlayWindow.nativeElement);
964
- this.eventDisplay.setOverlayRenderer(canvas);
965
- }
966
- initializeCanvas(canvas) {
967
- const width = window.innerWidth / 2.5;
968
- const height = window.innerHeight / 2.5;
969
- canvas.width = width;
970
- canvas.height = height;
971
- canvas.style.width = width.toString() + ' px';
972
- canvas.style.height = height.toString() + ' px';
973
- return canvas;
974
- }
975
- switchOverlayView() {
976
- this.orthographicView = !this.orthographicView;
977
- this.eventDisplay
978
- .getUIManager()
979
- .toggleOrthographicView(this.orthographicView);
980
- }
981
- fixOverlayView() {
982
- this.overlayViewFixed = !this.overlayViewFixed;
983
- this.eventDisplay.fixOverlayView(this.overlayViewFixed);
984
- }
985
- toggleBgTransparency() {
986
- this.transparentBody = !this.transparentBody;
987
- }
988
- }
989
- OverlayViewWindowComponent.decorators = [
990
- { type: Component, args: [{
991
- selector: 'app-overlay-view-window',
992
- template: "<app-overlay\n overlayTitle=\"Overlay View\"\n icon=\"overlay\"\n [resizable]=\"true\"\n [transparentBody]=\"transparentBody\"\n [active]=\"showOverlay\"\n>\n <div class=\"overlay-view-wrapper\">\n <canvas #overlayWindow id=\"overlay-canvas\" [hidden]=\"!showOverlay\">\n </canvas>\n <div class=\"overlay-view-controls position-absolute d-flex flex-row\">\n <app-menu-toggle\n class=\"overlay-view-control\"\n icon=\"transparent\"\n matTooltip=\"Toggle background transparency\"\n (click)=\"toggleBgTransparency()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n class=\"overlay-view-control\"\n icon=\"move-lock\"\n [matTooltip]=\"(overlayViewFixed ? 'Restore' : 'Fix') + ' overlay view'\"\n [active]=\"overlayViewFixed\"\n (click)=\"fixOverlayView()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n class=\"overlay-view-control\"\n [icon]=\"orthographicView ? 'orthographic' : 'perspective'\"\n [matTooltip]=\"\n 'Switch to ' +\n (orthographicView ? 'orthographic' : 'perspective') +\n ' view'\n \"\n (click)=\"switchOverlayView()\"\n >\n </app-menu-toggle>\n </div>\n </div>\n</app-overlay>\n",
993
- styles: ["#overlay-canvas{background-color:#0000001a;width:100%}.overlay-view-controls{bottom:1em;right:1em;opacity:0;transition:opacity .2s}.overlay-view-controls .overlay-view-control{background:var(--phoenix-background-color-secondary);box-shadow:var(--phoenix-box-shadow);overflow:hidden;width:2.5rem;height:2.5rem;border-radius:50%;display:flex;justify-content:center;align-items:center}.overlay-view-wrapper:hover .overlay-view-controls{opacity:1;transition:opacity .2s}\n"]
994
- },] }
995
- ];
996
- OverlayViewWindowComponent.ctorParameters = () => [
997
- { type: EventDisplayService }
998
- ];
999
- OverlayViewWindowComponent.propDecorators = {
1000
- showOverlay: [{ type: Input }],
1001
- overlayWindow: [{ type: ViewChild, args: ['overlayWindow',] }]
1002
- };
1003
-
1004
- class OverlayViewComponent {
1005
- constructor(overlay) {
1006
- this.overlay = overlay;
1007
- this.showOverlay = false;
1008
- }
1009
- ngOnInit() {
1010
- const overlayRef = this.overlay.create();
1011
- const overlayPortal = new ComponentPortal(OverlayViewWindowComponent);
1012
- this.overlayWindow = overlayRef.attach(overlayPortal);
1013
- this.overlayWindow.instance.showOverlay = this.showOverlay;
1014
- }
1015
- ngOnDestroy() {
1016
- this.overlayWindow.destroy();
1017
- }
1018
- toggleOverlay() {
1019
- this.showOverlay = !this.showOverlay;
1020
- this.overlayWindow.instance.showOverlay = this.showOverlay;
1021
- }
1022
- }
1023
- OverlayViewComponent.decorators = [
1024
- { type: Component, args: [{
1025
- selector: 'app-overlay-view',
1026
- template: "<app-menu-toggle\n tooltip=\"Overlay view\"\n icon=\"overlay\"\n [active]=\"showOverlay\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n",
1027
- styles: [""]
1028
- },] }
1029
- ];
1030
- OverlayViewComponent.ctorParameters = () => [
1031
- { type: Overlay }
1032
- ];
1033
-
1034
- class TreeMenuComponent {
1035
- constructor() {
1036
- this.rootNode = {
1037
- name: 'Atlas Detector',
1038
- geometryId: 'AtlasDetector',
1039
- children: [
1040
- {
1041
- name: 'Magnet systems',
1042
- geometryId: 'MagnetSys',
1043
- children: [
1044
- {
1045
- name: 'Toroids',
1046
- geometryId: 'Toroids',
1047
- },
1048
- ],
1049
- },
1050
- {
1051
- name: 'Calorimeters',
1052
- geometryId: 'CaloSys',
1053
- children: [
1054
- {
1055
- name: 'LAr Barrel',
1056
- geometryId: 'LAr Barrel',
1057
- },
1058
- {
1059
- name: 'LAr EC1',
1060
- geometryId: 'LAr EC1',
1061
- },
1062
- {
1063
- name: 'LAr EC2',
1064
- geometryId: 'LAr EC2',
1065
- },
1066
- {
1067
- name: 'Tile Cal',
1068
- geometryId: 'Tile Cal',
1069
- },
1070
- ],
1071
- },
1072
- {
1073
- name: 'Inner detector',
1074
- geometryId: 'InDetSys',
1075
- children: [
1076
- {
1077
- name: 'Pixel',
1078
- geometryId: 'Pixel',
1079
- },
1080
- {
1081
- name: 'SCT',
1082
- geometryId: 'SCT',
1083
- },
1084
- {
1085
- name: 'TRT',
1086
- geometryId: 'TRT',
1087
- },
1088
- ],
1089
- },
1090
- ],
1091
- };
1092
- }
1093
- ngOnInit() { }
1094
- }
1095
- TreeMenuComponent.decorators = [
1096
- { type: Component, args: [{
1097
- selector: 'app-tree-menu',
1098
- template: "<div class=\"tree-wrapper\">\n <div class=\"tree-menu\">\n <app-tree-menu-item [node]=\"rootNode\"></app-tree-menu-item>\n </div>\n</div>\n",
1099
- styles: [".tree-wrapper{position:absolute;top:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center;align-content:center}.tree-menu{display:flex;flex-direction:column;justify-content:center;align-items:center;align-content:center;max-height:70vh;overflow-y:scroll}.example-tree-invisible{display:none}.example-tree ul,.example-tree li{margin-top:0;margin-bottom:0;list-style-type:none}\n"]
1100
- },] }
1101
- ];
1102
- TreeMenuComponent.ctorParameters = () => [];
1103
-
1104
- class TreeMenuItemComponent {
1105
- constructor(eventDisplay) {
1106
- this.eventDisplay = eventDisplay;
1107
- this.isExpanded = false;
1108
- this.visible = true;
1109
- }
1110
- toggleVisibility(visible) {
1111
- console.log("hi! it's " + this.node.name);
1112
- this.eventDisplay
1113
- .getUIManager()
1114
- .geometryVisibility(this.node.geometryId, visible);
1115
- this.visible = visible;
1116
- this.children.forEach((child) => child.toggleVisibility(visible));
1117
- }
1118
- }
1119
- TreeMenuItemComponent.decorators = [
1120
- { type: Component, args: [{
1121
- selector: 'app-tree-menu-item',
1122
- template: "<ng-container *ngIf=\"node\">\n <div class=\"header\" [ngClass]=\"{ visible: visible }\">\n <button\n *ngIf=\"node.children\"\n mat-icon-button\n matTreeNodeToggle\n (click)=\"isExpanded = !isExpanded\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ isExpanded ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <div (click)=\"toggleVisibility(!visible)\" class=\"node-name\">\n {{ node.name }}\n </div>\n </div>\n <ul [hidden]=\"!isExpanded\" hid>\n <div class=\"children\">\n <li *ngFor=\"let node of node.children\">\n <app-tree-menu-item [node]=\"node\"></app-tree-menu-item>\n </li>\n </div>\n </ul>\n</ng-container>\n",
1123
- styles: [".header{cursor:pointer;user-select:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;display:flex;flex-direction:row;align-items:center}.header .node-name,.header .mat-icon-rtl-mirror{color:var(--phoenix-text-color-secondary)}.header.visible .node-name,.header.visible .mat-icon-rtl-mirror{color:var(--phoenix-accent)}.children li{list-style-type:none}\n"]
1124
- },] }
1125
- ];
1126
- TreeMenuItemComponent.ctorParameters = () => [
1127
- { type: EventDisplayService }
1128
- ];
1129
- TreeMenuItemComponent.propDecorators = {
1130
- children: [{ type: ViewChildren, args: [TreeMenuItemComponent,] }],
1131
- node: [{ type: Input }]
1132
- };
1133
-
1134
- class ViewOptionsComponent {
1135
- constructor(eventDisplay) {
1136
- this.eventDisplay = eventDisplay;
1137
- }
1138
- ngOnInit() {
1139
- this.views = this.eventDisplay.getUIManager().getPresetViews();
1140
- }
1141
- displayView($event, view) {
1142
- $event.stopPropagation();
1143
- this.eventDisplay.getUIManager().displayView(view);
1144
- }
1145
- setAxis(change) {
1146
- const value = change.checked;
1147
- this.eventDisplay.getUIManager().setShowAxis(value);
1148
- }
1149
- setGrid(change) {
1150
- const value = change.checked;
1151
- this.eventDisplay.getUIManager().setShowGrid(value);
1152
- }
1153
- }
1154
- ViewOptionsComponent.decorators = [
1155
- { type: Component, args: [{
1156
- selector: 'app-view-options',
1157
- template: "<mat-menu #viewOptions>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n showGridCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #showGridCheckbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"setGrid($event)\"\n >Show Grid\n </mat-checkbox>\n </button>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n showAxisCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #showAxisCheckbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"setAxis($event)\"\n >Show axis\n </mat-checkbox>\n </button>\n <button\n mat-menu-item\n *ngFor=\"let view of views\"\n (click)=\"displayView($event, view)\"\n >\n <svg class=\"view-icon\" *ngIf=\"view.icon\">\n <use attr.href=\"assets/icons/{{ view.icon }}.svg#{{ view.icon }}\"></use>\n </svg>\n {{ view.name }}\n </button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"viewOptions\"\n tooltip=\"View options\"\n icon=\"views\"\n [active]=\"false\"\n>\n</app-menu-toggle>\n",
1158
- styles: [".view-icon{width:1.2rem;height:1.2rem;margin-right:.5rem}\n"]
1159
- },] }
1160
- ];
1161
- ViewOptionsComponent.ctorParameters = () => [
1162
- { type: EventDisplayService }
1163
- ];
1164
-
1165
- class VrToggleComponent {
1166
- constructor(eventDisplay) {
1167
- var _a, _b, _c;
1168
- this.eventDisplay = eventDisplay;
1169
- this.vrSupported = false;
1170
- this.vrActive = false;
1171
- // NOTE: WebXR needs secure HTTPS context
1172
- // Query for permissions of XR before using it (not supported by browsers yet). See https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query
1173
- (_c = (_b = (_a = navigator) === null || _a === void 0 ? void 0 : _a.xr) === null || _b === void 0 ? void 0 : _b.isSessionSupported) === null || _c === void 0 ? void 0 : _c.call(_b, VRManager.SESSION_TYPE).then((supported) => {
1174
- if (supported) {
1175
- this.vrSupported = true;
1176
- }
1177
- }).catch((err) => console.warn('Error in VR', err));
1178
- }
1179
- toggleVr() {
1180
- // If toggling VR on
1181
- if (!this.vrActive) {
1182
- this.eventDisplay.initXR(XRSessionType.VR, () => {
1183
- this.vrActive = false;
1184
- // Disable renderer XR and remove animation loop
1185
- this.eventDisplay.endXR(XRSessionType.VR);
1186
- });
1187
- this.vrActive = true;
1188
- }
1189
- else {
1190
- this.eventDisplay.endXR(XRSessionType.VR);
1191
- this.vrActive = false;
1192
- }
1193
- }
1194
- }
1195
- VrToggleComponent.decorators = [
1196
- { type: Component, args: [{
1197
- selector: 'app-vr-toggle',
1198
- template: "<app-menu-toggle\n [disabled]=\"!vrSupported\"\n [active]=\"vrActive\"\n icon=\"vr\"\n (click)=\"vrSupported && toggleVr()\"\n [tooltip]=\"\n vrSupported ? (vrActive ? 'Exit VR' : 'Enter VR') : 'VR not supported'\n \"\n>\n</app-menu-toggle>\n",
1199
- styles: [""]
1200
- },] }
1201
- ];
1202
- VrToggleComponent.ctorParameters = () => [
1203
- { type: EventDisplayService }
1204
- ];
1205
-
1206
- class ArToggleComponent {
1207
- constructor(eventDisplay) {
1208
- var _a, _b;
1209
- this.eventDisplay = eventDisplay;
1210
- this.arSupported = false;
1211
- this.arActive = false;
1212
- // NOTE: WebXR needs secure HTTPS context
1213
- // Query for permissions of XR before using it (not supported by browsers yet). See https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query
1214
- (_b = (_a = navigator.xr) === null || _a === void 0 ? void 0 : _a.isSessionSupported) === null || _b === void 0 ? void 0 : _b.call(_a, ARManager.SESSION_TYPE).then((supported) => {
1215
- if (supported) {
1216
- this.arSupported = true;
1217
- }
1218
- }).catch((err) => console.warn('Error in AR', err));
1219
- }
1220
- toggleAr(enableDomOverlay = true) {
1221
- ARManager.enableDomOverlay = enableDomOverlay;
1222
- // If toggling AR on
1223
- if (!this.arActive) {
1224
- this.eventDisplay.initXR(XRSessionType.AR, () => {
1225
- this.arActive = false;
1226
- // Disable renderer XR and remove animation loop
1227
- this.eventDisplay.endXR(XRSessionType.AR);
1228
- });
1229
- this.arActive = true;
1230
- }
1231
- else {
1232
- this.eventDisplay.endXR(XRSessionType.AR);
1233
- this.arActive = false;
1234
- }
1235
- }
1236
- }
1237
- ArToggleComponent.decorators = [
1238
- { type: Component, args: [{
1239
- selector: 'app-ar-toggle',
1240
- template: "<mat-menu #arToggleOptions>\n <ng-container *ngIf=\"arSupported\">\n <button mat-menu-item (click)=\"toggleAr(true)\">AR with overlays</button>\n <button mat-menu-item (click)=\"toggleAr(false)\">AR without overlays</button>\n </ng-container>\n <button *ngIf=\"!arSupported\" mat-menu-item disabled>AR not supported</button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"arToggleOptions\"\n (click)=\"arSupported && (arActive ? toggleAr() : null)\"\n [disabled]=\"!arSupported\"\n [active]=\"arActive\"\n icon=\"ar\"\n [tooltip]=\"\n arSupported ? (arActive ? 'Exit AR' : 'Enter AR') : 'AR not supported'\n \"\n>\n</app-menu-toggle>\n",
1241
- styles: [""]
1242
- },] }
1243
- ];
1244
- ArToggleComponent.ctorParameters = () => [
1245
- { type: EventDisplayService }
1246
- ];
1247
-
1248
- /**
1249
- * Component for adding zoom controls for the main and overlay cameras.
1250
- */
1251
- class ZoomControlsComponent {
1252
- constructor(eventDisplay) {
1253
- this.eventDisplay = eventDisplay;
1254
- /** Factor to zoom by. */
1255
- this.zoomFactor = 1.1;
1256
- /** The speed and time of zoom. */
1257
- this.zoomTime = 200;
1258
- }
1259
- /**
1260
- * Zoom all the cameras by a specific zoom factor.
1261
- * The factor may either be greater (zoom in) or smaller (zoom out) than 1.
1262
- * @param zoomFactor The factor to zoom by.
1263
- */
1264
- zoomTo(zoomFactor) {
1265
- this.zoomTime =
1266
- this.zoomTime > 30 ? Math.floor(this.zoomTime / 1.1) : this.zoomTime;
1267
- this.eventDisplay.zoomTo(zoomFactor, this.zoomTime);
1268
- this.zoomTimeout = setTimeout(() => {
1269
- this.zoomTo(zoomFactor);
1270
- }, this.zoomTime);
1271
- }
1272
- /**
1273
- * Zoom the camera in.
1274
- * @param leftClick Whether the mouse click is left or not.
1275
- */
1276
- zoomIn(leftClick) {
1277
- if (leftClick) {
1278
- this.zoomTo(1 / this.zoomFactor);
1279
- }
1280
- }
1281
- /**
1282
- * Zoom the camera out.
1283
- * @param leftClick Whether the mouse click is left or not.s
1284
- */
1285
- zoomOut(leftClick) {
1286
- if (leftClick) {
1287
- this.zoomTo(this.zoomFactor);
1288
- }
1289
- }
1290
- /**
1291
- * Reset the zoom time which decreases upon hold and clear the zoom timeout.
1292
- */
1293
- clearZoom() {
1294
- this.zoomTime = 200;
1295
- clearTimeout(this.zoomTimeout);
1296
- }
1297
- }
1298
- ZoomControlsComponent.decorators = [
1299
- { type: Component, args: [{
1300
- selector: 'app-zoom-controls',
1301
- template: "<div class=\"d-flex\">\n <app-menu-toggle\n tooltip=\"Zoom out (hold)\"\n icon=\"zoom-out\"\n [active]=\"false\"\n (click)=\"zoomOut(true); clearZoom()\"\n (touchstart)=\"zoomOut(true)\"\n (mousedown)=\"zoomOut($event.button === 0)\"\n (mouseup)=\"clearZoom()\"\n (mouseleave)=\"clearZoom()\"\n (touchend)=\"clearZoom()\"\n (touchcancel)=\"clearZoom()\"\n (touchmove)=\"clearZoom()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n tooltip=\"Zoom in (hold)\"\n icon=\"zoom-in\"\n [active]=\"false\"\n (click)=\"zoomIn(true); clearZoom()\"\n (touchstart)=\"zoomIn(true)\"\n (mousedown)=\"zoomIn($event.button === 0)\"\n (mouseup)=\"clearZoom()\"\n (mouseleave)=\"clearZoom()\"\n (touchend)=\"clearZoom()\"\n (touchcancel)=\"clearZoom()\"\n (touchmove)=\"clearZoom()\"\n >\n </app-menu-toggle>\n</div>\n",
1302
- styles: [""]
1303
- },] }
1304
- ];
1305
- ZoomControlsComponent.ctorParameters = () => [
1306
- { type: EventDisplayService }
1307
- ];
1308
-
1309
- class SSModeComponent {
1310
- constructor() {
1311
- this.ssMode = false;
1312
- this.onDocumentClick = () => {
1313
- var _a;
1314
- (_a = document.exitFullscreen) === null || _a === void 0 ? void 0 : _a.call(document);
1315
- };
1316
- }
1317
- ngOnInit() {
1318
- document.onfullscreenchange = () => {
1319
- if (!document.fullscreenElement) {
1320
- this.toggleSSMode();
1321
- }
1322
- };
1323
- }
1324
- toggleSSMode() {
1325
- var _a, _b;
1326
- this.ssMode = !this.ssMode;
1327
- document.body.classList.toggle('ss-mode');
1328
- if (this.ssMode) {
1329
- // WORKAROUND - Adding the event listener directly somehow calls it on the first click
1330
- setTimeout(() => {
1331
- document.addEventListener('click', this.onDocumentClick);
1332
- document.addEventListener('touchstart', this.onDocumentClick);
1333
- }, 1);
1334
- (_b = (_a = document.documentElement).requestFullscreen) === null || _b === void 0 ? void 0 : _b.call(_a);
1335
- }
1336
- else {
1337
- document.removeEventListener('click', this.onDocumentClick);
1338
- document.removeEventListener('touchstart', this.onDocumentClick);
1339
- }
1340
- }
1341
- }
1342
- SSModeComponent.decorators = [
1343
- { type: Component, args: [{
1344
- selector: 'app-ss-mode',
1345
- template: "<app-menu-toggle\n tooltip=\"Screenshot mode\"\n [active]=\"ssMode\"\n icon=\"ss-mode\"\n (click)=\"toggleSSMode()\"\n>\n</app-menu-toggle>\n",
1346
- encapsulation: ViewEncapsulation.None,
1347
- styles: ["app-ui-menu #uiMenu,app-phoenix-menu #phoenixMenu,app-nav #mainLogo,#statsElement{visibility:visible;opacity:1;transition:opacity .4s}.ss-mode app-ui-menu #uiMenu,.ss-mode app-phoenix-menu #phoenixMenu,.ss-mode app-nav #mainLogo,.ss-mode #statsElement{visibility:hidden;opacity:0}\n"]
1348
- },] }
1349
- ];
1350
-
1351
- class PerformanceToggleComponent {
1352
- constructor(eventDisplay) {
1353
- this.eventDisplay = eventDisplay;
1354
- this.performanceMode = false;
1355
- }
1356
- togglePerformance() {
1357
- this.performanceMode = !this.performanceMode;
1358
- this.eventDisplay.getThreeManager().setAntialiasing(!this.performanceMode);
1359
- }
1360
- }
1361
- PerformanceToggleComponent.decorators = [
1362
- { type: Component, args: [{
1363
- selector: 'app-performance-toggle',
1364
- template: "<app-menu-toggle\n tooltip=\"Performance mode\"\n [active]=\"performanceMode\"\n icon=\"performance\"\n (click)=\"togglePerformance()\"\n>\n</app-menu-toggle>\n",
1365
- styles: [""]
1366
- },] }
1367
- ];
1368
- PerformanceToggleComponent.ctorParameters = () => [
1369
- { type: EventDisplayService }
1370
- ];
1371
-
1372
- class UiMenuComponent {
1373
- constructor() {
1374
- this.eventDataImportOptions = Object.values(EventDataFormat);
1375
- this.animationPresets = defaultAnimationPresets;
1376
- this.hideUIMenu = false;
1377
- }
1378
- }
1379
- UiMenuComponent.decorators = [
1380
- { type: Component, args: [{
1381
- selector: 'app-ui-menu',
1382
- template: "<div id=\"uiMenu\">\n <button\n id=\"hide-ui-menu\"\n [matTooltip]=\"hideUIMenu ? 'Show toolbar' : 'Hide toolbar'\"\n matTooltipPosition=\"above\"\n (click)=\"hideUIMenu = !hideUIMenu\"\n [ngClass]=\"{ 'ui-menu-hidden': hideUIMenu }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n <div id=\"optionsPanel\" [hidden]=\"hideUIMenu\">\n <!-- Event selector -->\n <app-event-selector></app-event-selector>\n\n <!-- Zoom in and zoom out controls -->\n <app-zoom-controls></app-zoom-controls>\n\n <app-view-options></app-view-options>\n\n <app-auto-rotate></app-auto-rotate>\n\n <!-- Dark theme toggle -->\n <app-dark-theme></app-dark-theme>\n\n <!-- Toggle for clipping geometries -->\n <app-object-clipping></app-object-clipping>\n\n <!-- Main view toggle -->\n <app-main-view-toggle></app-main-view-toggle>\n\n <!-- Toggle for overlay panel -->\n <app-overlay-view></app-overlay-view>\n\n <!-- Toggle for selected object panel -->\n <app-object-selection></app-object-selection>\n\n <!-- Info panel -->\n <app-info-panel></app-info-panel>\n\n <!-- Toggle for animating the event data -->\n <app-animate-event></app-animate-event>\n\n <!-- Toggle for animating camera through event -->\n <app-animate-camera\n [animationPresets]=\"animationPresets\"\n ></app-animate-camera>\n\n <!-- Toggle for collections info -->\n <app-collections-info></app-collections-info>\n\n <!-- Toggle for performance -->\n <app-performance-toggle></app-performance-toggle>\n\n <!-- Toggle for VR -->\n <app-vr-toggle></app-vr-toggle>\n\n <!-- Toggle for AR -->\n <app-ar-toggle></app-ar-toggle>\n\n <!-- Toggle for screenshot mode -->\n <app-ss-mode></app-ss-mode>\n\n <!-- Toggle for loading geometries modal-->\n <app-io-options\n [eventDataImportOptions]=\"eventDataImportOptions\"\n ></app-io-options>\n\n <!-- Toggle for shareable link constructor modal-->\n <app-share-link></app-share-link>\n\n <!-- Extra options -->\n <ng-content></ng-content>\n </div>\n</div>\n",
1383
- styles: ["#uiMenu{position:absolute;bottom:1rem;width:100%;box-sizing:border-box;display:flex;flex-direction:column;align-items:center}#optionsPanel{display:flex;align-items:center;background:var(--phoenix-background-color-secondary);border:1px solid var(--phoenix-background-color-tertiary);box-shadow:var(--phoenix-box-shadow);border-radius:30px;max-width:95%;padding:.3rem 1rem;overflow-x:scroll;z-index:90}#hide-ui-menu{background:var(--phoenix-background-color-secondary);height:1.2rem;width:3rem;border:1px solid var(--phoenix-border);border-bottom:none;box-shadow:var(--phoenix-box-shadow);border-top-left-radius:15px;border-top-right-radius:15px;padding:3px}#hide-ui-menu svg{height:100%;width:100%;vertical-align:top;transition:all .3s}#hide-ui-menu.ui-menu-hidden svg{transform:scaleY(-1);transition:all .3s}\n"]
1384
- },] }
1385
- ];
1386
- UiMenuComponent.propDecorators = {
1387
- eventDataImportOptions: [{ type: Input }],
1388
- animationPresets: [{ type: Input }]
1389
- };
1390
-
1391
- class ShareLinkDialogComponent {
1392
- constructor(dialogRef) {
1393
- this.dialogRef = dialogRef;
1394
- this.urlOptions = Object.assign({}, phoenixURLOptions);
1395
- const locationHref = window.location.href;
1396
- const lastIndex = locationHref.lastIndexOf('?') === -1
1397
- ? locationHref.length
1398
- : locationHref.lastIndexOf('?');
1399
- this.baseLink = locationHref.slice(0, lastIndex);
1400
- this.shareLink = this.baseLink;
1401
- this.embedLink = this.getEmbedLink();
1402
- }
1403
- onClose() {
1404
- this.dialogRef.close();
1405
- }
1406
- getEmbedLink(urlParametersString = '') {
1407
- return `<iframe src="${this.baseLink}?embed=true${urlParametersString ? '&' : ''}${urlParametersString}"></iframe>`;
1408
- }
1409
- setOptionValue(option, value) {
1410
- this.urlOptions[option] = value;
1411
- this.onOptionsChange();
1412
- }
1413
- onOptionsChange() {
1414
- const urlParametersString = Object.getOwnPropertyNames(this.urlOptions)
1415
- .reduce((filteredOptions, option) => {
1416
- if (this.urlOptions[option]) {
1417
- filteredOptions.push(`${option}=${encodeURI(this.urlOptions[option])}`);
1418
- }
1419
- return filteredOptions;
1420
- }, [])
1421
- .join('&');
1422
- this.shareLink =
1423
- this.baseLink + (urlParametersString ? '?' : '') + urlParametersString;
1424
- this.embedLink = this.getEmbedLink(urlParametersString);
1425
- }
1426
- copyText(text, element) {
1427
- const inputElement = document.createElement('input');
1428
- document.body.appendChild(inputElement);
1429
- inputElement.value = text;
1430
- inputElement.select();
1431
- document.execCommand('copy');
1432
- document.body.removeChild(inputElement);
1433
- element.focus();
1434
- // Set text on copying
1435
- element.innerText = 'COPIED';
1436
- setTimeout(() => {
1437
- element.innerText = 'COPY';
1438
- }, 2000);
1439
- }
1440
- }
1441
- ShareLinkDialogComponent.decorators = [
1442
- { type: Component, args: [{
1443
- selector: 'app-share-link-dialog',
1444
- template: "<div class=\"dialog\">\n <h1 mat-dialog-title>Create shareable link</h1>\n <div mat-dialog-content class=\"dialog-content\">\n <h5>URL options</h5>\n <div class=\"form-group mt-2\">\n <label for=\"eventDataFile\">Event data file (URL or path)</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"eventDataFile\"\n placeholder=\"assets/files/event_data/atlaseventdump2.json\"\n [value]=\"urlOptions.file\"\n (input)=\"setOptionValue('file', $event.target.value)\"\n />\n </div>\n <div class=\"form-group\">\n <label for=\"eventDataType\">Event data type</label>\n <select\n class=\"form-control\"\n id=\"eventDataType\"\n (input)=\"setOptionValue('type', $event.target.value)\"\n >\n <option selected value=\"\">Select</option>\n <option value=\"jivexml\">JiveXML</option>\n <option value=\"json\">JSON</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"configuration\">Configuration (URL or path)</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"configuration\"\n placeholder=\"assets/files/config/phoenix-config.json\"\n [value]=\"urlOptions.config\"\n (input)=\"setOptionValue('config', $event.target.value)\"\n />\n </div>\n <div class=\"form-group\">\n <mat-checkbox\n [checked]=\"urlOptions.hideWidgets\"\n (change)=\"setOptionValue('hideWidgets', $event.checked)\"\n >\n Hide all widgets\n </mat-checkbox>\n </div>\n\n <h5>Share</h5>\n <div class=\"share-box my-2\">\n <span>{{ shareLink }}</span>\n <button\n class=\"share-box-copy\"\n (click)=\"copyText(shareLink, $event.target)\"\n >\n COPY\n </button>\n </div>\n <h5>Embed</h5>\n <div class=\"share-box my-2\">\n <span>{{ embedLink }}</span>\n <button\n class=\"share-box-copy\"\n (click)=\"copyText(embedLink, $event.target)\"\n >\n COPY\n </button>\n </div>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n",
1445
- styles: [".share-box{width:30rem;max-width:100%;position:relative;background:var(--phoenix-background-color-tertiary);border:1px solid var(--phoenix-border);border-radius:.5rem;padding:1.25rem;word-wrap:break-word}.share-box .share-box-copy{position:absolute;top:-1px;right:-1px;background:transparent;color:inherit;cursor:pointer;padding:.25rem .5rem;font-size:.75rem;border:1px solid var(--phoenix-border);border-radius:.5rem}.share-box .share-box-copy:hover{background:var(--phoenix-border)}\n"]
1446
- },] }
1447
- ];
1448
- ShareLinkDialogComponent.ctorParameters = () => [
1449
- { type: MatDialogRef }
1450
- ];
1451
-
1452
- class ShareLinkComponent {
1453
- constructor(dialog) {
1454
- this.dialog = dialog;
1455
- }
1456
- openShareLinkDialog() {
1457
- this.dialog.open(ShareLinkDialogComponent);
1458
- }
1459
- }
1460
- ShareLinkComponent.decorators = [
1461
- { type: Component, args: [{
1462
- selector: 'app-share-link',
1463
- template: "<app-menu-toggle\n tooltip=\"Create shareable link\"\n icon=\"share\"\n [active]=\"false\"\n (click)=\"openShareLinkDialog()\"\n>\n</app-menu-toggle>\n",
1464
- styles: [""]
1465
- },] }
1466
- ];
1467
- ShareLinkComponent.ctorParameters = () => [
1468
- { type: MatDialog }
1469
- ];
1470
-
1471
- class LoaderComponent {
1472
- constructor() {
1473
- this.loaded = false;
1474
- }
1475
- }
1476
- LoaderComponent.decorators = [
1477
- { type: Component, args: [{
1478
- selector: 'app-loader',
1479
- template: "<div\n class=\"\n loader-wrapper\n d-flex\n position-absolute\n flex-column\n justify-content-center\n align-items-center\n w-100\n h-100\n text-center\n \"\n [ngClass]=\"{ 'load-complete': loaded }\"\n>\n <img src=\"assets/images/logo-small.svg\" alt=\"Loader\" />\n <p class=\"mt-5\">\n Loading...<br />\n <small class=\"text-muted\">(This may take a while)</small>\n </p>\n <div class=\"loading-bar\" *ngIf=\"progress !== undefined\">\n <span [style]=\"{ width: progress + '%' }\"></span>\n </div>\n</div>\n",
1480
- styles: [".loader-wrapper{background:var(--phoenix-background-color);z-index:9998}.loader-wrapper.load-complete{display:none!important}.loader-wrapper img{width:5rem;height:5rem;-webkit-animation:loader 2s infinite;animation:loader 2s infinite}.loader-wrapper p{color:var(--phoenix-text-color)}.loader-wrapper .loading-bar{width:15rem;max-width:90%;height:.5rem;background:var(--phoenix-background-color-tertiary);border-radius:2.5rem;overflow:hidden}.loader-wrapper .loading-bar span{display:block;height:100%;border-radius:2.5rem;background:linear-gradient(to right,var(--phoenix-primary),var(--phoenix-secondary));transition:all .5s}@-webkit-keyframes loader{0%,to{transform:scale(.1) rotate(0)}95%{transform:scale(1) rotate(15deg)}}@keyframes loader{0%,to{transform:scale(.1) rotate(0)}95%{transform:scale(1) rotate(15deg)}}\n"]
1481
- },] }
1482
- ];
1483
- LoaderComponent.propDecorators = {
1484
- loaded: [{ type: Input }],
1485
- progress: [{ type: Input }]
1486
- };
1487
-
1488
- /**
1489
- * Pipe for transforming selected object attributes to a better format.
1490
- */
1491
- class AttributePipe {
1492
- /**
1493
- * Transform the attribute to a better presentable format.
1494
- * @param value Value to be transformed.
1495
- * @param args Additional arguments.
1496
- * @returns The transformed value.
1497
- */
1498
- transform(value, args) {
1499
- let transformedValue = '';
1500
- if (Array.isArray(value)) {
1501
- transformedValue += '\n';
1502
- value.forEach((v) => (transformedValue += v + '\n'));
1503
- }
1504
- else {
1505
- transformedValue = value.toString();
1506
- }
1507
- return transformedValue;
1508
- }
1509
- }
1510
- AttributePipe.decorators = [
1511
- { type: Pipe, args: [{
1512
- name: 'attributePipe',
1513
- },] }
1514
- ];
1515
-
1516
- class EmbedMenuComponent {
1517
- }
1518
- EmbedMenuComponent.decorators = [
1519
- { type: Component, args: [{
1520
- selector: 'app-embed-menu',
1521
- template: "<div id=\"embedMenu\">\n <div id=\"embedMenuInner\">\n <app-dark-theme></app-dark-theme>\n <app-auto-rotate></app-auto-rotate>\n <app-main-view-toggle></app-main-view-toggle>\n <app-animate-event></app-animate-event>\n <app-animate-camera></app-animate-camera>\n <app-experiment-link></app-experiment-link>\n </div>\n</div>\n",
1522
- styles: ["#embedMenu{display:none}#embedMenu #embedMenuInner{display:flex;position:absolute;left:1rem;bottom:1rem;background:var(--phoenix-background-color-secondary);border:1px solid var(--phoenix-background-color-tertiary);box-shadow:var(--phoenix-box-shadow);border-radius:30px;padding:.25rem 0}\n"]
1523
- },] }
1524
- ];
1525
-
1526
- class ExperimentLinkComponent {
1527
- ngOnInit() {
1528
- this.experimentLink = window.location.href.split('?')[0];
1529
- }
1530
- goToExperiment() {
1531
- window.open(this.experimentLink, '_blank');
1532
- }
1533
- }
1534
- ExperimentLinkComponent.decorators = [
1535
- { type: Component, args: [{
1536
- selector: 'app-experiment-link',
1537
- template: "<app-menu-toggle\n tooltip=\"See full event display\"\n icon=\"link\"\n (click)=\"goToExperiment()\"\n></app-menu-toggle>\n",
1538
- styles: [""]
1539
- },] }
1540
- ];
1541
-
1542
- const PHOENIX_COMPONENTS = [
1543
- NavComponent,
1544
- UiMenuComponent,
1545
- CollectionsInfoComponent,
1546
- MenuToggleComponent,
1547
- CollectionsInfoOverlayComponent,
1548
- IoOptionsComponent,
1549
- IOOptionsDialogComponent,
1550
- OverlayViewComponent,
1551
- AttributePipe,
1552
- ObjectSelectionComponent,
1553
- ObjectSelectionOverlayComponent,
1554
- EventSelectorComponent,
1555
- ObjectClippingComponent,
1556
- DarkThemeComponent,
1557
- AutoRotateComponent,
1558
- ViewOptionsComponent,
1559
- OverlayViewWindowComponent,
1560
- OverlayComponent,
1561
- ExperimentInfoComponent,
1562
- InfoPanelComponent,
1563
- InfoPanelOverlayComponent,
1564
- MainViewToggleComponent,
1565
- ZoomControlsComponent,
1566
- TreeMenuComponent,
1567
- TreeMenuItemComponent,
1568
- PhoenixMenuComponent,
1569
- PhoenixMenuItemComponent,
1570
- ConfigSliderComponent,
1571
- AnimateCameraComponent,
1572
- AnimateEventComponent,
1573
- VrToggleComponent,
1574
- ArToggleComponent,
1575
- SSModeComponent,
1576
- PerformanceToggleComponent,
1577
- LoaderComponent,
1578
- ShareLinkComponent,
1579
- ShareLinkDialogComponent,
1580
- EmbedMenuComponent,
1581
- ExperimentLinkComponent,
1582
- ];
1583
- class PhoenixUIModule {
1584
- }
1585
- PhoenixUIModule.decorators = [
1586
- { type: NgModule, args: [{
1587
- declarations: [...PHOENIX_COMPONENTS],
1588
- imports: [
1589
- CommonModule,
1590
- RouterModule,
1591
- DragDropModule,
1592
- MatDialogModule,
1593
- MatButtonModule,
1594
- MatTooltipModule,
1595
- OverlayModule,
1596
- MatMenuModule,
1597
- MatSliderModule,
1598
- MatSlideToggleModule,
1599
- MatCheckboxModule,
1600
- MatIconModule,
1601
- NgxSliderModule,
1602
- ],
1603
- entryComponents: [
1604
- OverlayComponent,
1605
- OverlayViewWindowComponent,
1606
- IOOptionsDialogComponent,
1607
- CollectionsInfoOverlayComponent,
1608
- ObjectSelectionOverlayComponent,
1609
- InfoPanelOverlayComponent,
1610
- ],
1611
- exports: [PHOENIX_COMPONENTS],
1612
- },] }
1613
- ];
1614
-
1615
- /**
1616
- * Generated bundle index. Do not edit.
1617
- */
1618
-
1619
- export { AnimateCameraComponent, AnimateEventComponent, ArToggleComponent, AutoRotateComponent, CollectionsInfoComponent, CollectionsInfoOverlayComponent, ConfigSliderComponent, DarkThemeComponent, EventDataFormat, EventDisplayService, EventSelectorComponent, ExperimentInfoComponent, IOOptionsDialogComponent, ImportOption, InfoPanelComponent, InfoPanelOverlayComponent, IoOptionsComponent, LoaderComponent, MainViewToggleComponent, MenuToggleComponent, NavComponent, ObjectClippingComponent, ObjectSelectionComponent, ObjectSelectionOverlayComponent, OverlayComponent, OverlayViewComponent, OverlayViewWindowComponent, PerformanceToggleComponent, PhoenixMenuComponent, PhoenixMenuItemComponent, PhoenixUIModule, SSModeComponent, ShareLinkComponent, ShareLinkDialogComponent, TreeMenuComponent, TreeMenuItemComponent, UiMenuComponent, ViewOptionsComponent, VrToggleComponent, ZoomControlsComponent, defaultAnimationPresets, UiMenuComponent as ɵa, CollectionsInfoComponent as ɵb, ConfigSliderComponent as ɵba, AnimateCameraComponent as ɵbb, AnimateEventComponent as ɵbc, VrToggleComponent as ɵbd, ArToggleComponent as ɵbe, SSModeComponent as ɵbf, PerformanceToggleComponent as ɵbg, ShareLinkComponent as ɵbh, ShareLinkDialogComponent as ɵbi, EmbedMenuComponent as ɵbj, ExperimentLinkComponent as ɵbk, MenuToggleComponent as ɵc, CollectionsInfoOverlayComponent as ɵd, IoOptionsComponent as ɵe, IOOptionsDialogComponent as ɵf, OverlayViewComponent as ɵg, AttributePipe as ɵh, ObjectSelectionComponent as ɵi, ObjectSelectionOverlayComponent as ɵj, EventSelectorComponent as ɵk, ObjectClippingComponent as ɵl, DarkThemeComponent as ɵm, AutoRotateComponent as ɵn, ViewOptionsComponent as ɵo, OverlayViewWindowComponent as ɵp, OverlayComponent as ɵq, ExperimentInfoComponent as ɵr, InfoPanelComponent as ɵs, InfoPanelOverlayComponent as ɵt, MainViewToggleComponent as ɵu, ZoomControlsComponent as ɵv, TreeMenuComponent as ɵw, TreeMenuItemComponent as ɵx, PhoenixMenuComponent as ɵy, PhoenixMenuItemComponent as ɵz };
1620
- //# sourceMappingURL=phoenix-ui-components.js.map