structra-ui 0.1.15 → 0.1.17
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/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
- package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
- package/esm2022/app/_utils/estados-br.data.mjs +37 -0
- package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
- package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
- package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +97 -0
- package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
- package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
- package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
- package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
- package/esm2022/app/app-shell/index.mjs +19 -0
- package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
- package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
- package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
- package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
- package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
- package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
- package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
- package/esm2022/app/buttons/index.mjs +2 -0
- package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
- package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
- package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
- package/esm2022/app/data-display/_models/index.mjs +2 -0
- package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
- package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
- package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
- package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
- package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
- package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
- package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
- package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
- package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
- package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
- package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
- package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
- package/esm2022/app/data-display/index.mjs +19 -0
- package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
- package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
- package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
- package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
- package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
- package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
- package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +22 -0
- package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
- package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +200 -0
- package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +47 -0
- package/esm2022/app/dialogs/index.mjs +12 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +38 -0
- package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
- package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
- package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
- package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
- package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
- package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
- package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
- package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
- package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
- package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
- package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
- package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
- package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
- package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
- package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
- package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
- package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
- package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
- package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
- package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
- package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
- package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
- package/esm2022/app/fields/input-fields/index.mjs +22 -0
- package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
- package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
- package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
- package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
- package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
- package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
- package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
- package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
- package/esm2022/app/form-layout/_models/index.mjs +2 -0
- package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
- package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
- package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
- package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
- package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
- package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
- package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
- package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
- package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
- package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
- package/esm2022/app/form-layout/index.mjs +14 -0
- package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
- package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
- package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
- package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
- package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
- package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
- package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
- package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
- package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
- package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
- package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
- package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
- package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
- package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
- package/esm2022/app/menus/index.mjs +11 -0
- package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
- package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
- package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
- package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
- package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
- package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
- package/esm2022/app/overlay/index.mjs +21 -0
- package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
- package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
- package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
- package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
- package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
- package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
- package/esm2022/app/theme/app-theme.service.mjs +49 -0
- package/esm2022/app/theme/index.mjs +2 -0
- package/esm2022/structra-public-api.mjs +18 -0
- package/esm2022/structra-ui.mjs +5 -0
- package/esm2022/structra-version.mjs +3 -0
- package/fesm2022/structra-ui.mjs +8971 -0
- package/fesm2022/structra-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +15 -6
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { NgClass } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChildren, booleanAttribute, computed, forwardRef, inject, } from '@angular/core';
|
|
3
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
4
|
+
import { AppThemeService } from '../../theme';
|
|
5
|
+
import { MenuDividerComponent } from '../menu-divider/menu-divider.component';
|
|
6
|
+
import { MenuGroupComponent } from '../menu-group/menu-group.component';
|
|
7
|
+
import { buildMenuRows, focusableActionCount, } from '../_utils/menu-rows.util';
|
|
8
|
+
import { submenuConnectedPositions } from '../_utils/submenu-connected-positions.util';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
const SUBMENU_OPEN_MS = 220;
|
|
11
|
+
const SUBMENU_CLOSE_MS = 160;
|
|
12
|
+
export class MenuListComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
15
|
+
this.appTheme = inject(AppThemeService);
|
|
16
|
+
this.hostRef = inject((ElementRef));
|
|
17
|
+
this.items = [];
|
|
18
|
+
/** Prefixo dos `id` das opções focáveis (`${menuId}-opt-${focusIndex}`). */
|
|
19
|
+
this.menuId = 'app-menu';
|
|
20
|
+
this.dense = false;
|
|
21
|
+
/** Quando `true`, o menu está dentro de um submenu — seta ← regressa um nível. */
|
|
22
|
+
this.nested = false;
|
|
23
|
+
/**
|
|
24
|
+
* Destaca visualmente o item cuja `id` coincide (navegação actual / rota activa).
|
|
25
|
+
* Só aplica a linhas `kind: 'item'` neste nível.
|
|
26
|
+
*/
|
|
27
|
+
this.selectedItemId = null;
|
|
28
|
+
/**
|
|
29
|
+
* Oculta rótulos e descrições (ex.: sidebar colapsada), mantendo ícones; define `title` nativo para hover.
|
|
30
|
+
*/
|
|
31
|
+
this.compressText = false;
|
|
32
|
+
this.itemSelect = new EventEmitter();
|
|
33
|
+
this.closeRequest = new EventEmitter();
|
|
34
|
+
this.submenuBack = new EventEmitter();
|
|
35
|
+
this.rows = [];
|
|
36
|
+
this.focusableCount = 0;
|
|
37
|
+
/** Índice entre `0` e `focusableCount - 1`, ou `-1` = nenhum realce. */
|
|
38
|
+
this.activeIndex = -1;
|
|
39
|
+
/** Painel de submenu aberto (um por instância de lista). */
|
|
40
|
+
this.openSubmenuKey = null;
|
|
41
|
+
this.submenuOpenTimer = null;
|
|
42
|
+
this.submenuCloseTimer = null;
|
|
43
|
+
this.submenuPositions = submenuConnectedPositions();
|
|
44
|
+
this.panelThemeNgClass = computed(() => {
|
|
45
|
+
const themeClass = this.appTheme.themeClass();
|
|
46
|
+
return {
|
|
47
|
+
'app-library-theme': true,
|
|
48
|
+
[themeClass]: true,
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
overlayPanelClasses() {
|
|
53
|
+
return ['app-library-theme', this.appTheme.themeClass(), 'menu-submenu__cdk-panel'];
|
|
54
|
+
}
|
|
55
|
+
onNestedItemSelect(id) {
|
|
56
|
+
this.closeOpenSubmenu();
|
|
57
|
+
this.itemSelect.emit(id);
|
|
58
|
+
}
|
|
59
|
+
ngOnChanges(changes) {
|
|
60
|
+
if (changes['items']) {
|
|
61
|
+
this.rows = buildMenuRows(this.items ?? []);
|
|
62
|
+
this.focusableCount = focusableActionCount(this.rows);
|
|
63
|
+
if (this.focusableCount === 0) {
|
|
64
|
+
this.activeIndex = -1;
|
|
65
|
+
}
|
|
66
|
+
else if (this.activeIndex >= this.focusableCount) {
|
|
67
|
+
this.activeIndex = -1;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
submenuRowKey(row, index) {
|
|
72
|
+
return row.kind === 'submenu' ? `sm-${String(row.item.id)}-${index}` : '';
|
|
73
|
+
}
|
|
74
|
+
isSubmenuOpen(row, index) {
|
|
75
|
+
return (row.kind === 'submenu' && this.openSubmenuKey === this.submenuRowKey(row, index));
|
|
76
|
+
}
|
|
77
|
+
submenuMenuId(row) {
|
|
78
|
+
if (row.kind !== 'submenu') {
|
|
79
|
+
return this.menuId;
|
|
80
|
+
}
|
|
81
|
+
return `${this.menuId}-sub-${String(row.item.id)}`;
|
|
82
|
+
}
|
|
83
|
+
onRowMouseEnter(row) {
|
|
84
|
+
if (row.kind !== 'action' && row.kind !== 'submenu') {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (row.focusIndex === null) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this.activeIndex = row.focusIndex;
|
|
91
|
+
this.cdr.markForCheck();
|
|
92
|
+
}
|
|
93
|
+
onSubmenuTriggerEnter(row, index) {
|
|
94
|
+
if (row.kind !== 'submenu' || row.item.disabled) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.cancelSubmenuCloseTimer();
|
|
98
|
+
this.cancelSubmenuOpenTimer();
|
|
99
|
+
if (row.focusIndex !== null) {
|
|
100
|
+
this.activeIndex = row.focusIndex;
|
|
101
|
+
}
|
|
102
|
+
const key = this.submenuRowKey(row, index);
|
|
103
|
+
this.submenuOpenTimer = setTimeout(() => {
|
|
104
|
+
this.submenuOpenTimer = null;
|
|
105
|
+
this.openSubmenuKey = key;
|
|
106
|
+
this.queueFocusNestedFirst();
|
|
107
|
+
this.cdr.markForCheck();
|
|
108
|
+
}, SUBMENU_OPEN_MS);
|
|
109
|
+
this.cdr.markForCheck();
|
|
110
|
+
}
|
|
111
|
+
onSubmenuTriggerLeave(_row, index) {
|
|
112
|
+
this.cancelSubmenuOpenTimer();
|
|
113
|
+
this.scheduleSubmenuClose(index);
|
|
114
|
+
}
|
|
115
|
+
onSubmenuPanelEnter() {
|
|
116
|
+
this.cancelSubmenuCloseTimer();
|
|
117
|
+
}
|
|
118
|
+
onSubmenuPanelLeave(row, index) {
|
|
119
|
+
this.scheduleSubmenuClose(index);
|
|
120
|
+
}
|
|
121
|
+
scheduleSubmenuClose(index) {
|
|
122
|
+
this.cancelSubmenuCloseTimer();
|
|
123
|
+
this.submenuCloseTimer = setTimeout(() => {
|
|
124
|
+
this.submenuCloseTimer = null;
|
|
125
|
+
const row = this.rows[index];
|
|
126
|
+
if (row?.kind === 'submenu') {
|
|
127
|
+
const key = this.submenuRowKey(row, index);
|
|
128
|
+
if (this.openSubmenuKey === key) {
|
|
129
|
+
this.openSubmenuKey = null;
|
|
130
|
+
this.cdr.markForCheck();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}, SUBMENU_CLOSE_MS);
|
|
134
|
+
}
|
|
135
|
+
cancelSubmenuOpenTimer() {
|
|
136
|
+
if (this.submenuOpenTimer) {
|
|
137
|
+
clearTimeout(this.submenuOpenTimer);
|
|
138
|
+
this.submenuOpenTimer = null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
cancelSubmenuCloseTimer() {
|
|
142
|
+
if (this.submenuCloseTimer) {
|
|
143
|
+
clearTimeout(this.submenuCloseTimer);
|
|
144
|
+
this.submenuCloseTimer = null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Fecha o submenu deste nível (seta ← no filho ou fecho de irmão). */
|
|
148
|
+
closeOpenSubmenu() {
|
|
149
|
+
this.cancelSubmenuOpenTimer();
|
|
150
|
+
this.cancelSubmenuCloseTimer();
|
|
151
|
+
this.openSubmenuKey = null;
|
|
152
|
+
this.cdr.markForCheck();
|
|
153
|
+
}
|
|
154
|
+
onSubmenuRowClick(ev, row, index) {
|
|
155
|
+
if (row.kind !== 'submenu') {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (row.item.disabled) {
|
|
159
|
+
ev.preventDefault();
|
|
160
|
+
ev.stopPropagation();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
ev.preventDefault();
|
|
164
|
+
const key = this.submenuRowKey(row, index);
|
|
165
|
+
if (this.openSubmenuKey === key) {
|
|
166
|
+
this.closeOpenSubmenu();
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.openSubmenuKey = key;
|
|
170
|
+
this.queueFocusNestedFirst();
|
|
171
|
+
this.cdr.markForCheck();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
onSubmenuOutsideClick(row, index) {
|
|
175
|
+
if (row.kind === 'submenu' && this.isSubmenuOpen(row, index)) {
|
|
176
|
+
this.closeOpenSubmenu();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
openSubmenuForRowAt(index) {
|
|
180
|
+
const row = this.rows[index];
|
|
181
|
+
if (row?.kind !== 'submenu' || row.item.disabled) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
this.openSubmenuKey = this.submenuRowKey(row, index);
|
|
185
|
+
this.queueFocusNestedFirst();
|
|
186
|
+
this.cdr.markForCheck();
|
|
187
|
+
}
|
|
188
|
+
queueFocusNestedFirst() {
|
|
189
|
+
queueMicrotask(() => {
|
|
190
|
+
const nested = this.nestedLists?.last;
|
|
191
|
+
nested?.focusFirstOption();
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/** Primeira opção focável (abertura por teclado). */
|
|
195
|
+
focusFirstOption() {
|
|
196
|
+
if (this.focusableCount === 0) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.activeIndex = 0;
|
|
200
|
+
this.focusActiveDom();
|
|
201
|
+
this.cdr.markForCheck();
|
|
202
|
+
}
|
|
203
|
+
onItemClick(ev, item) {
|
|
204
|
+
if (item.disabled || item.loading) {
|
|
205
|
+
ev.preventDefault();
|
|
206
|
+
ev.stopPropagation();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
ev.preventDefault();
|
|
210
|
+
this.closeOpenSubmenu();
|
|
211
|
+
this.itemSelect.emit(item.id);
|
|
212
|
+
}
|
|
213
|
+
optionId(focusIndex) {
|
|
214
|
+
return `${this.menuId}-opt-${focusIndex}`;
|
|
215
|
+
}
|
|
216
|
+
isActiveRow(row) {
|
|
217
|
+
if (this.activeIndex < 0) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
if (row.kind === 'action' || row.kind === 'submenu') {
|
|
221
|
+
return row.focusIndex !== null && row.focusIndex === this.activeIndex;
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
/** Realce de selecção persistente (ex.: item de navegação activo). */
|
|
226
|
+
isRowSelected(row) {
|
|
227
|
+
if (this.selectedItemId == null) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
if (row.kind === 'action') {
|
|
231
|
+
return row.item.id === this.selectedItemId;
|
|
232
|
+
}
|
|
233
|
+
if (row.kind === 'submenu') {
|
|
234
|
+
return row.item.id === this.selectedItemId;
|
|
235
|
+
}
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
resetHighlight() {
|
|
239
|
+
this.activeIndex = -1;
|
|
240
|
+
this.cdr.markForCheck();
|
|
241
|
+
}
|
|
242
|
+
onMenuSurfaceLeave() {
|
|
243
|
+
if (this.openSubmenuKey !== null) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
this.activeIndex = -1;
|
|
247
|
+
this.cdr.markForCheck();
|
|
248
|
+
}
|
|
249
|
+
focusActiveDom() {
|
|
250
|
+
if (this.activeIndex < 0) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const id = this.optionId(this.activeIndex);
|
|
254
|
+
const el = this.hostRef.nativeElement.querySelector(`#${CSS.escape(id)}`);
|
|
255
|
+
el?.focus({ preventScroll: true });
|
|
256
|
+
}
|
|
257
|
+
onKeydown(ev) {
|
|
258
|
+
if (ev.key === 'ArrowLeft' && this.nested) {
|
|
259
|
+
ev.preventDefault();
|
|
260
|
+
this.submenuBack.emit();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (this.focusableCount === 0) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const n = this.focusableCount;
|
|
267
|
+
switch (ev.key) {
|
|
268
|
+
case 'ArrowDown':
|
|
269
|
+
ev.preventDefault();
|
|
270
|
+
if (this.activeIndex < 0) {
|
|
271
|
+
this.activeIndex = 0;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.activeIndex = (this.activeIndex + 1) % n;
|
|
275
|
+
}
|
|
276
|
+
this.focusActiveDom();
|
|
277
|
+
this.cdr.markForCheck();
|
|
278
|
+
break;
|
|
279
|
+
case 'ArrowUp':
|
|
280
|
+
ev.preventDefault();
|
|
281
|
+
if (this.activeIndex < 0) {
|
|
282
|
+
this.activeIndex = n - 1;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
this.activeIndex = (this.activeIndex - 1 + n) % n;
|
|
286
|
+
}
|
|
287
|
+
this.focusActiveDom();
|
|
288
|
+
this.cdr.markForCheck();
|
|
289
|
+
break;
|
|
290
|
+
case 'Home':
|
|
291
|
+
ev.preventDefault();
|
|
292
|
+
this.activeIndex = 0;
|
|
293
|
+
this.focusActiveDom();
|
|
294
|
+
this.cdr.markForCheck();
|
|
295
|
+
break;
|
|
296
|
+
case 'End':
|
|
297
|
+
ev.preventDefault();
|
|
298
|
+
this.activeIndex = n - 1;
|
|
299
|
+
this.focusActiveDom();
|
|
300
|
+
this.cdr.markForCheck();
|
|
301
|
+
break;
|
|
302
|
+
case 'ArrowRight': {
|
|
303
|
+
if (this.activeIndex < 0) {
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
let handled = false;
|
|
307
|
+
for (let i = 0; i < this.rows.length; i++) {
|
|
308
|
+
const r = this.rows[i];
|
|
309
|
+
if (r.kind === 'submenu' &&
|
|
310
|
+
r.focusIndex === this.activeIndex &&
|
|
311
|
+
!r.item.disabled) {
|
|
312
|
+
ev.preventDefault();
|
|
313
|
+
this.openSubmenuForRowAt(i);
|
|
314
|
+
handled = true;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (!handled) {
|
|
319
|
+
/* deixar propagar para o campo, se necessário */
|
|
320
|
+
}
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
case 'Enter':
|
|
324
|
+
case ' ': {
|
|
325
|
+
ev.preventDefault();
|
|
326
|
+
for (let i = 0; i < this.rows.length; i++) {
|
|
327
|
+
const r = this.rows[i];
|
|
328
|
+
if (r.kind !== 'action' && r.kind !== 'submenu') {
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (r.focusIndex !== this.activeIndex || r.focusIndex === null) {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
if (r.kind === 'action') {
|
|
335
|
+
if (r.item.disabled || r.item.loading) {
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
this.itemSelect.emit(r.item.id);
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
if (r.item.disabled) {
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
this.openSubmenuForRowAt(i);
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
case 'Escape':
|
|
350
|
+
ev.preventDefault();
|
|
351
|
+
this.closeRequest.emit();
|
|
352
|
+
break;
|
|
353
|
+
default:
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MenuListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
358
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MenuListComponent, isStandalone: true, selector: "app-menu-list", inputs: { items: "items", menuId: "menuId", dense: ["dense", "dense", booleanAttribute], nested: ["nested", "nested", booleanAttribute], selectedItemId: "selectedItemId", compressText: ["compressText", "compressText", booleanAttribute] }, outputs: { itemSelect: "itemSelect", closeRequest: "closeRequest", submenuBack: "submenuBack" }, host: { listeners: { "keydown": "onKeydown($event)" } }, viewQueries: [{ propertyName: "nestedLists", predicate: MenuListComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"menu-list\"\n [class.menu-list--dense]=\"dense\"\n [class.menu-list--compress-text]=\"compressText\"\n role=\"menu\"\n [attr.aria-labelledby]=\"null\"\n tabindex=\"-1\"\n (mouseleave)=\"onMenuSurfaceLeave()\"\n>\n @for (row of rows; track idx; let idx = $index) {\n @switch (row.kind) {\n @case ('divider') {\n <app-menu-divider />\n }\n @case ('group') {\n <app-menu-group [label]=\"row.label\" [hideLabel]=\"compressText\" />\n }\n @case ('submenu') {\n <div\n class=\"menu-list__submenu-wrap\"\n cdkOverlayOrigin\n #subOrigin=\"cdkOverlayOrigin\"\n (mouseenter)=\"onSubmenuTriggerEnter(row, idx)\"\n (mouseleave)=\"onSubmenuTriggerLeave(row, idx)\"\n >\n <div\n class=\"menu-list__option menu-list__option--submenu\"\n role=\"menuitem\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-expanded]=\"isSubmenuOpen(row, idx)\"\n [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onSubmenuRowClick($event, row, idx)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\n @if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n <span class=\"menu-list__submenu-chevron\" aria-hidden=\"true\">\u203A</span>\n </div>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"subOrigin\"\n [cdkConnectedOverlayOpen]=\"isSubmenuOpen(row, idx)\"\n [cdkConnectedOverlayPositions]=\"submenuPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayMinWidth]=\"200\"\n (overlayOutsideClick)=\"onSubmenuOutsideClick(row, idx)\"\n >\n <div\n class=\"menu-submenu__panel\"\n [ngClass]=\"panelThemeNgClass()\"\n (mouseenter)=\"onSubmenuPanelEnter()\"\n (mouseleave)=\"onSubmenuPanelLeave(row, idx)\"\n (click)=\"$event.stopPropagation()\"\n >\n <app-menu-list\n [items]=\"row.item.items\"\n [menuId]=\"submenuMenuId(row)\"\n [nested]=\"true\"\n [dense]=\"dense\"\n [compressText]=\"compressText\"\n [selectedItemId]=\"selectedItemId\"\n (itemSelect)=\"onNestedItemSelect($event)\"\n (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"closeOpenSubmenu()\"\n />\n </div>\n </ng-template>\n </div>\n }\n @case ('action') {\n <div\n class=\"menu-list__option\"\n role=\"menuitem\"\n [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\"\n [attr.aria-busy]=\"row.item.loading ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--loading]=\"row.item.loading\"\n [class.menu-list__option--danger]=\"row.item.danger\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onItemClick($event, row.item)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\n @if (row.item.loading) {\n <span class=\"menu-list__icon menu-list__icon--spin\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-spinner\"></i>\n </span>\n } @else if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n </div>\n }\n }\n }\n</div>\n", styles: ["@charset \"UTF-8\";@keyframes app-sidebar-nav-reveal-in{0%{opacity:0;transform:translate3d(-.45rem,0,0)}to{opacity:1;transform:translateZ(0)}}:host{display:block;min-width:0;box-sizing:border-box}.menu-list{background:var(--app-color-surface, #ffffff);border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));border-radius:10px;box-shadow:0 10px 28px -14px #0f172a29;max-height:min(70vh,22rem);overflow-x:hidden;overflow-y:auto;display:flex;flex-direction:column;gap:.1rem;padding:.45rem 0;outline:none}.menu-list--dense{padding:.2rem 0;gap:0}.menu-list__submenu-wrap{position:relative;display:block}.menu-list__option{display:flex;align-items:center;box-sizing:border-box;gap:.5rem;margin:0 .25rem;padding:.48rem .6rem;border-radius:8px;cursor:pointer;color:var(--app-color-text-primary, #1a2f45);background:transparent;border:1px solid transparent;text-align:left;font:inherit;line-height:1.25}.menu-list__option:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:1px}.menu-list__option:hover:not(.menu-list__option--disabled):not(.menu-list__option--loading){background:color-mix(in srgb,var(--app-color-primary) 6%,transparent)}.menu-list__option.menu-list__option--active:not(.menu-list__option--disabled):not(.menu-list__option--loading){background:color-mix(in srgb,var(--app-color-primary) 7%,transparent);border-color:transparent;box-shadow:none}.menu-list__option.menu-list__option--disabled{cursor:not-allowed;color:var(--app-color-text-muted, #6b8299);background:transparent;opacity:.72}.menu-list__option.menu-list__option--loading{cursor:wait;opacity:.92;pointer-events:none}.menu-list__option.menu-list__option--danger:not(.menu-list__option--disabled):not(.menu-list__option--loading){color:var(--app-color-error, #b91c1c)}.menu-list__option.menu-list__option--danger:not(.menu-list__option--disabled):not(.menu-list__option--loading):hover,.menu-list__option.menu-list__option--danger:not(.menu-list__option--disabled):not(.menu-list__option--loading).menu-list__option--active{background:var(--app-color-error-bg-subtle, rgba(185, 28, 28, .12));border-color:transparent;box-shadow:inset 2px 0 0 0 var(--app-color-error-border, #dc2626)}.menu-list__option--submenu{padding-right:.35rem}.menu-list__option--selected:not(.menu-list__option--disabled){background:color-mix(in srgb,var(--app-color-primary) 9%,transparent);border-radius:8px;border-color:transparent;box-shadow:inset 2px 0 0 0 var(--app-color-primary, #2b7fd9)}.menu-list__option--selected:not(.menu-list__option--disabled) .menu-list__label{color:var(--app-color-primary, #2b7fd9);font-weight:600}.menu-list__option--selected:not(.menu-list__option--disabled) .menu-list__icon{color:var(--app-color-primary, #2b7fd9)}.menu-list--compress-text .menu-list__label,.menu-list--compress-text .menu-list__description{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.menu-list--compress-text .menu-list__text,.menu-list--compress-text .menu-list__submenu-chevron{display:none}.menu-list--compress-text .menu-list__submenu-wrap{width:100%}.menu-list--compress-text .menu-list__option{justify-content:center;align-items:center;text-align:center;width:calc(100% - .5rem);max-width:100%;box-sizing:border-box;margin-left:.25rem;margin-right:.25rem;padding:.5rem .35rem}.menu-list--compress-text .menu-list__option--submenu{padding-left:.35rem;padding-right:.35rem}.menu-list--compress-text .menu-list__icon{flex:0 0 auto;width:auto;min-width:1.75rem;display:inline-flex;align-items:center;justify-content:center;padding-top:0}.menu-list__submenu-chevron{flex:0 0 auto;margin-left:auto;padding-left:.35rem;font-size:1rem;line-height:1;color:var(--app-color-text-muted, #6b8299);opacity:.85}.menu-list__icon{flex:0 0 auto;width:1.25rem;height:1.25rem;min-height:1.25rem;display:inline-flex;align-items:center;justify-content:center;text-align:center;color:var(--app-color-text-secondary, #5a7fa3);line-height:1}.menu-list__icon i{display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1;font-size:.95rem}.menu-list__option--disabled .menu-list__icon{opacity:.55}.menu-list__icon--spin i{animation:menu-list-spin .8s linear infinite}.menu-list__text{display:flex;flex-direction:column;gap:.1rem;min-width:0;flex:1}.menu-list__label{font-size:.875rem;font-weight:500;line-height:1.25rem;display:inline-flex;align-items:center;min-height:1.25rem}.menu-list__description{font-size:.75rem;color:var(--app-color-text-muted, #6b8299);line-height:1.3}.menu-list:not(.menu-list--compress-text){animation:app-sidebar-nav-reveal-in .45s cubic-bezier(.16,1,.32,1) both}@media (prefers-reduced-motion: reduce){.menu-list:not(.menu-list--compress-text){animation:none}}.menu-submenu__panel{box-sizing:border-box;min-width:0;padding:0;background:transparent;border:none;box-shadow:none;border-radius:10px;overflow:hidden}@keyframes menu-list-spin{to{transform:rotate(360deg)}}:host ::ng-deep .menu-submenu__cdk-panel{background:transparent;box-shadow:none;border-radius:10px}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => MenuListComponent), selector: "app-menu-list", inputs: ["items", "menuId", "dense", "nested", "selectedItemId", "compressText"], outputs: ["itemSelect", "closeRequest", "submenuBack"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => CdkConnectedOverlay), selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i0.forwardRef(() => CdkOverlayOrigin), selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i0.forwardRef(() => MenuDividerComponent), selector: "app-menu-divider" }, { kind: "component", type: i0.forwardRef(() => MenuGroupComponent), selector: "app-menu-group", inputs: ["label", "hideLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
359
|
+
}
|
|
360
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MenuListComponent, decorators: [{
|
|
361
|
+
type: Component,
|
|
362
|
+
args: [{ selector: 'app-menu-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
363
|
+
NgClass,
|
|
364
|
+
forwardRef(() => MenuListComponent),
|
|
365
|
+
CdkConnectedOverlay,
|
|
366
|
+
CdkOverlayOrigin,
|
|
367
|
+
MenuDividerComponent,
|
|
368
|
+
MenuGroupComponent,
|
|
369
|
+
], template: "<div\n class=\"menu-list\"\n [class.menu-list--dense]=\"dense\"\n [class.menu-list--compress-text]=\"compressText\"\n role=\"menu\"\n [attr.aria-labelledby]=\"null\"\n tabindex=\"-1\"\n (mouseleave)=\"onMenuSurfaceLeave()\"\n>\n @for (row of rows; track idx; let idx = $index) {\n @switch (row.kind) {\n @case ('divider') {\n <app-menu-divider />\n }\n @case ('group') {\n <app-menu-group [label]=\"row.label\" [hideLabel]=\"compressText\" />\n }\n @case ('submenu') {\n <div\n class=\"menu-list__submenu-wrap\"\n cdkOverlayOrigin\n #subOrigin=\"cdkOverlayOrigin\"\n (mouseenter)=\"onSubmenuTriggerEnter(row, idx)\"\n (mouseleave)=\"onSubmenuTriggerLeave(row, idx)\"\n >\n <div\n class=\"menu-list__option menu-list__option--submenu\"\n role=\"menuitem\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-expanded]=\"isSubmenuOpen(row, idx)\"\n [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onSubmenuRowClick($event, row, idx)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\n @if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n <span class=\"menu-list__submenu-chevron\" aria-hidden=\"true\">\u203A</span>\n </div>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"subOrigin\"\n [cdkConnectedOverlayOpen]=\"isSubmenuOpen(row, idx)\"\n [cdkConnectedOverlayPositions]=\"submenuPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayMinWidth]=\"200\"\n (overlayOutsideClick)=\"onSubmenuOutsideClick(row, idx)\"\n >\n <div\n class=\"menu-submenu__panel\"\n [ngClass]=\"panelThemeNgClass()\"\n (mouseenter)=\"onSubmenuPanelEnter()\"\n (mouseleave)=\"onSubmenuPanelLeave(row, idx)\"\n (click)=\"$event.stopPropagation()\"\n >\n <app-menu-list\n [items]=\"row.item.items\"\n [menuId]=\"submenuMenuId(row)\"\n [nested]=\"true\"\n [dense]=\"dense\"\n [compressText]=\"compressText\"\n [selectedItemId]=\"selectedItemId\"\n (itemSelect)=\"onNestedItemSelect($event)\"\n (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"closeOpenSubmenu()\"\n />\n </div>\n </ng-template>\n </div>\n }\n @case ('action') {\n <div\n class=\"menu-list__option\"\n role=\"menuitem\"\n [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\"\n [attr.aria-busy]=\"row.item.loading ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--loading]=\"row.item.loading\"\n [class.menu-list__option--danger]=\"row.item.danger\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onItemClick($event, row.item)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\n @if (row.item.loading) {\n <span class=\"menu-list__icon menu-list__icon--spin\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-spinner\"></i>\n </span>\n } @else if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n </div>\n }\n }\n }\n</div>\n", styles: ["@charset \"UTF-8\";@keyframes app-sidebar-nav-reveal-in{0%{opacity:0;transform:translate3d(-.45rem,0,0)}to{opacity:1;transform:translateZ(0)}}:host{display:block;min-width:0;box-sizing:border-box}.menu-list{background:var(--app-color-surface, #ffffff);border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));border-radius:10px;box-shadow:0 10px 28px -14px #0f172a29;max-height:min(70vh,22rem);overflow-x:hidden;overflow-y:auto;display:flex;flex-direction:column;gap:.1rem;padding:.45rem 0;outline:none}.menu-list--dense{padding:.2rem 0;gap:0}.menu-list__submenu-wrap{position:relative;display:block}.menu-list__option{display:flex;align-items:center;box-sizing:border-box;gap:.5rem;margin:0 .25rem;padding:.48rem .6rem;border-radius:8px;cursor:pointer;color:var(--app-color-text-primary, #1a2f45);background:transparent;border:1px solid transparent;text-align:left;font:inherit;line-height:1.25}.menu-list__option:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:1px}.menu-list__option:hover:not(.menu-list__option--disabled):not(.menu-list__option--loading){background:color-mix(in srgb,var(--app-color-primary) 6%,transparent)}.menu-list__option.menu-list__option--active:not(.menu-list__option--disabled):not(.menu-list__option--loading){background:color-mix(in srgb,var(--app-color-primary) 7%,transparent);border-color:transparent;box-shadow:none}.menu-list__option.menu-list__option--disabled{cursor:not-allowed;color:var(--app-color-text-muted, #6b8299);background:transparent;opacity:.72}.menu-list__option.menu-list__option--loading{cursor:wait;opacity:.92;pointer-events:none}.menu-list__option.menu-list__option--danger:not(.menu-list__option--disabled):not(.menu-list__option--loading){color:var(--app-color-error, #b91c1c)}.menu-list__option.menu-list__option--danger:not(.menu-list__option--disabled):not(.menu-list__option--loading):hover,.menu-list__option.menu-list__option--danger:not(.menu-list__option--disabled):not(.menu-list__option--loading).menu-list__option--active{background:var(--app-color-error-bg-subtle, rgba(185, 28, 28, .12));border-color:transparent;box-shadow:inset 2px 0 0 0 var(--app-color-error-border, #dc2626)}.menu-list__option--submenu{padding-right:.35rem}.menu-list__option--selected:not(.menu-list__option--disabled){background:color-mix(in srgb,var(--app-color-primary) 9%,transparent);border-radius:8px;border-color:transparent;box-shadow:inset 2px 0 0 0 var(--app-color-primary, #2b7fd9)}.menu-list__option--selected:not(.menu-list__option--disabled) .menu-list__label{color:var(--app-color-primary, #2b7fd9);font-weight:600}.menu-list__option--selected:not(.menu-list__option--disabled) .menu-list__icon{color:var(--app-color-primary, #2b7fd9)}.menu-list--compress-text .menu-list__label,.menu-list--compress-text .menu-list__description{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.menu-list--compress-text .menu-list__text,.menu-list--compress-text .menu-list__submenu-chevron{display:none}.menu-list--compress-text .menu-list__submenu-wrap{width:100%}.menu-list--compress-text .menu-list__option{justify-content:center;align-items:center;text-align:center;width:calc(100% - .5rem);max-width:100%;box-sizing:border-box;margin-left:.25rem;margin-right:.25rem;padding:.5rem .35rem}.menu-list--compress-text .menu-list__option--submenu{padding-left:.35rem;padding-right:.35rem}.menu-list--compress-text .menu-list__icon{flex:0 0 auto;width:auto;min-width:1.75rem;display:inline-flex;align-items:center;justify-content:center;padding-top:0}.menu-list__submenu-chevron{flex:0 0 auto;margin-left:auto;padding-left:.35rem;font-size:1rem;line-height:1;color:var(--app-color-text-muted, #6b8299);opacity:.85}.menu-list__icon{flex:0 0 auto;width:1.25rem;height:1.25rem;min-height:1.25rem;display:inline-flex;align-items:center;justify-content:center;text-align:center;color:var(--app-color-text-secondary, #5a7fa3);line-height:1}.menu-list__icon i{display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1;font-size:.95rem}.menu-list__option--disabled .menu-list__icon{opacity:.55}.menu-list__icon--spin i{animation:menu-list-spin .8s linear infinite}.menu-list__text{display:flex;flex-direction:column;gap:.1rem;min-width:0;flex:1}.menu-list__label{font-size:.875rem;font-weight:500;line-height:1.25rem;display:inline-flex;align-items:center;min-height:1.25rem}.menu-list__description{font-size:.75rem;color:var(--app-color-text-muted, #6b8299);line-height:1.3}.menu-list:not(.menu-list--compress-text){animation:app-sidebar-nav-reveal-in .45s cubic-bezier(.16,1,.32,1) both}@media (prefers-reduced-motion: reduce){.menu-list:not(.menu-list--compress-text){animation:none}}.menu-submenu__panel{box-sizing:border-box;min-width:0;padding:0;background:transparent;border:none;box-shadow:none;border-radius:10px;overflow:hidden}@keyframes menu-list-spin{to{transform:rotate(360deg)}}:host ::ng-deep .menu-submenu__cdk-panel{background:transparent;box-shadow:none;border-radius:10px}\n"] }]
|
|
370
|
+
}], propDecorators: { items: [{
|
|
371
|
+
type: Input,
|
|
372
|
+
args: [{ required: true }]
|
|
373
|
+
}], menuId: [{
|
|
374
|
+
type: Input
|
|
375
|
+
}], dense: [{
|
|
376
|
+
type: Input,
|
|
377
|
+
args: [{ transform: booleanAttribute }]
|
|
378
|
+
}], nested: [{
|
|
379
|
+
type: Input,
|
|
380
|
+
args: [{ transform: booleanAttribute }]
|
|
381
|
+
}], selectedItemId: [{
|
|
382
|
+
type: Input
|
|
383
|
+
}], compressText: [{
|
|
384
|
+
type: Input,
|
|
385
|
+
args: [{ transform: booleanAttribute }]
|
|
386
|
+
}], itemSelect: [{
|
|
387
|
+
type: Output
|
|
388
|
+
}], closeRequest: [{
|
|
389
|
+
type: Output
|
|
390
|
+
}], submenuBack: [{
|
|
391
|
+
type: Output
|
|
392
|
+
}], nestedLists: [{
|
|
393
|
+
type: ViewChildren,
|
|
394
|
+
args: [MenuListComponent]
|
|
395
|
+
}], onKeydown: [{
|
|
396
|
+
type: HostListener,
|
|
397
|
+
args: ['keydown', ['$event']]
|
|
398
|
+
}] } });
|
|
399
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbWVudXMvbWVudS1saXN0L21lbnUtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21lbnVzL21lbnUtbGlzdC9tZW51LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBRUwsYUFBYSxFQUNiLG9CQUFvQixHQUNyQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQUV2RixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFpQjdCLE1BQU0sT0FBTyxpQkFBaUI7SUFmOUI7UUFnQm1CLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGVB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QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFbkIsVUFBVTtzQkFBNUIsTUFBTTtnQkFDWSxZQUFZO3NCQUE5QixNQUFNO2dCQUNZLFdBQVc7c0JBQTdCLE1BQU07Z0JBR0MsV0FBVztzQkFEbEIsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBb1EvQixTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRyZW4sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGNvbXB1dGVkLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB0eXBlIHsgTWVudUl0ZW1BY3Rpb24sIE1lbnVOb2RlSXRlbSB9IGZyb20gJy4uL19tb2RlbHMvbWVudS1pdGVtLm1vZGVsJztcbmltcG9ydCB7IEFwcFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3RoZW1lJztcbmltcG9ydCB7IE1lbnVEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS1kaXZpZGVyL21lbnUtZGl2aWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudUdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS1ncm91cC9tZW51LWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICB0eXBlIE1lbnVSb3csXG4gIGJ1aWxkTWVudVJvd3MsXG4gIGZvY3VzYWJsZUFjdGlvbkNvdW50LFxufSBmcm9tICcuLi9fdXRpbHMvbWVudS1yb3dzLnV0aWwnO1xuaW1wb3J0IHsgc3VibWVudUNvbm5lY3RlZFBvc2l0aW9ucyB9IGZyb20gJy4uL191dGlscy9zdWJtZW51LWNvbm5lY3RlZC1wb3NpdGlvbnMudXRpbCc7XG5cbmNvbnN0IFNVQk1FTlVfT1BFTl9NUyA9IDIyMDtcbmNvbnN0IFNVQk1FTlVfQ0xPU0VfTVMgPSAxNjA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1tZW51LWxpc3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVudS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21lbnUtbGlzdC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBmb3J3YXJkUmVmKCgpID0+IE1lbnVMaXN0Q29tcG9uZW50KSxcbiAgICBDZGtDb25uZWN0ZWRPdmVybGF5LFxuICAgIENka092ZXJsYXlPcmlnaW4sXG4gICAgTWVudURpdmlkZXJDb21wb25lbnQsXG4gICAgTWVudUdyb3VwQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51TGlzdENvbXBvbmVudDxUID0gc3RyaW5nPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBUaGVtZSA9IGluamVjdChBcHBUaGVtZVNlcnZpY2UpO1xuICByZWFkb25seSBob3N0UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBpdGVtczogcmVhZG9ubHkgTWVudU5vZGVJdGVtPFQ+W10gPSBbXTtcblxuICAvKiogUHJlZml4byBkb3MgYGlkYCBkYXMgb3DDp8O1ZXMgZm9jw6F2ZWlzIChgJHttZW51SWR9LW9wdC0ke2ZvY3VzSW5kZXh9YCkuICovXG4gIEBJbnB1dCgpIG1lbnVJZCA9ICdhcHAtbWVudSc7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlbnNlID0gZmFsc2U7XG5cbiAgLyoqIFF1YW5kbyBgdHJ1ZWAsIG8gbWVudSBlc3TDoSBkZW50cm8gZGUgdW0gc3VibWVudSDigJQgc2V0YSDihpAgcmVncmVzc2EgdW0gbsOtdmVsLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbmVzdGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERlc3RhY2EgdmlzdWFsbWVudGUgbyBpdGVtIGN1amEgYGlkYCBjb2luY2lkZSAobmF2ZWdhw6fDo28gYWN0dWFsIC8gcm90YSBhY3RpdmEpLlxuICAgKiBTw7MgYXBsaWNhIGEgbGluaGFzIGBraW5kOiAnaXRlbSdgIG5lc3RlIG7DrXZlbC5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbUlkOiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIE9jdWx0YSByw7N0dWxvcyBlIGRlc2NyacOnw7VlcyAoZXguOiBzaWRlYmFyIGNvbGFwc2FkYSksIG1hbnRlbmRvIMOtY29uZXM7IGRlZmluZSBgdGl0bGVgIG5hdGl2byBwYXJhIGhvdmVyLlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbXByZXNzVGV4dCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBpdGVtU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY2xvc2VSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc3VibWVudUJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZHJlbihNZW51TGlzdENvbXBvbmVudClcbiAgcHJpdmF0ZSBuZXN0ZWRMaXN0cz86IFF1ZXJ5TGlzdDxNZW51TGlzdENvbXBvbmVudDxUPj47XG5cbiAgcm93czogTWVudVJvdzxUPltdID0gW107XG4gIHByaXZhdGUgZm9jdXNhYmxlQ291bnQgPSAwO1xuXG4gIC8qKiDDjW5kaWNlIGVudHJlIGAwYCBlIGBmb2N1c2FibGVDb3VudCAtIDFgLCBvdSBgLTFgID0gbmVuaHVtIHJlYWxjZS4gKi9cbiAgYWN0aXZlSW5kZXggPSAtMTtcblxuICAvKiogUGFpbmVsIGRlIHN1Ym1lbnUgYWJlcnRvICh1bSBwb3IgaW5zdMOibmNpYSBkZSBsaXN0YSkuICovXG4gIG9wZW5TdWJtZW51S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHN1Ym1lbnVPcGVuVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3VibWVudUNsb3NlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcmVhZG9ubHkgc3VibWVudVBvc2l0aW9ucyA9IHN1Ym1lbnVDb25uZWN0ZWRQb3NpdGlvbnMoKTtcblxuICByZWFkb25seSBwYW5lbFRoZW1lTmdDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0aGVtZUNsYXNzID0gdGhpcy5hcHBUaGVtZS50aGVtZUNsYXNzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICdhcHAtbGlicmFyeS10aGVtZSc6IHRydWUsXG4gICAgICBbdGhlbWVDbGFzc106IHRydWUsXG4gICAgfTtcbiAgfSk7XG5cbiAgb3ZlcmxheVBhbmVsQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnYXBwLWxpYnJhcnktdGhlbWUnLCB0aGlzLmFwcFRoZW1lLnRoZW1lQ2xhc3MoKSwgJ21lbnUtc3VibWVudV9fY2RrLXBhbmVsJ107XG4gIH1cblxuICBvbk5lc3RlZEl0ZW1TZWxlY3QoaWQ6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlT3BlblN1Ym1lbnUoKTtcbiAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChpZCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10pIHtcbiAgICAgIHRoaXMucm93cyA9IGJ1aWxkTWVudVJvd3ModGhpcy5pdGVtcyA/PyBbXSk7XG4gICAgICB0aGlzLmZvY3VzYWJsZUNvdW50ID0gZm9jdXNhYmxlQWN0aW9uQ291bnQodGhpcy5yb3dzKTtcbiAgICAgIGlmICh0aGlzLmZvY3VzYWJsZUNvdW50ID09PSAwKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVJbmRleCA+PSB0aGlzLmZvY3VzYWJsZUNvdW50KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdWJtZW51Um93S2V5KHJvdzogTWVudVJvdzxUPiwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvdy5raW5kID09PSAnc3VibWVudScgPyBgc20tJHtTdHJpbmcocm93Lml0ZW0uaWQpfS0ke2luZGV4fWAgOiAnJztcbiAgfVxuXG4gIGlzU3VibWVudU9wZW4ocm93OiBNZW51Um93PFQ+LCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJvdy5raW5kID09PSAnc3VibWVudScgJiYgdGhpcy5vcGVuU3VibWVudUtleSA9PT0gdGhpcy5zdWJtZW51Um93S2V5KHJvdywgaW5kZXgpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1lbnVNZW51SWQocm93OiBNZW51Um93PFQ+KTogc3RyaW5nIHtcbiAgICBpZiAocm93LmtpbmQgIT09ICdzdWJtZW51Jykge1xuICAgICAgcmV0dXJuIHRoaXMubWVudUlkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5tZW51SWR9LXN1Yi0ke1N0cmluZyhyb3cuaXRlbS5pZCl9YDtcbiAgfVxuXG4gIG9uUm93TW91c2VFbnRlcihyb3c6IE1lbnVSb3c8VD4pOiB2b2lkIHtcbiAgICBpZiAocm93LmtpbmQgIT09ICdhY3Rpb24nICYmIHJvdy5raW5kICE9PSAnc3VibWVudScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJvdy5mb2N1c0luZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlSW5kZXggPSByb3cuZm9jdXNJbmRleDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uU3VibWVudVRyaWdnZXJFbnRlcihyb3c6IE1lbnVSb3c8VD4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocm93LmtpbmQgIT09ICdzdWJtZW51JyB8fCByb3cuaXRlbS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNhbmNlbFN1Ym1lbnVDbG9zZVRpbWVyKCk7XG4gICAgdGhpcy5jYW5jZWxTdWJtZW51T3BlblRpbWVyKCk7XG4gICAgaWYgKHJvdy5mb2N1c0luZGV4ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gcm93LmZvY3VzSW5kZXg7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRoaXMuc3VibWVudVJvd0tleShyb3csIGluZGV4KTtcbiAgICB0aGlzLnN1Ym1lbnVPcGVuVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3VibWVudU9wZW5UaW1lciA9IG51bGw7XG4gICAgICB0aGlzLm9wZW5TdWJtZW51S2V5ID0ga2V5O1xuICAgICAgdGhpcy5xdWV1ZUZvY3VzTmVzdGVkRmlyc3QoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIFNVQk1FTlVfT1BFTl9NUyk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblN1Ym1lbnVUcmlnZ2VyTGVhdmUoX3JvdzogTWVudVJvdzxUPiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsU3VibWVudU9wZW5UaW1lcigpO1xuICAgIHRoaXMuc2NoZWR1bGVTdWJtZW51Q2xvc2UoaW5kZXgpO1xuICB9XG5cbiAgb25TdWJtZW51UGFuZWxFbnRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbFN1Ym1lbnVDbG9zZVRpbWVyKCk7XG4gIH1cblxuICBvblN1Ym1lbnVQYW5lbExlYXZlKHJvdzogTWVudVJvdzxUPiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGVTdWJtZW51Q2xvc2UoaW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVN1Ym1lbnVDbG9zZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxTdWJtZW51Q2xvc2VUaW1lcigpO1xuICAgIHRoaXMuc3VibWVudUNsb3NlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3VibWVudUNsb3NlVGltZXIgPSBudWxsO1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5yb3dzW2luZGV4XTtcbiAgICAgIGlmIChyb3c/LmtpbmQgPT09ICdzdWJtZW51Jykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN1Ym1lbnVSb3dLZXkocm93LCBpbmRleCk7XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdWJtZW51S2V5ID09PSBrZXkpIHtcbiAgICAgICAgICB0aGlzLm9wZW5TdWJtZW51S2V5ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFNVQk1FTlVfQ0xPU0VfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxTdWJtZW51T3BlblRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN1Ym1lbnVPcGVuVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnN1Ym1lbnVPcGVuVGltZXIpO1xuICAgICAgdGhpcy5zdWJtZW51T3BlblRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbFN1Ym1lbnVDbG9zZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN1Ym1lbnVDbG9zZVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdWJtZW51Q2xvc2VUaW1lcik7XG4gICAgICB0aGlzLnN1Ym1lbnVDbG9zZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogRmVjaGEgbyBzdWJtZW51IGRlc3RlIG7DrXZlbCAoc2V0YSDihpAgbm8gZmlsaG8gb3UgZmVjaG8gZGUgaXJtw6NvKS4gKi9cbiAgY2xvc2VPcGVuU3VibWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbFN1Ym1lbnVPcGVuVGltZXIoKTtcbiAgICB0aGlzLmNhbmNlbFN1Ym1lbnVDbG9zZVRpbWVyKCk7XG4gICAgdGhpcy5vcGVuU3VibWVudUtleSA9IG51bGw7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblN1Ym1lbnVSb3dDbGljayhldjogTW91c2VFdmVudCwgcm93OiBNZW51Um93PFQ+LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHJvdy5raW5kICE9PSAnc3VibWVudScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJvdy5pdGVtLmRpc2FibGVkKSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zdWJtZW51Um93S2V5KHJvdywgaW5kZXgpO1xuICAgIGlmICh0aGlzLm9wZW5TdWJtZW51S2V5ID09PSBrZXkpIHtcbiAgICAgIHRoaXMuY2xvc2VPcGVuU3VibWVudSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5TdWJtZW51S2V5ID0ga2V5O1xuICAgICAgdGhpcy5xdWV1ZUZvY3VzTmVzdGVkRmlyc3QoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3VibWVudU91dHNpZGVDbGljayhyb3c6IE1lbnVSb3c8VD4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocm93LmtpbmQgPT09ICdzdWJtZW51JyAmJiB0aGlzLmlzU3VibWVudU9wZW4ocm93LCBpbmRleCkpIHtcbiAgICAgIHRoaXMuY2xvc2VPcGVuU3VibWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlblN1Ym1lbnVGb3JSb3dBdChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5yb3dzW2luZGV4XTtcbiAgICBpZiAocm93Py5raW5kICE9PSAnc3VibWVudScgfHwgcm93Lml0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuU3VibWVudUtleSA9IHRoaXMuc3VibWVudVJvd0tleShyb3csIGluZGV4KTtcbiAgICB0aGlzLnF1ZXVlRm9jdXNOZXN0ZWRGaXJzdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBxdWV1ZUZvY3VzTmVzdGVkRmlyc3QoKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgbmVzdGVkID0gdGhpcy5uZXN0ZWRMaXN0cz8ubGFzdDtcbiAgICAgIG5lc3RlZD8uZm9jdXNGaXJzdE9wdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFByaW1laXJhIG9ww6fDo28gZm9jw6F2ZWwgKGFiZXJ0dXJhIHBvciB0ZWNsYWRvKS4gKi9cbiAgZm9jdXNGaXJzdE9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gMDtcbiAgICB0aGlzLmZvY3VzQWN0aXZlRG9tKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkl0ZW1DbGljayhldjogTW91c2VFdmVudCwgaXRlbTogTWVudUl0ZW1BY3Rpb248VD4pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5kaXNhYmxlZCB8fCBpdGVtLmxvYWRpbmcpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNsb3NlT3BlblN1Ym1lbnUoKTtcbiAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChpdGVtLmlkKTtcbiAgfVxuXG4gIG9wdGlvbklkKGZvY3VzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWVudUlkfS1vcHQtJHtmb2N1c0luZGV4fWA7XG4gIH1cblxuICBpc0FjdGl2ZVJvdyhyb3c6IE1lbnVSb3c8VD4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJvdy5raW5kID09PSAnYWN0aW9uJyB8fCByb3cua2luZCA9PT0gJ3N1Ym1lbnUnKSB7XG4gICAgICByZXR1cm4gcm93LmZvY3VzSW5kZXggIT09IG51bGwgJiYgcm93LmZvY3VzSW5kZXggPT09IHRoaXMuYWN0aXZlSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZWFsY2UgZGUgc2VsZWPDp8OjbyBwZXJzaXN0ZW50ZSAoZXguOiBpdGVtIGRlIG5hdmVnYcOnw6NvIGFjdGl2bykuICovXG4gIGlzUm93U2VsZWN0ZWQocm93OiBNZW51Um93PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocm93LmtpbmQgPT09ICdhY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcm93Lml0ZW0uaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVtSWQ7XG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ3N1Ym1lbnUnKSB7XG4gICAgICByZXR1cm4gcm93Lml0ZW0uaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVtSWQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJlc2V0SGlnaGxpZ2h0KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlSW5kZXggPSAtMTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uTWVudVN1cmZhY2VMZWF2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuU3VibWVudUtleSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQWN0aXZlRG9tKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IHRoaXMub3B0aW9uSWQodGhpcy5hY3RpdmVJbmRleCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAjJHtDU1MuZXNjYXBlKGlkKX1gKSBhc1xuICAgICAgfCBIVE1MRWxlbWVudFxuICAgICAgfCBudWxsO1xuICAgIGVsPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgdGhpcy5uZXN0ZWQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnN1Ym1lbnVCYWNrLmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c2FibGVDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuID0gdGhpcy5mb2N1c2FibGVDb3VudDtcblxuICAgIHN3aXRjaCAoZXYua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA8IDApIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gKHRoaXMuYWN0aXZlSW5kZXggKyAxKSAlIG47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZURvbSgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPCAwKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG4gLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSAodGhpcy5hY3RpdmVJbmRleCAtIDEgKyBuKSAlIG47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZURvbSgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmVEb20oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG4gLSAxO1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlRG9tKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4IDwgMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMucm93c1tpXTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByLmtpbmQgPT09ICdzdWJtZW51JyAmJlxuICAgICAgICAgICAgci5mb2N1c0luZGV4ID09PSB0aGlzLmFjdGl2ZUluZGV4ICYmXG4gICAgICAgICAgICAhci5pdGVtLmRpc2FibGVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuU3VibWVudUZvclJvd0F0KGkpO1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XG4gICAgICAgICAgLyogZGVpeGFyIHByb3BhZ2FyIHBhcmEgbyBjYW1wbywgc2UgbmVjZXNzw6FyaW8gKi9cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMucm93c1tpXTtcbiAgICAgICAgICBpZiAoci5raW5kICE9PSAnYWN0aW9uJyAmJiByLmtpbmQgIT09ICdzdWJtZW51Jykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyLmZvY3VzSW5kZXggIT09IHRoaXMuYWN0aXZlSW5kZXggfHwgci5mb2N1c0luZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHIua2luZCA9PT0gJ2FjdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChyLml0ZW0uZGlzYWJsZWQgfHwgci5pdGVtLmxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChyLml0ZW0uaWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyLml0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9wZW5TdWJtZW51Rm9yUm93QXQoaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlUmVxdWVzdC5lbWl0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibWVudS1saXN0XCJcbiAgW2NsYXNzLm1lbnUtbGlzdC0tZGVuc2VdPVwiZGVuc2VcIlxuICBbY2xhc3MubWVudS1saXN0LS1jb21wcmVzcy10ZXh0XT1cImNvbXByZXNzVGV4dFwiXG4gIHJvbGU9XCJtZW51XCJcbiAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIm51bGxcIlxuICB0YWJpbmRleD1cIi0xXCJcbiAgKG1vdXNlbGVhdmUpPVwib25NZW51U3VyZmFjZUxlYXZlKClcIlxuPlxuICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgaWR4OyBsZXQgaWR4ID0gJGluZGV4KSB7XG4gICAgQHN3aXRjaCAocm93LmtpbmQpIHtcbiAgICAgIEBjYXNlICgnZGl2aWRlcicpIHtcbiAgICAgICAgPGFwcC1tZW51LWRpdmlkZXIgLz5cbiAgICAgIH1cbiAgICAgIEBjYXNlICgnZ3JvdXAnKSB7XG4gICAgICAgIDxhcHAtbWVudS1ncm91cCBbbGFiZWxdPVwicm93LmxhYmVsXCIgW2hpZGVMYWJlbF09XCJjb21wcmVzc1RleHRcIiAvPlxuICAgICAgfVxuICAgICAgQGNhc2UgKCdzdWJtZW51Jykge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJtZW51LWxpc3RfX3N1Ym1lbnUtd3JhcFwiXG4gICAgICAgICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICAgICAgICNzdWJPcmlnaW49XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJvblN1Ym1lbnVUcmlnZ2VyRW50ZXIocm93LCBpZHgpXCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvblN1Ym1lbnVUcmlnZ2VyTGVhdmUocm93LCBpZHgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWVudS1saXN0X19vcHRpb24gbWVudS1saXN0X19vcHRpb24tLXN1Ym1lbnVcIlxuICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ3RydWUnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNTdWJtZW51T3Blbihyb3csIGlkeClcIlxuICAgICAgICAgICAgW2lkXT1cInJvdy5mb2N1c0luZGV4ICE9PSBudWxsID8gb3B0aW9uSWQocm93LmZvY3VzSW5kZXgpIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJyb3cuZm9jdXNJbmRleCAhPT0gbnVsbCAmJiAhcm93Lml0ZW0uZGlzYWJsZWQgPyAoaXNBY3RpdmVSb3cocm93KSA/IDAgOiAtMSkgOiAtMVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInJvdy5pdGVtLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29tcHJlc3NUZXh0ID8gcm93Lml0ZW0ubGFiZWwgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29tcHJlc3NUZXh0ID8gcm93Lml0ZW0ubGFiZWwgOiBudWxsXCJcbiAgICAgICAgICAgIFtjbGFzcy5tZW51LWxpc3RfX29wdGlvbi0tZGlzYWJsZWRdPVwicm93Lml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2NsYXNzLm1lbnUtbGlzdF9fb3B0aW9uLS1hY3RpdmVdPVwiaXNBY3RpdmVSb3cocm93KVwiXG4gICAgICAgICAgICBbY2xhc3MubWVudS1saXN0X19vcHRpb24tLXNlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TdWJtZW51Um93Q2xpY2soJGV2ZW50LCByb3csIGlkeClcIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Sb3dNb3VzZUVudGVyKHJvdylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAocm93Lml0ZW0uaWNvbj8udHJpbSgpKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1saXN0X19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPGkgW25nQ2xhc3NdPVwicm93Lml0ZW0uaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpc3RfX3RleHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpc3RfX2xhYmVsXCI+e3sgcm93Lml0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAocm93Lml0ZW0uZGVzY3JpcHRpb24/LnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1saXN0X19kZXNjcmlwdGlvblwiPnt7IHJvdy5pdGVtLmRlc2NyaXB0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGlzdF9fc3VibWVudS1jaGV2cm9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+4oC6PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwic3ViT3JpZ2luXCJcbiAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc1N1Ym1lbnVPcGVuKHJvdywgaWR4KVwiXG4gICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJzdWJtZW51UG9zaXRpb25zXCJcbiAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UHVzaF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzc109XCJvdmVybGF5UGFuZWxDbGFzc2VzKClcIlxuICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aF09XCIyMDBcIlxuICAgICAgICAgICAgKG92ZXJsYXlPdXRzaWRlQ2xpY2spPVwib25TdWJtZW51T3V0c2lkZUNsaWNrKHJvdywgaWR4KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lbnUtc3VibWVudV9fcGFuZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJwYW5lbFRoZW1lTmdDbGFzcygpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25TdWJtZW51UGFuZWxFbnRlcigpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25TdWJtZW51UGFuZWxMZWF2ZShyb3csIGlkeClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGFwcC1tZW51LWxpc3RcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwicm93Lml0ZW0uaXRlbXNcIlxuICAgICAgICAgICAgICAgIFttZW51SWRdPVwic3VibWVudU1lbnVJZChyb3cpXCJcbiAgICAgICAgICAgICAgICBbbmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkZW5zZV09XCJkZW5zZVwiXG4gICAgICAgICAgICAgICAgW2NvbXByZXNzVGV4dF09XCJjb21wcmVzc1RleHRcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZEl0ZW1JZF09XCJzZWxlY3RlZEl0ZW1JZFwiXG4gICAgICAgICAgICAgICAgKGl0ZW1TZWxlY3QpPVwib25OZXN0ZWRJdGVtU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbG9zZVJlcXVlc3QpPVwiY2xvc2VSZXF1ZXN0LmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHN1Ym1lbnVCYWNrKT1cImNsb3NlT3BlblN1Ym1lbnUoKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBjYXNlICgnYWN0aW9uJykge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJtZW51LWxpc3RfX29wdGlvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICBbaWRdPVwicm93LmZvY3VzSW5kZXggIT09IG51bGwgPyBvcHRpb25JZChyb3cuZm9jdXNJbmRleCkgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJyb3cuZm9jdXNJbmRleCAhPT0gbnVsbCAmJiAhcm93Lml0ZW0uZGlzYWJsZWQgPyAoaXNBY3RpdmVSb3cocm93KSA/IDAgOiAtMSkgOiAtMVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJyb3cuaXRlbS5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwicm93Lml0ZW0ubG9hZGluZyA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb21wcmVzc1RleHQgPyByb3cuaXRlbS5sYWJlbCA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29tcHJlc3NUZXh0ID8gcm93Lml0ZW0ubGFiZWwgOiBudWxsXCJcbiAgICAgICAgICBbY2xhc3MubWVudS1saXN0X19vcHRpb24tLWRpc2FibGVkXT1cInJvdy5pdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICBbY2xhc3MubWVudS1saXN0X19vcHRpb24tLWxvYWRpbmddPVwicm93Lml0ZW0ubG9hZGluZ1wiXG4gICAgICAgICAgW2NsYXNzLm1lbnUtbGlzdF9fb3B0aW9uLS1kYW5nZXJdPVwicm93Lml0ZW0uZGFuZ2VyXCJcbiAgICAgICAgICBbY2xhc3MubWVudS1saXN0X19vcHRpb24tLWFjdGl2ZV09XCJpc0FjdGl2ZVJvdyhyb3cpXCJcbiAgICAgICAgICBbY2xhc3MubWVudS1saXN0X19vcHRpb24tLXNlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKCRldmVudCwgcm93Lml0ZW0pXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJvblJvd01vdXNlRW50ZXIocm93KVwiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKHJvdy5pdGVtLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1saXN0X19pY29uIG1lbnUtbGlzdF9faWNvbi0tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXNwaW5uZXJcIj48L2k+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAZWxzZSBpZiAocm93Lml0ZW0uaWNvbj8udHJpbSgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGlzdF9faWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJyb3cuaXRlbS5pY29uXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGlzdF9fdGV4dFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpc3RfX2xhYmVsXCI+e3sgcm93Lml0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICBAaWYgKHJvdy5pdGVtLmRlc2NyaXB0aW9uPy50cmltKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpc3RfX2Rlc2NyaXB0aW9uXCI+e3sgcm93Lml0ZW0uZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Posição preferencial do painel em relação à âncora (com fallbacks via CDK `push` / ordem de posições).
|
|
3
|
+
*/
|
|
4
|
+
export var OverlayPlacement;
|
|
5
|
+
(function (OverlayPlacement) {
|
|
6
|
+
OverlayPlacement["Top"] = "top";
|
|
7
|
+
OverlayPlacement["Bottom"] = "bottom";
|
|
8
|
+
OverlayPlacement["Left"] = "left";
|
|
9
|
+
OverlayPlacement["Right"] = "right";
|
|
10
|
+
})(OverlayPlacement || (OverlayPlacement = {}));
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wbGFjZW1lbnQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL292ZXJsYXkvX21vZGVscy9vdmVybGF5LXBsYWNlbWVudC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGdCQUtYO0FBTEQsV0FBWSxnQkFBZ0I7SUFDMUIsK0JBQVcsQ0FBQTtJQUNYLHFDQUFpQixDQUFBO0lBQ2pCLGlDQUFhLENBQUE7SUFDYixtQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBSzNCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFBvc2nDp8OjbyBwcmVmZXJlbmNpYWwgZG8gcGFpbmVsIGVtIHJlbGHDp8OjbyDDoCDDom5jb3JhIChjb20gZmFsbGJhY2tzIHZpYSBDREsgYHB1c2hgIC8gb3JkZW0gZGUgcG9zacOnw7VlcykuXHJcbiAqL1xyXG5leHBvcnQgZW51bSBPdmVybGF5UGxhY2VtZW50IHtcclxuICBUb3AgPSAndG9wJyxcclxuICBCb3R0b20gPSAnYm90dG9tJyxcclxuICBMZWZ0ID0gJ2xlZnQnLFxyXG4gIFJpZ2h0ID0gJ3JpZ2h0JyxcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { OverlayPlacement } from '../_models/overlay-placement.model';
|
|
2
|
+
const DEFAULT_GAP = 8;
|
|
3
|
+
/**
|
|
4
|
+
* Constrói posições CDK para overlay ancorado (tooltip, popover, autocomplete, etc.).
|
|
5
|
+
* Inclui alternativas para inverter quando não há espaço (`push` no componente).
|
|
6
|
+
*
|
|
7
|
+
* Menus dropdown usam {@link menuConnectedPositions} em `menus/_utils` (alinhamento `start`, gap tipicamente menor).
|
|
8
|
+
*/
|
|
9
|
+
export function anchoredOverlayPositions(placement, offsetPx = DEFAULT_GAP) {
|
|
10
|
+
const o = offsetPx;
|
|
11
|
+
switch (placement) {
|
|
12
|
+
case OverlayPlacement.Top:
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
originX: 'center',
|
|
16
|
+
originY: 'top',
|
|
17
|
+
overlayX: 'center',
|
|
18
|
+
overlayY: 'bottom',
|
|
19
|
+
offsetY: -o,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
originX: 'center',
|
|
23
|
+
originY: 'bottom',
|
|
24
|
+
overlayX: 'center',
|
|
25
|
+
overlayY: 'top',
|
|
26
|
+
offsetY: o,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
case OverlayPlacement.Bottom:
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
originX: 'center',
|
|
33
|
+
originY: 'bottom',
|
|
34
|
+
overlayX: 'center',
|
|
35
|
+
overlayY: 'top',
|
|
36
|
+
offsetY: o,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
originX: 'center',
|
|
40
|
+
originY: 'top',
|
|
41
|
+
overlayX: 'center',
|
|
42
|
+
overlayY: 'bottom',
|
|
43
|
+
offsetY: -o,
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
case OverlayPlacement.Left:
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
originX: 'start',
|
|
50
|
+
originY: 'center',
|
|
51
|
+
overlayX: 'end',
|
|
52
|
+
overlayY: 'center',
|
|
53
|
+
offsetX: -o,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
originX: 'end',
|
|
57
|
+
originY: 'center',
|
|
58
|
+
overlayX: 'start',
|
|
59
|
+
overlayY: 'center',
|
|
60
|
+
offsetX: o,
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
case OverlayPlacement.Right:
|
|
64
|
+
return [
|
|
65
|
+
{
|
|
66
|
+
originX: 'end',
|
|
67
|
+
originY: 'center',
|
|
68
|
+
overlayX: 'start',
|
|
69
|
+
overlayY: 'center',
|
|
70
|
+
offsetX: o,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
originX: 'start',
|
|
74
|
+
originY: 'center',
|
|
75
|
+
overlayX: 'end',
|
|
76
|
+
overlayY: 'center',
|
|
77
|
+
offsetX: -o,
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
default:
|
|
81
|
+
return anchoredOverlayPositions(OverlayPlacement.Bottom, o);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yZWQtb3ZlcmxheS1wb3NpdGlvbnMudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvb3ZlcmxheS9fdXRpbHMvYW5jaG9yZWQtb3ZlcmxheS1wb3NpdGlvbnMudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV0RSxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLFNBQTJCLEVBQzNCLFFBQVEsR0FBRyxXQUFXO0lBRXRCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUNuQixRQUFRLFNBQVMsRUFBRSxDQUFDO1FBQ2xCLEtBQUssZ0JBQWdCLENBQUMsR0FBRztZQUN2QixPQUFPO2dCQUNMO29CQUNFLE9BQU8sRUFBRSxRQUFRO29CQUNqQixPQUFPLEVBQUUsS0FBSztvQkFDZCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQ1o7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsT0FBTyxFQUFFLENBQUM7aUJBQ1g7YUFDRixDQUFDO1FBQ0osS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNO1lBQzFCLE9BQU87Z0JBQ0w7b0JBQ0UsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsT0FBTyxFQUFFLENBQUM7aUJBQ1g7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLE9BQU8sRUFBRSxLQUFLO29CQUNkLFFBQVEsRUFBRSxRQUFRO29CQUNsQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDWjthQUNGLENBQUM7UUFDSixLQUFLLGdCQUFnQixDQUFDLElBQUk7WUFDeEIsT0FBTztnQkFDTDtvQkFDRSxPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLFFBQVEsRUFBRSxLQUFLO29CQUNmLFFBQVEsRUFBRSxRQUFRO29CQUNsQixPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUNaO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2FBQ0YsQ0FBQztRQUNKLEtBQUssZ0JBQWdCLENBQUMsS0FBSztZQUN6QixPQUFPO2dCQUNMO29CQUNFLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxPQUFPO29CQUNoQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQ1o7YUFDRixDQUFDO1FBQ0o7WUFDRSxPQUFPLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IE92ZXJsYXlQbGFjZW1lbnQgfSBmcm9tICcuLi9fbW9kZWxzL292ZXJsYXktcGxhY2VtZW50Lm1vZGVsJztcclxuXHJcbmNvbnN0IERFRkFVTFRfR0FQID0gODtcclxuXHJcbi8qKlxyXG4gKiBDb25zdHLDs2kgcG9zacOnw7VlcyBDREsgcGFyYSBvdmVybGF5IGFuY29yYWRvICh0b29sdGlwLCBwb3BvdmVyLCBhdXRvY29tcGxldGUsIGV0Yy4pLlxyXG4gKiBJbmNsdWkgYWx0ZXJuYXRpdmFzIHBhcmEgaW52ZXJ0ZXIgcXVhbmRvIG7Do28gaMOhIGVzcGHDp28gKGBwdXNoYCBubyBjb21wb25lbnRlKS5cclxuICpcclxuICogTWVudXMgZHJvcGRvd24gdXNhbSB7QGxpbmsgbWVudUNvbm5lY3RlZFBvc2l0aW9uc30gZW0gYG1lbnVzL191dGlsc2AgKGFsaW5oYW1lbnRvIGBzdGFydGAsIGdhcCB0aXBpY2FtZW50ZSBtZW5vcikuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYW5jaG9yZWRPdmVybGF5UG9zaXRpb25zKFxyXG4gIHBsYWNlbWVudDogT3ZlcmxheVBsYWNlbWVudCxcclxuICBvZmZzZXRQeCA9IERFRkFVTFRfR0FQLFxyXG4pOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcclxuICBjb25zdCBvID0gb2Zmc2V0UHg7XHJcbiAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Ub3A6XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldFk6IC1vLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgIG9mZnNldFk6IG8sXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgIG9mZnNldFk6IG8sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcclxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgb2Zmc2V0WTogLW8sXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcclxuICAgICAgICAgIG9mZnNldFg6IC1vLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgb2Zmc2V0WDogbyxcclxuICAgICAgICB9LFxyXG4gICAgICBdO1xyXG4gICAgY2FzZSBPdmVybGF5UGxhY2VtZW50LlJpZ2h0OlxyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcclxuICAgICAgICAgIG9mZnNldFg6IG8sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICBvdmVybGF5WTogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvZmZzZXRYOiAtbyxcclxuICAgICAgICB9LFxyXG4gICAgICBdO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIGFuY2hvcmVkT3ZlcmxheVBvc2l0aW9ucyhPdmVybGF5UGxhY2VtZW50LkJvdHRvbSwgbyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|