@festo-ui/angular 3.1.0-pre-20220203.2 → 3.1.0-pre-20220217.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/festo-ui-angular.mjs +5 -0
- package/esm2020/index.mjs +18 -0
- package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +23 -0
- package/esm2020/lib/components/buttons/button/button.component.mjs +41 -0
- package/esm2020/lib/components/buttons/link-button/link-button.component.mjs +33 -0
- package/esm2020/lib/components/chips/chip/chip.component.mjs +37 -0
- package/esm2020/lib/components/chips/chip-container/chip-container.component.mjs +16 -0
- package/esm2020/lib/components/click-outside.directive.mjs +28 -0
- package/esm2020/lib/components/components.module.mjs +155 -0
- package/esm2020/lib/components/loading-indicator/loading-indicator.component.mjs +16 -0
- package/esm2020/lib/components/modals/alert/alert.component.mjs +52 -0
- package/esm2020/lib/components/modals/confirm/confirm.component.mjs +67 -0
- package/esm2020/lib/components/modals/index.mjs +2 -0
- package/esm2020/lib/components/modals/modal.service.mjs +112 -0
- package/esm2020/lib/components/modals/modals.module.mjs +28 -0
- package/esm2020/lib/components/modals/prompt/prompt.component.mjs +102 -0
- package/esm2020/lib/components/pagination/pagination.component.mjs +55 -0
- package/esm2020/lib/components/popovers/legend/legend.component.mjs +42 -0
- package/esm2020/lib/components/popovers/legend/legend.directive.mjs +31 -0
- package/esm2020/lib/components/popovers/popover/popover.component.mjs +31 -0
- package/esm2020/lib/components/popovers/popover-content/popover-content.component.mjs +82 -0
- package/esm2020/lib/components/popovers/popover-content/popover-content.directive.mjs +39 -0
- package/esm2020/lib/components/popovers/popover-menu/popover-menu.component.mjs +68 -0
- package/esm2020/lib/components/popovers/popover-ref.mjs +25 -0
- package/esm2020/lib/components/popovers/popover.defaults.mjs +60 -0
- package/esm2020/lib/components/popovers/popover.models.mjs +23 -0
- package/esm2020/lib/components/popovers/popover.service.mjs +123 -0
- package/esm2020/lib/components/popovers/tooltip/tooltip.directive.mjs +94 -0
- package/esm2020/lib/components/progress/progress.component.mjs +20 -0
- package/esm2020/lib/components/scroll/index.mjs +2 -0
- package/esm2020/lib/components/scroll/scrollable.directive.mjs +72 -0
- package/esm2020/lib/components/search-input/search-input.component.mjs +150 -0
- package/esm2020/lib/components/snackbar/snackbar-container.component.mjs +21 -0
- package/esm2020/lib/components/snackbar/snackbar-container.directive.mjs +83 -0
- package/esm2020/lib/components/snackbar/snackbar.component.mjs +79 -0
- package/esm2020/lib/components/snackbar/snackbar.models.mjs +2 -0
- package/esm2020/lib/components/snackbar/snackbar.module.mjs +26 -0
- package/esm2020/lib/components/snackbar/snackbar.service.mjs +23 -0
- package/esm2020/lib/components/stepper/stepper.component.mjs +22 -0
- package/esm2020/lib/components/table-header-cell/table-header-cell.directive.mjs +58 -0
- package/esm2020/lib/components/tabs/tab-pane/tab-pane.component.mjs +31 -0
- package/esm2020/lib/components/tabs/tabs.component.mjs +355 -0
- package/esm2020/lib/content/content.module.mjs +20 -0
- package/esm2020/lib/content/icon/icon.component.mjs +17 -0
- package/esm2020/lib/festo-angular.module.mjs +58 -0
- package/esm2020/lib/forms/checkbox/checkbox.component.mjs +149 -0
- package/esm2020/lib/forms/color-indicator/color-indicator.component.mjs +68 -0
- package/esm2020/lib/forms/color-picker/color-helper.mjs +121 -0
- package/esm2020/lib/forms/color-picker/color-picker.component.mjs +273 -0
- package/esm2020/lib/forms/container-host.mjs +27 -0
- package/esm2020/lib/forms/date-picker/date-picker.component.mjs +199 -0
- package/esm2020/lib/forms/date-range-picker/date-range-picker.component.mjs +224 -0
- package/esm2020/lib/forms/forms.module.mjs +146 -0
- package/esm2020/lib/forms/radio/radio.component.mjs +346 -0
- package/esm2020/lib/forms/segment/segment-control/segment-control.component.mjs +52 -0
- package/esm2020/lib/forms/segment/segment.component.mjs +109 -0
- package/esm2020/lib/forms/select/chip-text.pipe.mjs +34 -0
- package/esm2020/lib/forms/select/select-option/select-option.component.mjs +22 -0
- package/esm2020/lib/forms/select/select.component.mjs +257 -0
- package/esm2020/lib/forms/slider/slider.component.mjs +110 -0
- package/esm2020/lib/forms/switch/switch.component.mjs +120 -0
- package/esm2020/lib/forms/text-area/text-area.component.mjs +180 -0
- package/esm2020/lib/forms/text-editor/text-editor.component.mjs +286 -0
- package/esm2020/lib/forms/text-input/text-input.component.mjs +183 -0
- package/esm2020/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.mjs +89 -0
- package/esm2020/lib/forms/time-picker/time-picker.component.mjs +188 -0
- package/esm2020/lib/forms/unique-selection-dispatcher.mjs +39 -0
- package/esm2020/lib/forms/value-accessor-base.mjs +41 -0
- package/esm2020/lib/layout/layout.module.mjs +18 -0
- package/esm2020/lib/wrappers/flatpickr/flatpickr.component.mjs +59 -0
- package/fesm2015/{festo-ui-angular.js → festo-ui-angular.mjs} +317 -521
- package/fesm2015/festo-ui-angular.mjs.map +1 -0
- package/fesm2020/festo-ui-angular.mjs +5383 -0
- package/fesm2020/festo-ui-angular.mjs.map +1 -0
- package/package.json +31 -16
- package/scss/base/components/breadcrumb/breadcrumb.component.scss +0 -1
- package/scss/base/components/modals/prompt/prompt.component.scss +0 -1
- package/scss/base/components/popovers/legend/legend.component.scss +2 -2
- package/scss/base/components/popovers/popover/styles.scss +3 -3
- package/scss/base/components/popovers/popover-content/popover-content.component.scss +1 -1
- package/scss/base/components/scroll/scroll-story-helper.scss +1 -3
- package/scss/base/components/snackbar/snackbar.component.scss +1 -1
- package/scss/base/components/stepper/stepper.component.scss +16 -15
- package/scss/base/forms/color-picker/color-picker.component.scss +12 -12
- package/scss/base/forms/date-picker/date-picker.component.scss +1 -1
- package/scss/base/forms/date-range-picker/date-range-picker.component.scss +1 -1
- package/scss/base/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.scss +1 -1
- package/scss/styles.scss +2 -2
- package/bundles/festo-ui-angular.umd.js +0 -6429
- package/bundles/festo-ui-angular.umd.js.map +0 -1
- package/esm2015/festo-ui-angular.js +0 -5
- package/esm2015/festo-ui-angular.js.map +0 -1
- package/esm2015/index.js +0 -18
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/components/breadcrumb/breadcrumb.component.js +0 -27
- package/esm2015/lib/components/breadcrumb/breadcrumb.component.js.map +0 -1
- package/esm2015/lib/components/buttons/button/button.component.js +0 -46
- package/esm2015/lib/components/buttons/button/button.component.js.map +0 -1
- package/esm2015/lib/components/buttons/link-button/link-button.component.js +0 -38
- package/esm2015/lib/components/buttons/link-button/link-button.component.js.map +0 -1
- package/esm2015/lib/components/chips/chip/chip.component.js +0 -42
- package/esm2015/lib/components/chips/chip/chip.component.js.map +0 -1
- package/esm2015/lib/components/chips/chip-container/chip-container.component.js +0 -21
- package/esm2015/lib/components/chips/chip-container/chip-container.component.js.map +0 -1
- package/esm2015/lib/components/click-outside.directive.js +0 -28
- package/esm2015/lib/components/click-outside.directive.js.map +0 -1
- package/esm2015/lib/components/components.module.js +0 -155
- package/esm2015/lib/components/components.module.js.map +0 -1
- package/esm2015/lib/components/loading-indicator/loading-indicator.component.js +0 -21
- package/esm2015/lib/components/loading-indicator/loading-indicator.component.js.map +0 -1
- package/esm2015/lib/components/modals/alert/alert.component.js +0 -57
- package/esm2015/lib/components/modals/alert/alert.component.js.map +0 -1
- package/esm2015/lib/components/modals/confirm/confirm.component.js +0 -73
- package/esm2015/lib/components/modals/confirm/confirm.component.js.map +0 -1
- package/esm2015/lib/components/modals/index.js +0 -2
- package/esm2015/lib/components/modals/index.js.map +0 -1
- package/esm2015/lib/components/modals/modal.service.js +0 -91
- package/esm2015/lib/components/modals/modal.service.js.map +0 -1
- package/esm2015/lib/components/modals/modals.module.js +0 -28
- package/esm2015/lib/components/modals/modals.module.js.map +0 -1
- package/esm2015/lib/components/modals/prompt/prompt.component.js +0 -110
- package/esm2015/lib/components/modals/prompt/prompt.component.js.map +0 -1
- package/esm2015/lib/components/pagination/pagination.component.js +0 -60
- package/esm2015/lib/components/pagination/pagination.component.js.map +0 -1
- package/esm2015/lib/components/popovers/legend/legend.component.js +0 -46
- package/esm2015/lib/components/popovers/legend/legend.component.js.map +0 -1
- package/esm2015/lib/components/popovers/legend/legend.directive.js +0 -31
- package/esm2015/lib/components/popovers/legend/legend.directive.js.map +0 -1
- package/esm2015/lib/components/popovers/popover/popover.component.js +0 -35
- package/esm2015/lib/components/popovers/popover/popover.component.js.map +0 -1
- package/esm2015/lib/components/popovers/popover-content/popover-content.component.js +0 -86
- package/esm2015/lib/components/popovers/popover-content/popover-content.component.js.map +0 -1
- package/esm2015/lib/components/popovers/popover-content/popover-content.directive.js +0 -39
- package/esm2015/lib/components/popovers/popover-content/popover-content.directive.js.map +0 -1
- package/esm2015/lib/components/popovers/popover-menu/popover-menu.component.js +0 -72
- package/esm2015/lib/components/popovers/popover-menu/popover-menu.component.js.map +0 -1
- package/esm2015/lib/components/popovers/popover-ref.js +0 -25
- package/esm2015/lib/components/popovers/popover-ref.js.map +0 -1
- package/esm2015/lib/components/popovers/popover.defaults.js +0 -60
- package/esm2015/lib/components/popovers/popover.defaults.js.map +0 -1
- package/esm2015/lib/components/popovers/popover.models.js +0 -23
- package/esm2015/lib/components/popovers/popover.models.js.map +0 -1
- package/esm2015/lib/components/popovers/popover.service.js +0 -117
- package/esm2015/lib/components/popovers/popover.service.js.map +0 -1
- package/esm2015/lib/components/popovers/tooltip/tooltip.directive.js +0 -96
- package/esm2015/lib/components/popovers/tooltip/tooltip.directive.js.map +0 -1
- package/esm2015/lib/components/progress/progress.component.js +0 -23
- package/esm2015/lib/components/progress/progress.component.js.map +0 -1
- package/esm2015/lib/components/scroll/index.js +0 -2
- package/esm2015/lib/components/scroll/index.js.map +0 -1
- package/esm2015/lib/components/scroll/scrollable.directive.js +0 -73
- package/esm2015/lib/components/scroll/scrollable.directive.js.map +0 -1
- package/esm2015/lib/components/search-input/search-input.component.js +0 -155
- package/esm2015/lib/components/search-input/search-input.component.js.map +0 -1
- package/esm2015/lib/components/snackbar/snackbar-container.component.js +0 -26
- package/esm2015/lib/components/snackbar/snackbar-container.component.js.map +0 -1
- package/esm2015/lib/components/snackbar/snackbar-container.directive.js +0 -83
- package/esm2015/lib/components/snackbar/snackbar-container.directive.js.map +0 -1
- package/esm2015/lib/components/snackbar/snackbar.component.js +0 -85
- package/esm2015/lib/components/snackbar/snackbar.component.js.map +0 -1
- package/esm2015/lib/components/snackbar/snackbar.models.js +0 -2
- package/esm2015/lib/components/snackbar/snackbar.models.js.map +0 -1
- package/esm2015/lib/components/snackbar/snackbar.module.js +0 -26
- package/esm2015/lib/components/snackbar/snackbar.module.js.map +0 -1
- package/esm2015/lib/components/snackbar/snackbar.service.js +0 -23
- package/esm2015/lib/components/snackbar/snackbar.service.js.map +0 -1
- package/esm2015/lib/components/stepper/stepper.component.js +0 -28
- package/esm2015/lib/components/stepper/stepper.component.js.map +0 -1
- package/esm2015/lib/components/table-header-cell/table-header-cell.directive.js +0 -58
- package/esm2015/lib/components/table-header-cell/table-header-cell.directive.js.map +0 -1
- package/esm2015/lib/components/tabs/tab-pane/tab-pane.component.js +0 -35
- package/esm2015/lib/components/tabs/tab-pane/tab-pane.component.js.map +0 -1
- package/esm2015/lib/components/tabs/tabs.component.js +0 -362
- package/esm2015/lib/components/tabs/tabs.component.js.map +0 -1
- package/esm2015/lib/content/content.module.js +0 -24
- package/esm2015/lib/content/content.module.js.map +0 -1
- package/esm2015/lib/content/icon/icon.component.js +0 -23
- package/esm2015/lib/content/icon/icon.component.js.map +0 -1
- package/esm2015/lib/festo-angular.module.js +0 -58
- package/esm2015/lib/festo-angular.module.js.map +0 -1
- package/esm2015/lib/forms/checkbox/checkbox.component.js +0 -156
- package/esm2015/lib/forms/checkbox/checkbox.component.js.map +0 -1
- package/esm2015/lib/forms/color-indicator/color-indicator.component.js +0 -72
- package/esm2015/lib/forms/color-indicator/color-indicator.component.js.map +0 -1
- package/esm2015/lib/forms/color-picker/color-helper.js +0 -121
- package/esm2015/lib/forms/color-picker/color-helper.js.map +0 -1
- package/esm2015/lib/forms/color-picker/color-picker.component.js +0 -280
- package/esm2015/lib/forms/color-picker/color-picker.component.js.map +0 -1
- package/esm2015/lib/forms/container-host.js +0 -27
- package/esm2015/lib/forms/container-host.js.map +0 -1
- package/esm2015/lib/forms/date-picker/date-picker.component.js +0 -205
- package/esm2015/lib/forms/date-picker/date-picker.component.js.map +0 -1
- package/esm2015/lib/forms/date-range-picker/date-range-picker.component.js +0 -230
- package/esm2015/lib/forms/date-range-picker/date-range-picker.component.js.map +0 -1
- package/esm2015/lib/forms/forms.module.js +0 -146
- package/esm2015/lib/forms/forms.module.js.map +0 -1
- package/esm2015/lib/forms/radio/radio.component.js +0 -353
- package/esm2015/lib/forms/radio/radio.component.js.map +0 -1
- package/esm2015/lib/forms/segment/segment-control/segment-control.component.js +0 -58
- package/esm2015/lib/forms/segment/segment-control/segment-control.component.js.map +0 -1
- package/esm2015/lib/forms/segment/segment.component.js +0 -116
- package/esm2015/lib/forms/segment/segment.component.js.map +0 -1
- package/esm2015/lib/forms/select/chip-text.pipe.js +0 -34
- package/esm2015/lib/forms/select/chip-text.pipe.js.map +0 -1
- package/esm2015/lib/forms/select/select-option/select-option.component.js +0 -29
- package/esm2015/lib/forms/select/select-option/select-option.component.js.map +0 -1
- package/esm2015/lib/forms/select/select.component.js +0 -265
- package/esm2015/lib/forms/select/select.component.js.map +0 -1
- package/esm2015/lib/forms/slider/slider.component.js +0 -116
- package/esm2015/lib/forms/slider/slider.component.js.map +0 -1
- package/esm2015/lib/forms/switch/switch.component.js +0 -127
- package/esm2015/lib/forms/switch/switch.component.js.map +0 -1
- package/esm2015/lib/forms/text-area/text-area.component.js +0 -186
- package/esm2015/lib/forms/text-area/text-area.component.js.map +0 -1
- package/esm2015/lib/forms/text-editor/text-editor.component.js +0 -294
- package/esm2015/lib/forms/text-editor/text-editor.component.js.map +0 -1
- package/esm2015/lib/forms/text-input/text-input.component.js +0 -189
- package/esm2015/lib/forms/text-input/text-input.component.js.map +0 -1
- package/esm2015/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.js +0 -103
- package/esm2015/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.js.map +0 -1
- package/esm2015/lib/forms/time-picker/time-picker.component.js +0 -194
- package/esm2015/lib/forms/time-picker/time-picker.component.js.map +0 -1
- package/esm2015/lib/forms/unique-selection-dispatcher.js +0 -39
- package/esm2015/lib/forms/unique-selection-dispatcher.js.map +0 -1
- package/esm2015/lib/forms/value-accessor-base.js +0 -41
- package/esm2015/lib/forms/value-accessor-base.js.map +0 -1
- package/esm2015/lib/layout/layout.module.js +0 -18
- package/esm2015/lib/layout/layout.module.js.map +0 -1
- package/esm2015/lib/wrappers/flatpickr/flatpickr.component.js +0 -63
- package/esm2015/lib/wrappers/flatpickr/flatpickr.component.js.map +0 -1
- package/fesm2015/festo-ui-angular.js.map +0 -1
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Inject, Input, Output, QueryList, Renderer2, ViewChild } from '@angular/core';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { TabPaneComponent } from './tab-pane/tab-pane.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
export class TabsComponent {
|
|
9
|
+
constructor(elRef, document, renderer, cd) {
|
|
10
|
+
this.elRef = elRef;
|
|
11
|
+
this.document = document;
|
|
12
|
+
this.renderer = renderer;
|
|
13
|
+
this.cd = cd;
|
|
14
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
15
|
+
this.viewType = 'responsive';
|
|
16
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
17
|
+
this.showDivider = false;
|
|
18
|
+
this.config = null;
|
|
19
|
+
this.fngTabChange = new EventEmitter();
|
|
20
|
+
this.componentId = `tabs-${++TabsComponent.nextId}`;
|
|
21
|
+
this.tabs = [];
|
|
22
|
+
this.useCompactDensity = true;
|
|
23
|
+
this.activeTab = null;
|
|
24
|
+
this.complete = new Subject();
|
|
25
|
+
this.injectedWindow = this.document.defaultView;
|
|
26
|
+
}
|
|
27
|
+
ngAfterContentInit() {
|
|
28
|
+
this.initTabs();
|
|
29
|
+
if (null === this.activeTab) {
|
|
30
|
+
this.panes.map((pane, i) => {
|
|
31
|
+
if (0 === i) {
|
|
32
|
+
pane.isVisible = true;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.panes.find(pane => null != this.activeTab.paneId && pane.tabPaneId === this.activeTab.paneId).isVisible = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
ngAfterViewInit() {
|
|
41
|
+
this.elemScroller = this.scroller?.nativeElement;
|
|
42
|
+
this.elemScrollArea = this.scrollAera?.nativeElement;
|
|
43
|
+
this.elemScrollContent = this.scrollContent?.nativeElement;
|
|
44
|
+
const initialWidth = this.elemScrollArea?.offsetWidth;
|
|
45
|
+
if (initialWidth > 768) {
|
|
46
|
+
this.useCompactDensity = false;
|
|
47
|
+
this.cd.detectChanges();
|
|
48
|
+
}
|
|
49
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
50
|
+
const width = this.elemScrollArea.offsetWidth;
|
|
51
|
+
if (width > 768 && this.useCompactDensity === true) {
|
|
52
|
+
this.useCompactDensity = false;
|
|
53
|
+
this.cd.detectChanges();
|
|
54
|
+
}
|
|
55
|
+
else if (width <= 768 && this.useCompactDensity === false) {
|
|
56
|
+
this.useCompactDensity = true;
|
|
57
|
+
this.cd.detectChanges();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (this.elemScrollArea != null) {
|
|
61
|
+
this.resizeObserver.observe(this.elemScrollArea);
|
|
62
|
+
}
|
|
63
|
+
this.handleTabPaneChanges();
|
|
64
|
+
}
|
|
65
|
+
ngOnDestroy() {
|
|
66
|
+
this.complete.next(true);
|
|
67
|
+
this.complete.unsubscribe();
|
|
68
|
+
}
|
|
69
|
+
showTabPane(id) {
|
|
70
|
+
const pane = this.panes.find(p => p.tabPaneId === id);
|
|
71
|
+
if (null != pane) {
|
|
72
|
+
this.panes.map(p => {
|
|
73
|
+
p.isVisible = false;
|
|
74
|
+
});
|
|
75
|
+
pane.isVisible = true;
|
|
76
|
+
this.tabs.map(tab => {
|
|
77
|
+
if (tab.paneId !== pane.tabPaneId) {
|
|
78
|
+
tab.active = false;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
tab.active = true;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
this.fngTabChange.emit({
|
|
85
|
+
previous: this.activeTab?.paneId,
|
|
86
|
+
current: id
|
|
87
|
+
});
|
|
88
|
+
this.activeTab = this.tabs.find(tab => !!tab.active);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
handleTabScroll(event, index) {
|
|
92
|
+
const scrollContentWidth = this.elemScrollContent.offsetWidth;
|
|
93
|
+
const scrollAreaWidth = this.elemScrollArea.offsetWidth;
|
|
94
|
+
// check if no scroll is needed
|
|
95
|
+
if (scrollAreaWidth > scrollContentWidth) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// check index
|
|
99
|
+
if (!this.indexIsInRange(index)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// always scroll to 0 if scrolling to the first tab
|
|
103
|
+
if (index === 0) {
|
|
104
|
+
this.scrollTo(0);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// always scroll to the max value if scrolling to the last tab
|
|
108
|
+
if (index === this.tabs.length - 1) {
|
|
109
|
+
this.scrollTo(this.elemScrollContent.offsetWidth);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const currentTab = event.target;
|
|
113
|
+
this.scrollIntoView(index, currentTab);
|
|
114
|
+
}
|
|
115
|
+
initTabs() {
|
|
116
|
+
this.tabs = [];
|
|
117
|
+
this.panes.map((pane, i) => {
|
|
118
|
+
pane.tabId = this.componentId + '-tab-' + i;
|
|
119
|
+
const tab = {
|
|
120
|
+
name: null != pane.name ? pane.name : '',
|
|
121
|
+
paneId: null != pane.tabPaneId ? pane.tabPaneId : null,
|
|
122
|
+
icon: null != pane.icon ? pane.icon : null,
|
|
123
|
+
active: null != pane.active ? pane.active : false
|
|
124
|
+
};
|
|
125
|
+
this.tabs.push(tab);
|
|
126
|
+
});
|
|
127
|
+
this.initActiveTab();
|
|
128
|
+
this.cd.detectChanges();
|
|
129
|
+
}
|
|
130
|
+
initActiveTab() {
|
|
131
|
+
const activeTab = this.tabs.find((tab) => !!tab.active);
|
|
132
|
+
if (!activeTab && 0 < this.tabs.length) {
|
|
133
|
+
this.tabs[0] = { ...this.tabs[0], active: true };
|
|
134
|
+
this.activeTab = this.tabs[0];
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.activeTab = activeTab;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
handleTabPaneChanges() {
|
|
141
|
+
// first subscribe to any changes in tab pane, so that the tabs in this view wiil be updated
|
|
142
|
+
this.panes.forEach(pane => {
|
|
143
|
+
pane.changes$.pipe(takeUntil(this.complete)).subscribe(() => {
|
|
144
|
+
// on changes in a tab pane, we init the tabs again
|
|
145
|
+
this.initTabs();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
scrollTo(scrollX) {
|
|
150
|
+
const currentScrollX = this.getScrollPosition();
|
|
151
|
+
const safeScrollX = this.clampScrollValue(scrollX);
|
|
152
|
+
const scrollDelta = safeScrollX - currentScrollX;
|
|
153
|
+
this.animate({
|
|
154
|
+
finalScrollPosition: safeScrollX,
|
|
155
|
+
scrollDelta
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
scrollIntoView(index, tab) {
|
|
159
|
+
const scrollPosition = this.getScrollPosition();
|
|
160
|
+
const barWidth = this.elemScrollArea.offsetWidth;
|
|
161
|
+
const tabDimensions = this.computeDimensions(tab);
|
|
162
|
+
const nextIndex = this.findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth);
|
|
163
|
+
if (!this.indexIsInRange(nextIndex)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const scrollIncrement = this.calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth);
|
|
167
|
+
this.incrementScroll(scrollIncrement);
|
|
168
|
+
}
|
|
169
|
+
incrementScroll(scrollXIncrement) {
|
|
170
|
+
// no scroll needed
|
|
171
|
+
if (scrollXIncrement === 0) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const scrollOperation = this.getIncrementScrollOperation(scrollXIncrement);
|
|
175
|
+
this.animate(scrollOperation);
|
|
176
|
+
}
|
|
177
|
+
animate(animation) {
|
|
178
|
+
// no animation needed
|
|
179
|
+
if (animation.scrollDelta === 0) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this.stopScrollAnimation();
|
|
183
|
+
// this animation uses the flip approach
|
|
184
|
+
// https://aerotwist.com/blog/flip-your-animations/
|
|
185
|
+
// https://css-tricks.com/animating-layouts-with-the-flip-technique/
|
|
186
|
+
this.elemScrollArea.scrollLeft = animation.finalScrollPosition;
|
|
187
|
+
this.setScrollContentStyleProperty('transform', `translateX(${animation.scrollDelta}px)`);
|
|
188
|
+
// force repaint
|
|
189
|
+
this.elemScrollArea.getBoundingClientRect();
|
|
190
|
+
requestAnimationFrame(() => {
|
|
191
|
+
this.renderer.addClass(this.elemScroller, 'fng-tab-scroller--animating');
|
|
192
|
+
this.setScrollContentStyleProperty('transform', 'none');
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
stopScrollAnimation() {
|
|
196
|
+
const currentScrollPosition = this.getAnimatingScrollPosition();
|
|
197
|
+
this.renderer.removeClass(this.elemScroller, 'fng-tab-scroller--animating');
|
|
198
|
+
this.setScrollContentStyleProperty('transform', 'translateX(0px)');
|
|
199
|
+
this.elemScrollArea.scrollLeft = currentScrollPosition;
|
|
200
|
+
}
|
|
201
|
+
getAnimatingScrollPosition() {
|
|
202
|
+
const currentTranslateX = this.calculateCurrentTranslateX();
|
|
203
|
+
const scrollLeft = this.elemScrollArea.scrollLeft;
|
|
204
|
+
return scrollLeft - currentTranslateX;
|
|
205
|
+
}
|
|
206
|
+
getIncrementScrollOperation(scrollX) {
|
|
207
|
+
const currentScrollX = this.getScrollPosition();
|
|
208
|
+
const targetScrollX = scrollX + currentScrollX;
|
|
209
|
+
const safeScrollX = this.clampScrollValue(targetScrollX);
|
|
210
|
+
const scrollDelta = safeScrollX - currentScrollX;
|
|
211
|
+
return {
|
|
212
|
+
finalScrollPosition: safeScrollX,
|
|
213
|
+
scrollDelta
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
clampScrollValue(scrollX) {
|
|
217
|
+
const edges = this.calculateScrollEdges();
|
|
218
|
+
return Math.min(Math.max(edges.left, scrollX), edges.right);
|
|
219
|
+
}
|
|
220
|
+
calculateScrollEdges() {
|
|
221
|
+
const scrollContentWidth = this.elemScrollContent.offsetWidth;
|
|
222
|
+
const scrollAreaWidth = this.elemScrollArea.offsetWidth;
|
|
223
|
+
return {
|
|
224
|
+
left: 0,
|
|
225
|
+
right: scrollContentWidth - scrollAreaWidth
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
computeDimensions(tab) {
|
|
229
|
+
const rootWidth = tab.offsetWidth;
|
|
230
|
+
const rootLeft = tab.offsetLeft;
|
|
231
|
+
const tabContent = tab.querySelector('.fng-tab-content');
|
|
232
|
+
const contentWidth = tabContent.offsetWidth;
|
|
233
|
+
const contentLeft = tabContent.offsetLeft;
|
|
234
|
+
return {
|
|
235
|
+
contentLeft: rootLeft + contentLeft,
|
|
236
|
+
contentRight: rootLeft + contentLeft + contentWidth,
|
|
237
|
+
rootLeft,
|
|
238
|
+
rootRight: rootLeft + rootWidth
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth) {
|
|
242
|
+
const nextTab = this.elRef.nativeElement.querySelector(`#${this.componentId}-tab-${nextIndex}`);
|
|
243
|
+
const nextTabDimensions = this.computeDimensions(nextTab);
|
|
244
|
+
const relativeContentLeft = nextTabDimensions.contentLeft - scrollPosition - barWidth;
|
|
245
|
+
const relativeContentRight = nextTabDimensions.contentRight - scrollPosition;
|
|
246
|
+
const leftIncrement = relativeContentRight - 48;
|
|
247
|
+
const rightIncrement = relativeContentLeft + 48;
|
|
248
|
+
if (nextIndex < index) {
|
|
249
|
+
return Math.min(leftIncrement, 0);
|
|
250
|
+
}
|
|
251
|
+
return Math.max(rightIncrement, 0);
|
|
252
|
+
}
|
|
253
|
+
indexIsInRange(index) {
|
|
254
|
+
return index >= 0 && index < this.tabs.length;
|
|
255
|
+
}
|
|
256
|
+
getScrollPosition() {
|
|
257
|
+
const currentTranslateX = this.calculateCurrentTranslateX();
|
|
258
|
+
const scrollLeft = this.elemScrollArea.scrollLeft;
|
|
259
|
+
return scrollLeft - currentTranslateX;
|
|
260
|
+
}
|
|
261
|
+
calculateCurrentTranslateX() {
|
|
262
|
+
const transformValue = this.getScrollContentStyleValue('transform');
|
|
263
|
+
if (transformValue === 'none') {
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
// the transform value is in form of 'matrix(a, b, c, d, tx, ty)'
|
|
267
|
+
// get all the parenthesized values
|
|
268
|
+
const match = /\((.+?)\)/.exec(transformValue);
|
|
269
|
+
if (!match) {
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
const matrixParams = match[1];
|
|
273
|
+
// we need value of tx -> translateX
|
|
274
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
275
|
+
const [a, b, c, d, tx, ty] = matrixParams.split(',');
|
|
276
|
+
return parseFloat(tx);
|
|
277
|
+
}
|
|
278
|
+
getScrollContentStyleValue(propName) {
|
|
279
|
+
return this.injectedWindow.getComputedStyle(this.elemScrollContent).getPropertyValue(propName);
|
|
280
|
+
}
|
|
281
|
+
setScrollContentStyleProperty(propName, value) {
|
|
282
|
+
this.renderer.setStyle(this.elemScrollContent, propName, value);
|
|
283
|
+
}
|
|
284
|
+
findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth) {
|
|
285
|
+
/**
|
|
286
|
+
* tabs are laid out in the tab scroller like this:
|
|
287
|
+
*
|
|
288
|
+
* scroll position
|
|
289
|
+
* +---+
|
|
290
|
+
* | | bar width
|
|
291
|
+
* | +-----------------------------------+
|
|
292
|
+
* | | |
|
|
293
|
+
* | v v
|
|
294
|
+
* | +-----------------------------------+
|
|
295
|
+
* v | tab scroller |
|
|
296
|
+
* +------------+--------------+-------------------+
|
|
297
|
+
* | tab | tab | tab |
|
|
298
|
+
* +------------+--------------+-------------------+
|
|
299
|
+
* | |
|
|
300
|
+
* +-----------------------------------+
|
|
301
|
+
*
|
|
302
|
+
* to determine the next adjacent index, we look at the tab root left and
|
|
303
|
+
* tab root right, both relative to the scroll position. if the tab root
|
|
304
|
+
* left is less than 0, then we know it's out of view to the left. if the
|
|
305
|
+
* tab root right minus the bar width is greater than 0, we know the tab is
|
|
306
|
+
* out of view to the right. from there, we either increment or decrement
|
|
307
|
+
* the index.
|
|
308
|
+
*/
|
|
309
|
+
const relativeRootLeft = tabDimensions.rootLeft - scrollPosition;
|
|
310
|
+
const relativeRootRight = tabDimensions.rootRight - scrollPosition - barWidth;
|
|
311
|
+
const relativeRootDelta = relativeRootLeft + relativeRootRight;
|
|
312
|
+
const leftEdgeIsCloser = relativeRootLeft < 0 || relativeRootDelta < 0;
|
|
313
|
+
const rightEdgeIsCloser = relativeRootRight > 0 || relativeRootDelta > 0;
|
|
314
|
+
if (leftEdgeIsCloser) {
|
|
315
|
+
return index - 1;
|
|
316
|
+
}
|
|
317
|
+
if (rightEdgeIsCloser) {
|
|
318
|
+
return index + 1;
|
|
319
|
+
}
|
|
320
|
+
return -1;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
TabsComponent.nextId = 0;
|
|
324
|
+
TabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TabsComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
325
|
+
TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: TabsComponent, selector: "fng-tabs", inputs: { viewType: ["fngTabsViewType", "viewType"], showDivider: ["fngTabsUseBottomDivider", "showDivider"], config: "config" }, outputs: { fngTabChange: "fngTabChange" }, queries: [{ propertyName: "panes", predicate: TabPaneComponent }], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }, { propertyName: "scrollAera", first: true, predicate: ["scrollAera"], descendants: true }, { propertyName: "scrollContent", first: true, predicate: ["scrollContent"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\n <div class=\"fwe-legacy-tabs\">\n <ul\n role=\"tablist\"\n class=\"fwe-legacy-tab-bar\"\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\n >\n <li *ngFor=\"let tab of tabs; let i = index\" class=\"fwe-legacy-tab-item\" [class.fwe-active]=\"tab?.active\">\n <ng-container *ngIf=\"null == tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n >{{ tab.name }}</a\n >\n </ng-container>\n <ng-container *ngIf=\"null != tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\n >\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\n <span>{{ tab.name }}</span>\n </a>\n </ng-container>\n </li>\n </ul>\n <div class=\"fwe-legacy-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewType !== 'legacy'\">\n <div class=\"fng-tab-bar\" role=\"tablist\">\n <div class=\"fng-tab-scroller\" #scroller>\n <div\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\n #scrollAera\n >\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n role=\"tab\"\n class=\"fng-tab\"\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n [tabindex]=\"i === 0 ? 0 : -1\"\n [class.fng-tab--active]=\"tab?.active\"\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\n >\n <span class=\"fng-tab-content\">\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\n </span>\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\n </span>\n </button>\n <div class=\"fng-tab-scroller-divider-line\"></div>\n </div>\n </div>\n </div>\n <div class=\"fng-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-template #tabPanelContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:16px}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
326
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TabsComponent, decorators: [{
|
|
327
|
+
type: Component,
|
|
328
|
+
args: [{ selector: 'fng-tabs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\n <div class=\"fwe-legacy-tabs\">\n <ul\n role=\"tablist\"\n class=\"fwe-legacy-tab-bar\"\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\n >\n <li *ngFor=\"let tab of tabs; let i = index\" class=\"fwe-legacy-tab-item\" [class.fwe-active]=\"tab?.active\">\n <ng-container *ngIf=\"null == tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n >{{ tab.name }}</a\n >\n </ng-container>\n <ng-container *ngIf=\"null != tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\n >\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\n <span>{{ tab.name }}</span>\n </a>\n </ng-container>\n </li>\n </ul>\n <div class=\"fwe-legacy-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewType !== 'legacy'\">\n <div class=\"fng-tab-bar\" role=\"tablist\">\n <div class=\"fng-tab-scroller\" #scroller>\n <div\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\n #scrollAera\n >\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n role=\"tab\"\n class=\"fng-tab\"\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n [tabindex]=\"i === 0 ? 0 : -1\"\n [class.fng-tab--active]=\"tab?.active\"\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\n >\n <span class=\"fng-tab-content\">\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\n </span>\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\n </span>\n </button>\n <div class=\"fng-tab-scroller-divider-line\"></div>\n </div>\n </div>\n </div>\n <div class=\"fng-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-template #tabPanelContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:16px}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"] }]
|
|
329
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Document, decorators: [{
|
|
330
|
+
type: Inject,
|
|
331
|
+
args: [DOCUMENT]
|
|
332
|
+
}] }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { viewType: [{
|
|
333
|
+
type: Input,
|
|
334
|
+
args: ['fngTabsViewType']
|
|
335
|
+
}], showDivider: [{
|
|
336
|
+
type: Input,
|
|
337
|
+
args: ['fngTabsUseBottomDivider']
|
|
338
|
+
}], config: [{
|
|
339
|
+
type: Input
|
|
340
|
+
}], fngTabChange: [{
|
|
341
|
+
type: Output
|
|
342
|
+
}], panes: [{
|
|
343
|
+
type: ContentChildren,
|
|
344
|
+
args: [TabPaneComponent]
|
|
345
|
+
}], scroller: [{
|
|
346
|
+
type: ViewChild,
|
|
347
|
+
args: ['scroller']
|
|
348
|
+
}], scrollAera: [{
|
|
349
|
+
type: ViewChild,
|
|
350
|
+
args: ['scrollAera']
|
|
351
|
+
}], scrollContent: [{
|
|
352
|
+
type: ViewChild,
|
|
353
|
+
args: ['scrollContent']
|
|
354
|
+
}] } });
|
|
355
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3RhYnMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3RhYnMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7QUFvRGpFLE1BQU0sT0FBTyxhQUFhO0lBMEJ4QixZQUNVLEtBQWlCLEVBQ0MsUUFBa0IsRUFDcEMsUUFBbUIsRUFDbkIsRUFBcUI7UUFIckIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQTVCL0IsMkRBQTJEO1FBQ2pDLGFBQVEsR0FBZ0IsWUFBWSxDQUFDO1FBQy9ELDJEQUEyRDtRQUN6QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUV0RCxXQUFNLEdBQXNCLElBQUksQ0FBQztRQUNoQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUF5QyxD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QUFlO3VCQUFDLGdCQUFnQjtnQkFDVixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0ksVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNLLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFRhYlBhbmVDb21wb25lbnQgfSBmcm9tICcuL3RhYi1wYW5lL3RhYi1wYW5lLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFiIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwYW5lSWQ6IHN0cmluZztcbiAgYWN0aXZlPzogYm9vbGVhbjtcbiAgaWNvbj86IHN0cmluZztcbn1cblxuLy8gZmlsbDogdXNlIHRoZSByZW1haW5pbmcgc3BhY2UgYW5kIGFkZCBpbiBzYW1lIHByb3BvcnRpb24gdG8gZXZlcnkgdGFiIGl0ZW1cbi8vIGVxdWFsOiBtYWtlIGFsbCB0YWIgaXRlbXMgc2FtZSB3aWR0aCAoYXMgdGhlIG9uZSB3aXRoIGxhcmdlc3QgY29udGVudClcbmV4cG9ydCB0eXBlIFRhYkl0ZW1BcHBlYXJhbmNlID0gJ2ZpbGwnIHwgJ2VxdWFsJyB8ICdkZWZhdWx0JztcblxuLy8gbGVnYWN5OiByZWNvbW1lbmRlZCBmb3IgZGVza3RvcCBvbmx5IGFwcGxpY2F0aW9uc1xuLy8gcmVzcG9uc2l2ZTogZGVza3RvcCwgdGFibGV0LCBtb2JpbGUgd2l0aCBzY3JvbGxhYmxlIHRhYnNcbmV4cG9ydCB0eXBlIFRhYlZpZXdUeXBlID0gJ2xlZ2FjeScgfCAncmVzcG9uc2l2ZSc7XG5cbi8vIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgbGVnYWN5IHRhYiB2aWV3IHR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgVGFic0NvbmZpZ3VyYXRpb24ge1xuICB0YWJCYXI/OiB7XG4gICAgZnVsbFdpZHRoPzogYm9vbGVhbjtcbiAgfTtcbiAgdGFiSXRlbXM/OiB7XG4gICAgYXBwZWFyYW5jZTogVGFiSXRlbUFwcGVhcmFuY2U7XG4gIH07XG59XG5cbi8vIHByb3ZpZGVzIGRldGFpbHMgYWJvdXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSB0YWIgZWxlbWVudCBhbmQgdGhlIHRhYiBjb250ZW50IGVsZW1lbnRcbi8vIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZpc3VhbCBwb3NpdGlvbiBvZiB0aGUgdGFiIHdpdGggcmVzcGVjdCBvZiBpdHMgcGFyZW50IGNvbnRhaW5lclxuZXhwb3J0IGludGVyZmFjZSBUYWJEaW1lbnNpb25zIHtcbiAgcm9vdExlZnQ6IG51bWJlcjtcbiAgcm9vdFJpZ2h0OiBudW1iZXI7XG4gIGNvbnRlbnRMZWZ0OiBudW1iZXI7XG4gIGNvbnRlbnRSaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYlNjcm9sbEFuaW1hdGlvbiB7XG4gIGZpbmFsU2Nyb2xsUG9zaXRpb246IG51bWJlcjtcbiAgc2Nyb2xsRGVsdGE6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJTY3JvbGxIb3Jpem9udGFsRWRnZXMge1xuICBsZWZ0OiBudW1iZXI7XG4gIHJpZ2h0OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZuZy10YWJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmV4dElkID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdmbmdUYWJzVmlld1R5cGUnKSB2aWV3VHlwZTogVGFiVmlld1R5cGUgPSAncmVzcG9uc2l2ZSc7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnZm5nVGFic1VzZUJvdHRvbURpdmlkZXInKSBzaG93RGl2aWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogVGFic0NvbmZpZ3VyYXRpb24gPSBudWxsO1xuICBAT3V0cHV0KCkgZm5nVGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHByZXZpb3VzOiBzdHJpbmc7IGN1cnJlbnQ6IHN0cmluZyB9PigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFiUGFuZUNvbXBvbmVudCkgcGFuZXM6IFF1ZXJ5TGlzdDxUYWJQYW5lQ29tcG9uZW50PjtcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsZXInKSBzY3JvbGxlcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsQWVyYScpIHNjcm9sbEFlcmE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRlbnQnKSBzY3JvbGxDb250ZW50OiBFbGVtZW50UmVmO1xuXG4gIGNvbXBvbmVudElkID0gYHRhYnMtJHsrK1RhYnNDb21wb25lbnQubmV4dElkfWA7XG4gIHRhYnM6IFRhYltdID0gW107XG4gIHVzZUNvbXBhY3REZW5zaXR5OiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBhY3RpdmVUYWI6IFRhYiA9IG51bGw7XG4gIHByaXZhdGUgZWxlbVNjcm9sbGVyOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBlbGVtU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgZWxlbVNjcm9sbENvbnRlbnQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGluamVjdGVkV2luZG93OiBXaW5kb3c7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGNvbXBsZXRlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLmluamVjdGVkV2luZG93ID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldztcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmluaXRUYWJzKCk7XG4gICAgaWYgKG51bGwgPT09IHRoaXMuYWN0aXZlVGFiKSB7XG4gICAgICB0aGlzLnBhbmVzLm1hcCgocGFuZSwgaSkgPT4ge1xuICAgICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICAgIHBhbmUuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFuZXMuZmluZChwYW5lID0+IG51bGwgIT0gdGhpcy5hY3RpdmVUYWIucGFuZUlkICYmIHBhbmUudGFiUGFuZUlkID09PSB0aGlzLmFjdGl2ZVRhYi5wYW5lSWQpLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbVNjcm9sbGVyID0gdGhpcy5zY3JvbGxlcj8ubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmVsZW1TY3JvbGxBcmVhID0gdGhpcy5zY3JvbGxBZXJhPy5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuZWxlbVNjcm9sbENvbnRlbnQgPSB0aGlzLnNjcm9sbENvbnRlbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaW5pdGlhbFdpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYT8ub2Zmc2V0V2lkdGg7XG4gICAgaWYgKGluaXRpYWxXaWR0aCA+IDc2OCkge1xuICAgICAgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMuZWxlbVNjcm9sbEFyZWEub2Zmc2V0V2lkdGg7XG4gICAgICBpZiAod2lkdGggPiA3NjggJiYgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnVzZUNvbXBhY3REZW5zaXR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmICh3aWR0aCA8PSA3NjggJiYgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy51c2VDb21wYWN0RGVuc2l0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZWxlbVNjcm9sbEFyZWEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbVNjcm9sbEFyZWEpO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlVGFiUGFuZUNoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcGxldGUubmV4dCh0cnVlKTtcbiAgICB0aGlzLmNvbXBsZXRlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzaG93VGFiUGFuZShpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFuZSA9IHRoaXMucGFuZXMuZmluZChwID0+IHAudGFiUGFuZUlkID09PSBpZCk7XG4gICAgaWYgKG51bGwgIT0gcGFuZSkge1xuICAgICAgdGhpcy5wYW5lcy5tYXAocCA9PiB7XG4gICAgICAgIHAuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHBhbmUuaXNWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgdGhpcy50YWJzLm1hcCh0YWIgPT4ge1xuICAgICAgICBpZiAodGFiLnBhbmVJZCAhPT0gcGFuZS50YWJQYW5lSWQpIHtcbiAgICAgICAgICB0YWIuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFiLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5mbmdUYWJDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHByZXZpb3VzOiB0aGlzLmFjdGl2ZVRhYj8ucGFuZUlkLFxuICAgICAgICBjdXJyZW50OiBpZFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IHRoaXMudGFicy5maW5kKHRhYiA9PiAhIXRhYi5hY3RpdmUpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRhYlNjcm9sbChldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2Nyb2xsQ29udGVudFdpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQ29udGVudC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBzY3JvbGxBcmVhV2lkdGggPSB0aGlzLmVsZW1TY3JvbGxBcmVhLm9mZnNldFdpZHRoO1xuXG4gICAgLy8gY2hlY2sgaWYgbm8gc2Nyb2xsIGlzIG5lZWRlZFxuICAgIGlmIChzY3JvbGxBcmVhV2lkdGggPiBzY3JvbGxDb250ZW50V2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpbmRleFxuICAgIGlmICghdGhpcy5pbmRleElzSW5SYW5nZShpbmRleCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc2Nyb2xsIHRvIDAgaWYgc2Nyb2xsaW5nIHRvIHRoZSBmaXJzdCB0YWJcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG8oMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIHNjcm9sbCB0byB0aGUgbWF4IHZhbHVlIGlmIHNjcm9sbGluZyB0byB0aGUgbGFzdCB0YWJcbiAgICBpZiAoaW5kZXggPT09IHRoaXMudGFicy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvKHRoaXMuZWxlbVNjcm9sbENvbnRlbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRUYWI6IEhUTUxFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIHRoaXMuc2Nyb2xsSW50b1ZpZXcoaW5kZXgsIGN1cnJlbnRUYWIpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VGFicygpIHtcbiAgICB0aGlzLnRhYnMgPSBbXTtcbiAgICB0aGlzLnBhbmVzLm1hcCgocGFuZSwgaSkgPT4ge1xuICAgICAgcGFuZS50YWJJZCA9IHRoaXMuY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaTtcbiAgICAgIGNvbnN0IHRhYjogVGFiID0ge1xuICAgICAgICBuYW1lOiBudWxsICE9IHBhbmUubmFtZSA/IHBhbmUubmFtZSA6ICcnLFxuICAgICAgICBwYW5lSWQ6IG51bGwgIT0gcGFuZS50YWJQYW5lSWQgPyBwYW5lLnRhYlBhbmVJZCA6IG51bGwsXG4gICAgICAgIGljb246IG51bGwgIT0gcGFuZS5pY29uID8gcGFuZS5pY29uIDogbnVsbCxcbiAgICAgICAgYWN0aXZlOiBudWxsICE9IHBhbmUuYWN0aXZlID8gcGFuZS5hY3RpdmUgOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHRoaXMudGFicy5wdXNoKHRhYik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmluaXRBY3RpdmVUYWIoKTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEFjdGl2ZVRhYigpIHtcbiAgICBjb25zdCBhY3RpdmVUYWI6IFRhYiA9IHRoaXMudGFicy5maW5kKCh0YWI6IFRhYikgPT4gISF0YWIuYWN0aXZlKTtcbiAgICBpZiAoIWFjdGl2ZVRhYiAmJiAwIDwgdGhpcy50YWJzLmxlbmd0aCkge1xuICAgICAgdGhpcy50YWJzWzBdID0geyAuLi50aGlzLnRhYnNbMF0sIGFjdGl2ZTogdHJ1ZSB9O1xuICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0aGlzLnRhYnNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gYWN0aXZlVGFiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVGFiUGFuZUNoYW5nZXMoKSB7XG4gICAgLy8gZmlyc3Qgc3Vic2NyaWJlIHRvIGFueSBjaGFuZ2VzIGluIHRhYiBwYW5lLCBzbyB0aGF0IHRoZSB0YWJzIGluIHRoaXMgdmlldyB3aWlsIGJlIHVwZGF0ZWRcbiAgICB0aGlzLnBhbmVzLmZvckVhY2gocGFuZSA9PiB7XG4gICAgICBwYW5lLmNoYW5nZXMkLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcGxldGUpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBvbiBjaGFuZ2VzIGluIGEgdGFiIHBhbmUsIHdlIGluaXQgdGhlIHRhYnMgYWdhaW5cbiAgICAgICAgdGhpcy5pbml0VGFicygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvKHNjcm9sbFg6IG51bWJlcikge1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxYID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIGNvbnN0IHNhZmVTY3JvbGxYID0gdGhpcy5jbGFtcFNjcm9sbFZhbHVlKHNjcm9sbFgpO1xuICAgIGNvbnN0IHNjcm9sbERlbHRhID0gc2FmZVNjcm9sbFggLSBjdXJyZW50U2Nyb2xsWDtcbiAgICB0aGlzLmFuaW1hdGUoe1xuICAgICAgZmluYWxTY3JvbGxQb3NpdGlvbjogc2FmZVNjcm9sbFgsXG4gICAgICBzY3JvbGxEZWx0YVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxJbnRvVmlldyhpbmRleDogbnVtYmVyLCB0YWI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgY29uc3QgYmFyV2lkdGggPSB0aGlzLmVsZW1TY3JvbGxBcmVhLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IHRhYkRpbWVuc2lvbnMgPSB0aGlzLmNvbXB1dGVEaW1lbnNpb25zKHRhYik7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5maW5kQWRqYWNlbnRUYWJJbmRleENsb3Nlc3RUb0VkZ2UoaW5kZXgsIHRhYkRpbWVuc2lvbnMsIHNjcm9sbFBvc2l0aW9uLCBiYXJXaWR0aCk7XG5cbiAgICBpZiAoIXRoaXMuaW5kZXhJc0luUmFuZ2UobmV4dEluZGV4KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcm9sbEluY3JlbWVudCA9IHRoaXMuY2FsY3VsYXRlU2Nyb2xsSW5jcmVtZW50KGluZGV4LCBuZXh0SW5kZXgsIHNjcm9sbFBvc2l0aW9uLCBiYXJXaWR0aCk7XG4gICAgdGhpcy5pbmNyZW1lbnRTY3JvbGwoc2Nyb2xsSW5jcmVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jcmVtZW50U2Nyb2xsKHNjcm9sbFhJbmNyZW1lbnQ6IG51bWJlcikge1xuICAgIC8vIG5vIHNjcm9sbCBuZWVkZWRcbiAgICBpZiAoc2Nyb2xsWEluY3JlbWVudCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY3JvbGxPcGVyYXRpb24gPSB0aGlzLmdldEluY3JlbWVudFNjcm9sbE9wZXJhdGlvbihzY3JvbGxYSW5jcmVtZW50KTtcbiAgICB0aGlzLmFuaW1hdGUoc2Nyb2xsT3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0ZShhbmltYXRpb246IFRhYlNjcm9sbEFuaW1hdGlvbikge1xuICAgIC8vIG5vIGFuaW1hdGlvbiBuZWVkZWRcbiAgICBpZiAoYW5pbWF0aW9uLnNjcm9sbERlbHRhID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wU2Nyb2xsQW5pbWF0aW9uKCk7XG5cbiAgICAvLyB0aGlzIGFuaW1hdGlvbiB1c2VzIHRoZSBmbGlwIGFwcHJvYWNoXG4gICAgLy8gaHR0cHM6Ly9hZXJvdHdpc3QuY29tL2Jsb2cvZmxpcC15b3VyLWFuaW1hdGlvbnMvXG4gICAgLy8gaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9hbmltYXRpbmctbGF5b3V0cy13aXRoLXRoZS1mbGlwLXRlY2huaXF1ZS9cbiAgICB0aGlzLmVsZW1TY3JvbGxBcmVhLnNjcm9sbExlZnQgPSBhbmltYXRpb24uZmluYWxTY3JvbGxQb3NpdGlvbjtcbiAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTdHlsZVByb3BlcnR5KCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlWCgke2FuaW1hdGlvbi5zY3JvbGxEZWx0YX1weClgKTtcbiAgICAvLyBmb3JjZSByZXBhaW50XG4gICAgdGhpcy5lbGVtU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbVNjcm9sbGVyLCAnZm5nLXRhYi1zY3JvbGxlci0tYW5pbWF0aW5nJyk7XG4gICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTdHlsZVByb3BlcnR5KCd0cmFuc2Zvcm0nLCAnbm9uZScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wU2Nyb2xsQW5pbWF0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxQb3NpdGlvbiA9IHRoaXMuZ2V0QW5pbWF0aW5nU2Nyb2xsUG9zaXRpb24oKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbVNjcm9sbGVyLCAnZm5nLXRhYi1zY3JvbGxlci0tYW5pbWF0aW5nJyk7XG4gICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U3R5bGVQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZVgoMHB4KScpO1xuICAgIHRoaXMuZWxlbVNjcm9sbEFyZWEuc2Nyb2xsTGVmdCA9IGN1cnJlbnRTY3JvbGxQb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW5pbWF0aW5nU2Nyb2xsUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNsYXRlWCA9IHRoaXMuY2FsY3VsYXRlQ3VycmVudFRyYW5zbGF0ZVgoKTtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIHJldHVybiBzY3JvbGxMZWZ0IC0gY3VycmVudFRyYW5zbGF0ZVg7XG4gIH1cblxuICBwcml2YXRlIGdldEluY3JlbWVudFNjcm9sbE9wZXJhdGlvbihzY3JvbGxYOiBudW1iZXIpOiBUYWJTY3JvbGxBbmltYXRpb24ge1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxYID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIGNvbnN0IHRhcmdldFNjcm9sbFggPSBzY3JvbGxYICsgY3VycmVudFNjcm9sbFg7XG4gICAgY29uc3Qgc2FmZVNjcm9sbFggPSB0aGlzLmNsYW1wU2Nyb2xsVmFsdWUodGFyZ2V0U2Nyb2xsWCk7XG4gICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBzYWZlU2Nyb2xsWCAtIGN1cnJlbnRTY3JvbGxYO1xuICAgIHJldHVybiB7XG4gICAgICBmaW5hbFNjcm9sbFBvc2l0aW9uOiBzYWZlU2Nyb2xsWCxcbiAgICAgIHNjcm9sbERlbHRhXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBTY3JvbGxWYWx1ZShzY3JvbGxYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGVkZ2VzID0gdGhpcy5jYWxjdWxhdGVTY3JvbGxFZGdlcygpO1xuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChlZGdlcy5sZWZ0LCBzY3JvbGxYKSwgZWRnZXMucmlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTY3JvbGxFZGdlcygpOiBUYWJTY3JvbGxIb3Jpem9udGFsRWRnZXMge1xuICAgIGNvbnN0IHNjcm9sbENvbnRlbnRXaWR0aCA9IHRoaXMuZWxlbVNjcm9sbENvbnRlbnQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgc2Nyb2xsQXJlYVdpZHRoID0gdGhpcy5lbGVtU2Nyb2xsQXJlYS5vZmZzZXRXaWR0aDtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiBzY3JvbGxDb250ZW50V2lkdGggLSBzY3JvbGxBcmVhV2lkdGhcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRGltZW5zaW9ucyh0YWI6IEhUTUxFbGVtZW50KTogVGFiRGltZW5zaW9ucyB7XG4gICAgY29uc3Qgcm9vdFdpZHRoID0gdGFiLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IHJvb3RMZWZ0ID0gdGFiLm9mZnNldExlZnQ7XG5cbiAgICBjb25zdCB0YWJDb250ZW50OiBIVE1MRWxlbWVudCA9IHRhYi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmZuZy10YWItY29udGVudCcpO1xuICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHRhYkNvbnRlbnQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3QgY29udGVudExlZnQgPSB0YWJDb250ZW50Lm9mZnNldExlZnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudExlZnQ6IHJvb3RMZWZ0ICsgY29udGVudExlZnQsXG4gICAgICBjb250ZW50UmlnaHQ6IHJvb3RMZWZ0ICsgY29udGVudExlZnQgKyBjb250ZW50V2lkdGgsXG4gICAgICByb290TGVmdCxcbiAgICAgIHJvb3RSaWdodDogcm9vdExlZnQgKyByb290V2lkdGhcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTY3JvbGxJbmNyZW1lbnQoaW5kZXg6IG51bWJlciwgbmV4dEluZGV4OiBudW1iZXIsIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsIGJhcldpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG5leHRUYWI6IEhUTUxFbGVtZW50ID0gKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICBgIyR7dGhpcy5jb21wb25lbnRJZH0tdGFiLSR7bmV4dEluZGV4fWBcbiAgICApO1xuICAgIGNvbnN0IG5leHRUYWJEaW1lbnNpb25zID0gdGhpcy5jb21wdXRlRGltZW5zaW9ucyhuZXh0VGFiKTtcbiAgICBjb25zdCByZWxhdGl2ZUNvbnRlbnRMZWZ0ID0gbmV4dFRhYkRpbWVuc2lvbnMuY29udGVudExlZnQgLSBzY3JvbGxQb3NpdGlvbiAtIGJhcldpZHRoO1xuICAgIGNvbnN0IHJlbGF0aXZlQ29udGVudFJpZ2h0ID0gbmV4dFRhYkRpbWVuc2lvbnMuY29udGVudFJpZ2h0IC0gc2Nyb2xsUG9zaXRpb247XG4gICAgY29uc3QgbGVmdEluY3JlbWVudCA9IHJlbGF0aXZlQ29udGVudFJpZ2h0IC0gNDg7XG4gICAgY29uc3QgcmlnaHRJbmNyZW1lbnQgPSByZWxhdGl2ZUNvbnRlbnRMZWZ0ICsgNDg7XG5cbiAgICBpZiAobmV4dEluZGV4IDwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihsZWZ0SW5jcmVtZW50LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5tYXgocmlnaHRJbmNyZW1lbnQsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleElzSW5SYW5nZShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnRhYnMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY3JvbGxQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2xhdGVYID0gdGhpcy5jYWxjdWxhdGVDdXJyZW50VHJhbnNsYXRlWCgpO1xuICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLmVsZW1TY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG5cbiAgICByZXR1cm4gc2Nyb2xsTGVmdCAtIGN1cnJlbnRUcmFuc2xhdGVYO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDdXJyZW50VHJhbnNsYXRlWCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHRyYW5zZm9ybVZhbHVlID0gdGhpcy5nZXRTY3JvbGxDb250ZW50U3R5bGVWYWx1ZSgndHJhbnNmb3JtJyk7XG4gICAgaWYgKHRyYW5zZm9ybVZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIHRoZSB0cmFuc2Zvcm0gdmFsdWUgaXMgaW4gZm9ybSBvZiAnbWF0cml4KGEsIGIsIGMsIGQsIHR4LCB0eSknXG4gICAgLy8gZ2V0IGFsbCB0aGUgcGFyZW50aGVzaXplZCB2YWx1ZXNcbiAgICBjb25zdCBtYXRjaCA9IC9cXCgoLis/KVxcKS8uZXhlYyh0cmFuc2Zvcm1WYWx1ZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0cml4UGFyYW1zID0gbWF0Y2hbMV07XG4gICAgLy8gd2UgbmVlZCB2YWx1ZSBvZiB0eCAtPiB0cmFuc2xhdGVYXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IFthLCBiLCBjLCBkLCB0eCwgdHldID0gbWF0cml4UGFyYW1zLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodHgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY3JvbGxDb250ZW50U3R5bGVWYWx1ZShwcm9wTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWRXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1TY3JvbGxDb250ZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2Nyb2xsQ29udGVudFN0eWxlUHJvcGVydHkocHJvcE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtU2Nyb2xsQ29udGVudCwgcHJvcE5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEFkamFjZW50VGFiSW5kZXhDbG9zZXN0VG9FZGdlKGluZGV4OiBudW1iZXIsIHRhYkRpbWVuc2lvbnM6IFRhYkRpbWVuc2lvbnMsIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsIGJhcldpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8qKlxuICAgICAqIHRhYnMgYXJlIGxhaWQgb3V0IGluIHRoZSB0YWIgc2Nyb2xsZXIgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogICAgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICogICAgKy0tLStcbiAgICAgKiAgICB8ICAgfCAgIGJhciB3aWR0aFxuICAgICAqICAgIHwgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAgICogICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiAgICB8ICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlxuICAgICAqICAgIHwgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAgICogICAgdiAgIHwgICAgICAgICAgICAgdGFiIHNjcm9sbGVyICAgICAgICAgIHxcbiAgICAgKiAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAgICogICAgfCAgICB0YWIgICAgIHwgICAgICB0YWIgICAgIHwgICAgICAgIHRhYiAgICAgICAgfFxuICAgICAqICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgICAgKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAgICpcbiAgICAgKiB0byBkZXRlcm1pbmUgdGhlIG5leHQgYWRqYWNlbnQgaW5kZXgsIHdlIGxvb2sgYXQgdGhlIHRhYiByb290IGxlZnQgYW5kXG4gICAgICogdGFiIHJvb3QgcmlnaHQsIGJvdGggcmVsYXRpdmUgdG8gdGhlIHNjcm9sbCBwb3NpdGlvbi4gaWYgdGhlIHRhYiByb290XG4gICAgICogbGVmdCBpcyBsZXNzIHRoYW4gMCwgdGhlbiB3ZSBrbm93IGl0J3Mgb3V0IG9mIHZpZXcgdG8gdGhlIGxlZnQuIGlmIHRoZVxuICAgICAqIHRhYiByb290IHJpZ2h0IG1pbnVzIHRoZSBiYXIgd2lkdGggaXMgZ3JlYXRlciB0aGFuIDAsIHdlIGtub3cgdGhlIHRhYiBpc1xuICAgICAqIG91dCBvZiB2aWV3IHRvIHRoZSByaWdodC4gZnJvbSB0aGVyZSwgd2UgZWl0aGVyIGluY3JlbWVudCBvciBkZWNyZW1lbnRcbiAgICAgKiB0aGUgaW5kZXguXG4gICAgICovXG4gICAgY29uc3QgcmVsYXRpdmVSb290TGVmdCA9IHRhYkRpbWVuc2lvbnMucm9vdExlZnQgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICBjb25zdCByZWxhdGl2ZVJvb3RSaWdodCA9IHRhYkRpbWVuc2lvbnMucm9vdFJpZ2h0IC0gc2Nyb2xsUG9zaXRpb24gLSBiYXJXaWR0aDtcbiAgICBjb25zdCByZWxhdGl2ZVJvb3REZWx0YSA9IHJlbGF0aXZlUm9vdExlZnQgKyByZWxhdGl2ZVJvb3RSaWdodDtcbiAgICBjb25zdCBsZWZ0RWRnZUlzQ2xvc2VyID0gcmVsYXRpdmVSb290TGVmdCA8IDAgfHwgcmVsYXRpdmVSb290RGVsdGEgPCAwO1xuICAgIGNvbnN0IHJpZ2h0RWRnZUlzQ2xvc2VyID0gcmVsYXRpdmVSb290UmlnaHQgPiAwIHx8IHJlbGF0aXZlUm9vdERlbHRhID4gMDtcblxuICAgIGlmIChsZWZ0RWRnZUlzQ2xvc2VyKSB7XG4gICAgICByZXR1cm4gaW5kZXggLSAxO1xuICAgIH1cblxuICAgIGlmIChyaWdodEVkZ2VJc0Nsb3Nlcikge1xuICAgICAgcmV0dXJuIGluZGV4ICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3VHlwZSA9PT0gJ2xlZ2FjeSdcIj5cbiAgPGRpdiBjbGFzcz1cImZ3ZS1sZWdhY3ktdGFic1wiPlxuICAgIDx1bFxuICAgICAgcm9sZT1cInRhYmxpc3RcIlxuICAgICAgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYi1iYXJcIlxuICAgICAgW2NsYXNzLmZ3ZS1sZWdhY3ktdGFiLWJhci1mdWxsLXdpZHRoXT1cImNvbmZpZz8udGFiQmFyPy5mdWxsV2lkdGhcIlxuICAgICAgW2NsYXNzLmZ3ZS1sZWdhY3ktdGFiLWl0ZW1zLWVxdWFsLXdpZHRoXT1cIidlcXVhbCcgPT09IGNvbmZpZz8udGFiSXRlbXM/LmFwcGVhcmFuY2VcIlxuICAgICAgW2NsYXNzLmZ3ZS1sZWdhY3ktdGFiLWl0ZW1zLWZpbGxdPVwiJ2ZpbGwnID09PSBjb25maWc/LnRhYkl0ZW1zPy5hcHBlYXJhbmNlXCJcbiAgICA+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJmd2UtbGVnYWN5LXRhYi1pdGVtXCIgW2NsYXNzLmZ3ZS1hY3RpdmVdPVwidGFiPy5hY3RpdmVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm51bGwgPT0gdGFiPy5pY29uXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIFtpZF09XCJjb21wb25lbnRJZCArICctdGFiLScgKyBpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidGFiLnBhbmVJZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInRydWUgPT09IHRhYj8uYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICByb2xlPVwidGFiXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZndlLWxlZ2FjeS10YWItbGlua1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd1RhYlBhbmUodGFiLnBhbmVJZClcIlxuICAgICAgICAgICAgPnt7IHRhYi5uYW1lIH19PC9hXG4gICAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm51bGwgIT0gdGFiPy5pY29uXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIFtpZF09XCJjb21wb25lbnRJZCArICctdGFiLScgKyBpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidGFiLnBhbmVJZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInRydWUgPT09IHRhYj8uYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICByb2xlPVwidGFiXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZndlLWxlZ2FjeS10YWItbGlua1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd1RhYlBhbmUodGFiLnBhbmVJZClcIlxuICAgICAgICAgICAgW2NsYXNzLmZ3ZS1jYW4tc3dhcC1pY29uXT1cIjIgPT09IHRhYnMubGVuZ3RoICYmIDEgPT09IGlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIFtjbGFzc109XCInZndlLWljb24gJyArIHRhYi5pY29uXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGFiLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgICA8ZGl2IGNsYXNzPVwiZndlLWxlZ2FjeS10YWItcGFuZWwtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYlBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1R5cGUgIT09ICdsZWdhY3knXCI+XG4gIDxkaXYgY2xhc3M9XCJmbmctdGFiLWJhclwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgPGRpdiBjbGFzcz1cImZuZy10YWItc2Nyb2xsZXJcIiAjc2Nyb2xsZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm5nLXRhYi1zY3JvbGxlci1zY3JvbGwtYXJlYSBmbmctdGFiLXNjcm9sbGVyLXNjcm9sbC1hcmVhLS1zY3JvbGxcIlxuICAgICAgICBbY2xhc3MuZm5nLXRhYi1zY3JvbGxlci1zY3JvbGwtYXJlYS0tY29tcGFjdF09XCJ1c2VDb21wYWN0RGVuc2l0eVwiXG4gICAgICAgICNzY3JvbGxBZXJhXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbmctdGFiLXNjcm9sbGVyLXNjcm9sbC1jb250ZW50XCIgW2NsYXNzLmZuZy10YWItc2Nyb2xsZXItc2Nyb2xsLWNvbnRlbnQtLXdpdGgtZGl2aWRlcl09XCJzaG93RGl2aWRlclwiICNzY3JvbGxDb250ZW50PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICByb2xlPVwidGFiXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm5nLXRhYlwiXG4gICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLXRhYi0nICsgaVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInRhYi5wYW5lSWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0cnVlID09PSB0YWI/LmFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImkgPT09IDAgPyAwIDogLTFcIlxuICAgICAgICAgICAgW2NsYXNzLmZuZy10YWItLWFjdGl2ZV09XCJ0YWI/LmFjdGl2ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVGFiU2Nyb2xsKCRldmVudCwgaSk7IHNob3dUYWJQYW5lKHRhYi5wYW5lSWQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZuZy10YWItY29udGVudFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZuZy10YWItdGV4dC1sYWJlbFwiPnt7IHRhYi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbmctdGFiLWluZGljYXRvclwiIFtjbGFzcy5mbmctdGFiLWluZGljYXRvci0tYWN0aXZlXT1cInRhYj8uYWN0aXZlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm5nLXRhYi1pbmRpY2F0b3ItY29udGVudCBmbmctdGFiLWluZGljYXRvci1jb250ZW50LS11bmRlcmxpbmVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZuZy10YWItc2Nyb2xsZXItZGl2aWRlci1saW5lXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZuZy10YWItcGFuZWwtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYlBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3RhYlBhbmVsQ29udGVudD5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { IconComponent } from './icon/icon.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export * from './icon/icon.component';
|
|
6
|
+
export class FestoAngularContentModule {
|
|
7
|
+
}
|
|
8
|
+
FestoAngularContentModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularContentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
9
|
+
FestoAngularContentModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularContentModule, declarations: [IconComponent], imports: [CommonModule], exports: [IconComponent] });
|
|
10
|
+
FestoAngularContentModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularContentModule, providers: [], imports: [[CommonModule]] });
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularContentModule, decorators: [{
|
|
12
|
+
type: NgModule,
|
|
13
|
+
args: [{
|
|
14
|
+
declarations: [IconComponent],
|
|
15
|
+
imports: [CommonModule],
|
|
16
|
+
exports: [IconComponent],
|
|
17
|
+
providers: []
|
|
18
|
+
}]
|
|
19
|
+
}] });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb250ZW50L2NvbnRlbnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFFdEQsY0FBYyx1QkFBdUIsQ0FBQztBQVF0QyxNQUFNLE9BQU8seUJBQXlCOztzSEFBekIseUJBQXlCO3VIQUF6Qix5QkFBeUIsaUJBTHJCLGFBQWEsYUFDbEIsWUFBWSxhQUNaLGFBQWE7dUhBR1oseUJBQXlCLGFBRnpCLEVBQUUsWUFGSixDQUFDLFlBQVksQ0FBQzsyRkFJWix5QkFBeUI7a0JBTnJDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDO29CQUM3QixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztvQkFDeEIsU0FBUyxFQUFFLEVBQUU7aUJBQ2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuL2ljb24vaWNvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgKiBmcm9tICcuL2ljb24vaWNvbi5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtJY29uQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGV4cG9ydHM6IFtJY29uQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBGZXN0b0FuZ3VsYXJDb250ZW50TW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
/**
|
|
5
|
+
* An icon component.
|
|
6
|
+
*/
|
|
7
|
+
export class IconComponent {
|
|
8
|
+
}
|
|
9
|
+
IconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
10
|
+
IconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: IconComponent, selector: "fng-icon", inputs: { icon: "icon" }, ngImport: i0, template: "<i *ngIf=\"icon?.type === 'font'\" [class]=\"'fwe-icon fwe-icon-' + icon?.name + ' ' + (icon.class || '')\"></i>\n<img\n *ngIf=\"icon?.type === 'img'\"\n [class]=\"icon.class\"\n [src]=\"icon?.url\"\n [ngStyle]=\"{ width: icon?.width + 'px', height: icon?.height + 'px' }\"\n/>\n<ng-content *ngIf=\"icon?.type === 'svg'\"></ng-content>\n", styles: [""], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: IconComponent, decorators: [{
|
|
12
|
+
type: Component,
|
|
13
|
+
args: [{ selector: 'fng-icon', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<i *ngIf=\"icon?.type === 'font'\" [class]=\"'fwe-icon fwe-icon-' + icon?.name + ' ' + (icon.class || '')\"></i>\n<img\n *ngIf=\"icon?.type === 'img'\"\n [class]=\"icon.class\"\n [src]=\"icon?.url\"\n [ngStyle]=\"{ width: icon?.width + 'px', height: icon?.height + 'px' }\"\n/>\n<ng-content *ngIf=\"icon?.type === 'svg'\"></ng-content>\n", styles: [""] }]
|
|
14
|
+
}], propDecorators: { icon: [{
|
|
15
|
+
type: Input
|
|
16
|
+
}] } });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb250ZW50L2ljb24vaWNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9jb250ZW50L2ljb24vaWNvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBMEM3Rjs7R0FFRztBQVFILE1BQU0sT0FBTyxhQUFhOzswR0FBYixhQUFhOzhGQUFiLGFBQWEsMEVDcEQxQix1VkFRQTsyRkQ0Q2EsYUFBYTtrQkFQekIsU0FBUzsrQkFDRSxVQUFVLG1CQUdILHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OEJBTTVCLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBJY29uVHlwZSA9ICdmb250JyB8ICdpbWcnIHwgJ3N2Zyc7XG5cbi8qKlxuICogRGVzY3JpYmVzIGFuIGljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWNvbiB7XG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0eXBlLlxuICAgKiAgICAgLSAnZm9udCcgdXNlcyBbbmFtZV17QGxpbmsgSWNvbiNuYW1lfSB0byByZXNvbHZlIHRoZSBpY29uIGZyb20gdGhlIGljb24gZm9udC5cbiAgICogICAgIC0gJ2ltZycgdXNlcyBbdXJsXXtAbGluayBJY29uI3VybH0sIFtoZWlnaHRde0BsaW5rIEljb24jaGVpZ2h0fSwgW3dpZHRoXXtAbGluayBJY29uI3dpZHRofVxuICAgKiAgICAgLSAnc3ZnJyB1c2VzIG5nLWNvbnRlbnQgdG8gZGlzcGxheSBzdmcsIFtoZWlnaHRde0BsaW5rIEljb24jaGVpZ2h0fSwgW3dpZHRoXXtAbGluayBJY29uI3dpZHRofVxuICAgKi9cbiAgdHlwZTogSWNvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHVzZWQgdG8gcmVzb2x2ZSB0aGUgaWNvbi5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1cmwgdXNlZCB0byByZXNvbHZlIHRoZSBpbWFnZS5cbiAgICovXG4gIHVybD86IHN0cmluZztcblxuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbCAocHgpLlxuICAgKi9cbiAgaGVpZ2h0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaWR0aCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWwgKHB4KS5cbiAgICovXG4gIHdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGlzIHN0cmluZyB3aWxsIGJlIGFkZGVkIGFzIGNzcyBjbGFzcyB0byB0aGUgaWNvbi5cbiAgICovXG4gIGNsYXNzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIGljb24gY29tcG9uZW50LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmbmctaWNvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9pY29uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaWNvbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBJY29uQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpY29uLlxuICAgKi9cbiAgQElucHV0KCkgaWNvbjogSWNvbjtcbn1cbiIsIjxpICpuZ0lmPVwiaWNvbj8udHlwZSA9PT0gJ2ZvbnQnXCIgW2NsYXNzXT1cIidmd2UtaWNvbiBmd2UtaWNvbi0nICsgaWNvbj8ubmFtZSArICcgJyArIChpY29uLmNsYXNzIHx8ICcnKVwiPjwvaT5cbjxpbWdcbiAgKm5nSWY9XCJpY29uPy50eXBlID09PSAnaW1nJ1wiXG4gIFtjbGFzc109XCJpY29uLmNsYXNzXCJcbiAgW3NyY109XCJpY29uPy51cmxcIlxuICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBpY29uPy53aWR0aCArICdweCcsIGhlaWdodDogaWNvbj8uaGVpZ2h0ICsgJ3B4JyB9XCJcbi8+XG48bmctY29udGVudCAqbmdJZj1cImljb24/LnR5cGUgPT09ICdzdmcnXCI+PC9uZy1jb250ZW50PlxuIl19
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { FestoAngularLayoutModule } from './layout/layout.module';
|
|
3
|
+
import { FestoAngularComponentsModule } from './components/components.module';
|
|
4
|
+
import { FestoAngularContentModule } from './content/content.module';
|
|
5
|
+
import { FestoAngularFormsModule } from './forms/forms.module';
|
|
6
|
+
import { FestoAngularModalsModule } from './components/modals/modals.module';
|
|
7
|
+
import { FestoAngularSnackbarModule } from './components/snackbar/snackbar.module';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class FestoAngularModule {
|
|
10
|
+
}
|
|
11
|
+
FestoAngularModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
FestoAngularModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularModule, imports: [FestoAngularLayoutModule,
|
|
13
|
+
FestoAngularComponentsModule,
|
|
14
|
+
FestoAngularContentModule,
|
|
15
|
+
FestoAngularFormsModule,
|
|
16
|
+
FestoAngularModalsModule,
|
|
17
|
+
FestoAngularSnackbarModule], exports: [FestoAngularLayoutModule,
|
|
18
|
+
FestoAngularComponentsModule,
|
|
19
|
+
FestoAngularContentModule,
|
|
20
|
+
FestoAngularFormsModule,
|
|
21
|
+
FestoAngularModalsModule,
|
|
22
|
+
FestoAngularSnackbarModule] });
|
|
23
|
+
FestoAngularModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularModule, imports: [[
|
|
24
|
+
FestoAngularLayoutModule,
|
|
25
|
+
FestoAngularComponentsModule,
|
|
26
|
+
FestoAngularContentModule,
|
|
27
|
+
FestoAngularFormsModule,
|
|
28
|
+
FestoAngularModalsModule,
|
|
29
|
+
FestoAngularSnackbarModule
|
|
30
|
+
], FestoAngularLayoutModule,
|
|
31
|
+
FestoAngularComponentsModule,
|
|
32
|
+
FestoAngularContentModule,
|
|
33
|
+
FestoAngularFormsModule,
|
|
34
|
+
FestoAngularModalsModule,
|
|
35
|
+
FestoAngularSnackbarModule] });
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FestoAngularModule, decorators: [{
|
|
37
|
+
type: NgModule,
|
|
38
|
+
args: [{
|
|
39
|
+
declarations: [],
|
|
40
|
+
imports: [
|
|
41
|
+
FestoAngularLayoutModule,
|
|
42
|
+
FestoAngularComponentsModule,
|
|
43
|
+
FestoAngularContentModule,
|
|
44
|
+
FestoAngularFormsModule,
|
|
45
|
+
FestoAngularModalsModule,
|
|
46
|
+
FestoAngularSnackbarModule
|
|
47
|
+
],
|
|
48
|
+
exports: [
|
|
49
|
+
FestoAngularLayoutModule,
|
|
50
|
+
FestoAngularComponentsModule,
|
|
51
|
+
FestoAngularContentModule,
|
|
52
|
+
FestoAngularFormsModule,
|
|
53
|
+
FestoAngularModalsModule,
|
|
54
|
+
FestoAngularSnackbarModule
|
|
55
|
+
]
|
|
56
|
+
}]
|
|
57
|
+
}] });
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVzdG8tYW5ndWxhci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9mZXN0by1hbmd1bGFyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOztBQXFCbkYsTUFBTSxPQUFPLGtCQUFrQjs7K0dBQWxCLGtCQUFrQjtnSEFBbEIsa0JBQWtCLFlBaEIzQix3QkFBd0I7UUFDeEIsNEJBQTRCO1FBQzVCLHlCQUF5QjtRQUN6Qix1QkFBdUI7UUFDdkIsd0JBQXdCO1FBQ3hCLDBCQUEwQixhQUcxQix3QkFBd0I7UUFDeEIsNEJBQTRCO1FBQzVCLHlCQUF5QjtRQUN6Qix1QkFBdUI7UUFDdkIsd0JBQXdCO1FBQ3hCLDBCQUEwQjtnSEFHakIsa0JBQWtCLFlBakJwQjtZQUNQLHdCQUF3QjtZQUN4Qiw0QkFBNEI7WUFDNUIseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUN2Qix3QkFBd0I7WUFDeEIsMEJBQTBCO1NBQzNCLEVBRUMsd0JBQXdCO1FBQ3hCLDRCQUE0QjtRQUM1Qix5QkFBeUI7UUFDekIsdUJBQXVCO1FBQ3ZCLHdCQUF3QjtRQUN4QiwwQkFBMEI7MkZBR2pCLGtCQUFrQjtrQkFuQjlCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCx3QkFBd0I7d0JBQ3hCLDRCQUE0Qjt3QkFDNUIseUJBQXlCO3dCQUN6Qix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsMEJBQTBCO3FCQUMzQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asd0JBQXdCO3dCQUN4Qiw0QkFBNEI7d0JBQzVCLHlCQUF5Qjt3QkFDekIsdUJBQXVCO3dCQUN2Qix3QkFBd0I7d0JBQ3hCLDBCQUEwQjtxQkFDM0I7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmVzdG9Bbmd1bGFyTGF5b3V0TW9kdWxlIH0gZnJvbSAnLi9sYXlvdXQvbGF5b3V0Lm1vZHVsZSc7XG5pbXBvcnQgeyBGZXN0b0FuZ3VsYXJDb21wb25lbnRzTW9kdWxlIH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudHMubW9kdWxlJztcbmltcG9ydCB7IEZlc3RvQW5ndWxhckNvbnRlbnRNb2R1bGUgfSBmcm9tICcuL2NvbnRlbnQvY29udGVudC5tb2R1bGUnO1xuaW1wb3J0IHsgRmVzdG9Bbmd1bGFyRm9ybXNNb2R1bGUgfSBmcm9tICcuL2Zvcm1zL2Zvcm1zLm1vZHVsZSc7XG5pbXBvcnQgeyBGZXN0b0FuZ3VsYXJNb2RhbHNNb2R1bGUgfSBmcm9tICcuL2NvbXBvbmVudHMvbW9kYWxzL21vZGFscy5tb2R1bGUnO1xuaW1wb3J0IHsgRmVzdG9Bbmd1bGFyU25hY2tiYXJNb2R1bGUgfSBmcm9tICcuL2NvbXBvbmVudHMvc25hY2tiYXIvc25hY2tiYXIubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgaW1wb3J0czogW1xuICAgIEZlc3RvQW5ndWxhckxheW91dE1vZHVsZSxcbiAgICBGZXN0b0FuZ3VsYXJDb21wb25lbnRzTW9kdWxlLFxuICAgIEZlc3RvQW5ndWxhckNvbnRlbnRNb2R1bGUsXG4gICAgRmVzdG9Bbmd1bGFyRm9ybXNNb2R1bGUsXG4gICAgRmVzdG9Bbmd1bGFyTW9kYWxzTW9kdWxlLFxuICAgIEZlc3RvQW5ndWxhclNuYWNrYmFyTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBGZXN0b0FuZ3VsYXJMYXlvdXRNb2R1bGUsXG4gICAgRmVzdG9Bbmd1bGFyQ29tcG9uZW50c01vZHVsZSxcbiAgICBGZXN0b0FuZ3VsYXJDb250ZW50TW9kdWxlLFxuICAgIEZlc3RvQW5ndWxhckZvcm1zTW9kdWxlLFxuICAgIEZlc3RvQW5ndWxhck1vZGFsc01vZHVsZSxcbiAgICBGZXN0b0FuZ3VsYXJTbmFja2Jhck1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZlc3RvQW5ndWxhck1vZHVsZSB7fVxuIl19
|