@fundamental-ngx/btp 0.46.0-rc.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +7 -0
  2. package/esm2022/fundamental-ngx-btp.mjs +5 -0
  3. package/esm2022/index.mjs +3 -0
  4. package/esm2022/navigation/directives/navigation-home.directive.mjs +19 -0
  5. package/esm2022/navigation/directives/navigation-list-spacer.directive.mjs +24 -0
  6. package/esm2022/navigation/fundamental-ngx-btp-navigation.mjs +5 -0
  7. package/esm2022/navigation/index.mjs +11 -0
  8. package/esm2022/navigation/navigation-component.token.mjs +22 -0
  9. package/esm2022/navigation/navigation-content-end.component.mjs +62 -0
  10. package/esm2022/navigation/navigation-content-start.component.mjs +207 -0
  11. package/esm2022/navigation/navigation-content.token.mjs +3 -0
  12. package/esm2022/navigation/navigation-link.component.mjs +188 -0
  13. package/esm2022/navigation/navigation-list/navigation-list-item.component.mjs +423 -0
  14. package/esm2022/navigation/navigation-list/navigation-list-overflow-item.component.mjs +57 -0
  15. package/esm2022/navigation/navigation-list/navigation-list.component.mjs +125 -0
  16. package/esm2022/navigation/navigation-list-component.token.mjs +3 -0
  17. package/esm2022/navigation/navigation-list-item-component.token.mjs +90 -0
  18. package/esm2022/navigation/navigation.component.mjs +251 -0
  19. package/esm2022/navigation/navigation.service.mjs +14 -0
  20. package/esm2022/navigation/navigation.types.mjs +2 -0
  21. package/esm2022/navigation-menu/fundamental-ngx-btp-navigation-menu.mjs +5 -0
  22. package/esm2022/navigation-menu/index.mjs +6 -0
  23. package/esm2022/navigation-menu/lib/navigation-menu-item.component.mjs +48 -0
  24. package/esm2022/navigation-menu/lib/navigation-menu-popover-control.directive.mjs +19 -0
  25. package/esm2022/navigation-menu/lib/navigation-menu-popover.component.mjs +38 -0
  26. package/esm2022/navigation-menu/lib/navigation-menu.component.mjs +13 -0
  27. package/esm2022/navigation-menu/lib/navigation-menu.module.mjs +17 -0
  28. package/esm2022/search-field/fundamental-ngx-btp-search-field.mjs +5 -0
  29. package/esm2022/search-field/index.mjs +2 -0
  30. package/esm2022/search-field/search-field.component.mjs +62 -0
  31. package/esm2022/shared/fundamental-ngx-btp-shared.mjs +5 -0
  32. package/esm2022/shared/index.mjs +2 -0
  33. package/esm2022/tool-header/components/tool-header/tool-header.component.mjs +227 -0
  34. package/esm2022/tool-header/components/tool-header-product-switch.component.mjs +102 -0
  35. package/esm2022/tool-header/directives/tool-header-action.directive.mjs +43 -0
  36. package/esm2022/tool-header/directives/tool-header-actions.directive.mjs +63 -0
  37. package/esm2022/tool-header/directives/tool-header-auto-mode.directive.mjs +114 -0
  38. package/esm2022/tool-header/directives/tool-header-button.directive.mjs +51 -0
  39. package/esm2022/tool-header/directives/tool-header-element.directive.mjs +17 -0
  40. package/esm2022/tool-header/directives/tool-header-group.directive.mjs +26 -0
  41. package/esm2022/tool-header/directives/tool-header-logo.directive.mjs +19 -0
  42. package/esm2022/tool-header/directives/tool-header-user.directive.mjs +14 -0
  43. package/esm2022/tool-header/fundamental-ngx-btp-tool-header.mjs +5 -0
  44. package/esm2022/tool-header/index.mjs +10 -0
  45. package/esm2022/tool-header/tool-header-action-button.type.mjs +2 -0
  46. package/esm2022/tool-header/tool-header-component.class.mjs +74 -0
  47. package/esm2022/tool-header/tool-header-state.type.mjs +2 -0
  48. package/esm2022/tool-layout/directives/tool-layout-container.directive.mjs +17 -0
  49. package/esm2022/tool-layout/directives/tool-layout-content-container.directive.mjs +50 -0
  50. package/esm2022/tool-layout/directives/tool-layout-header-container.directive.mjs +17 -0
  51. package/esm2022/tool-layout/directives/tool-layout-navigation-container.directive.mjs +37 -0
  52. package/esm2022/tool-layout/fundamental-ngx-btp-tool-layout.mjs +5 -0
  53. package/esm2022/tool-layout/index.mjs +7 -0
  54. package/esm2022/tool-layout/tool-layout.component.mjs +43 -0
  55. package/esm2022/tool-layout/tool-layout.module.mjs +40 -0
  56. package/fesm2022/fundamental-ngx-btp-navigation-menu.mjs +130 -0
  57. package/fesm2022/fundamental-ngx-btp-navigation-menu.mjs.map +1 -0
  58. package/fesm2022/fundamental-ngx-btp-navigation.mjs +1409 -0
  59. package/fesm2022/fundamental-ngx-btp-navigation.mjs.map +1 -0
  60. package/fesm2022/fundamental-ngx-btp-search-field.mjs +69 -0
  61. package/fesm2022/fundamental-ngx-btp-search-field.mjs.map +1 -0
  62. package/fesm2022/fundamental-ngx-btp-shared.mjs +4 -0
  63. package/fesm2022/fundamental-ngx-btp-shared.mjs.map +1 -0
  64. package/fesm2022/fundamental-ngx-btp-tool-header.mjs +717 -0
  65. package/fesm2022/fundamental-ngx-btp-tool-header.mjs.map +1 -0
  66. package/fesm2022/fundamental-ngx-btp-tool-layout.mjs +194 -0
  67. package/fesm2022/fundamental-ngx-btp-tool-layout.mjs.map +1 -0
  68. package/fesm2022/fundamental-ngx-btp.mjs +7 -0
  69. package/fesm2022/fundamental-ngx-btp.mjs.map +1 -0
  70. package/fundamental-ngx-btp-v0.46.0-rc.100.tgz +0 -0
  71. package/index.d.ts +2 -0
  72. package/navigation/README.md +3 -0
  73. package/navigation/directives/navigation-home.directive.d.ts +10 -0
  74. package/navigation/directives/navigation-list-spacer.directive.d.ts +8 -0
  75. package/navigation/index.d.ts +10 -0
  76. package/navigation/navigation-component.token.d.ts +34 -0
  77. package/navigation/navigation-content-end.component.d.ts +23 -0
  78. package/navigation/navigation-content-start.component.d.ts +54 -0
  79. package/navigation/navigation-content.token.d.ts +11 -0
  80. package/navigation/navigation-link.component.d.ts +49 -0
  81. package/navigation/navigation-list/navigation-list-item.component.d.ts +142 -0
  82. package/navigation/navigation-list/navigation-list-overflow-item.component.d.ts +16 -0
  83. package/navigation/navigation-list/navigation-list.component.d.ts +60 -0
  84. package/navigation/navigation-list-component.token.d.ts +17 -0
  85. package/navigation/navigation-list-item-component.token.d.ts +68 -0
  86. package/navigation/navigation.component.d.ts +82 -0
  87. package/navigation/navigation.service.d.ts +8 -0
  88. package/navigation/navigation.types.d.ts +2 -0
  89. package/navigation-menu/README.md +3 -0
  90. package/navigation-menu/index.d.ts +5 -0
  91. package/navigation-menu/lib/navigation-menu-item.component.d.ts +13 -0
  92. package/navigation-menu/lib/navigation-menu-popover-control.directive.d.ts +10 -0
  93. package/navigation-menu/lib/navigation-menu-popover.component.d.ts +11 -0
  94. package/navigation-menu/lib/navigation-menu.component.d.ts +5 -0
  95. package/navigation-menu/lib/navigation-menu.module.d.ts +8 -0
  96. package/package.json +63 -0
  97. package/search-field/README.md +3 -0
  98. package/search-field/index.d.ts +1 -0
  99. package/search-field/search-field.component.d.ts +34 -0
  100. package/shared/README.md +3 -0
  101. package/shared/index.d.ts +1 -0
  102. package/tool-header/README.md +3 -0
  103. package/tool-header/components/tool-header/tool-header.component.d.ts +91 -0
  104. package/tool-header/components/tool-header-product-switch.component.d.ts +11 -0
  105. package/tool-header/directives/tool-header-action.directive.d.ts +35 -0
  106. package/tool-header/directives/tool-header-actions.directive.d.ts +27 -0
  107. package/tool-header/directives/tool-header-auto-mode.directive.d.ts +68 -0
  108. package/tool-header/directives/tool-header-button.directive.d.ts +22 -0
  109. package/tool-header/directives/tool-header-element.directive.d.ts +5 -0
  110. package/tool-header/directives/tool-header-group.directive.d.ts +12 -0
  111. package/tool-header/directives/tool-header-logo.directive.d.ts +5 -0
  112. package/tool-header/directives/tool-header-user.directive.d.ts +5 -0
  113. package/tool-header/index.d.ts +9 -0
  114. package/tool-header/tool-header-action-button.type.d.ts +10 -0
  115. package/tool-header/tool-header-component.class.d.ts +20 -0
  116. package/tool-header/tool-header-state.type.d.ts +14 -0
  117. package/tool-layout/README.md +3 -0
  118. package/tool-layout/directives/tool-layout-container.directive.d.ts +5 -0
  119. package/tool-layout/directives/tool-layout-content-container.directive.d.ts +29 -0
  120. package/tool-layout/directives/tool-layout-header-container.directive.d.ts +5 -0
  121. package/tool-layout/directives/tool-layout-navigation-container.directive.d.ts +13 -0
  122. package/tool-layout/index.d.ts +6 -0
  123. package/tool-layout/tool-layout.component.d.ts +27 -0
  124. package/tool-layout/tool-layout.module.d.ts +11 -0
@@ -0,0 +1,717 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, Renderer2, Directive, Input, Component, EventEmitter, Output, DestroyRef, ContentChildren, signal, computed, NgZone, ChangeDetectionStrategy, ViewEncapsulation, ContentChild, HostListener } from '@angular/core';
3
+ import { ButtonComponent } from '@fundamental-ngx/core/button';
4
+ import { BasePopoverClass, PopoverBodyComponent, PopoverComponent, PopoverControlComponent, PopoverBodyDirective } from '@fundamental-ngx/core/popover';
5
+ import { FD_PRODUCT_SWITCH_COMPONENT, ProductSwitchComponent, ProductSwitchButtonDirective } from '@fundamental-ngx/core/product-switch';
6
+ import { FdTranslatePipe } from '@fundamental-ngx/i18n';
7
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
8
+ import { NgIf, NgTemplateOutlet, NgForOf, AsyncPipe } from '@angular/common';
9
+ import { NavigationMenuComponent, NavigationMenuItemComponent, NavigationMenuPopoverComponent, NavigationMenuPopoverControlDirective } from '@fundamental-ngx/btp/navigation-menu';
10
+ import { SearchFieldComponent } from '@fundamental-ngx/btp/search-field';
11
+ import { FD_PRODUCT_SWITCH_COMPONENT as FD_PRODUCT_SWITCH_COMPONENT$1, FocusableListDirective, FocusableItemDirective } from '@fundamental-ngx/core';
12
+ import * as i1 from '@fundamental-ngx/core/content-density';
13
+ import { contentDensityObserverProviders, ContentDensityDirective, ContentDensityMode } from '@fundamental-ngx/core/content-density';
14
+ import { IconComponent } from '@fundamental-ngx/core/icon';
15
+ import { MenuTriggerDirective, MenuComponent, MenuItemComponent, MenuInteractiveComponent, MenuTitleDirective, MenuAddonDirective, GlyphMenuAddonDirective } from '@fundamental-ngx/core/menu';
16
+ import { OverflowLayoutComponent, OverflowLayoutItemDirective, OverflowItemRefDirective, OverflowExpandDirective } from '@fundamental-ngx/core/overflow-layout';
17
+ import { startWith, map, BehaviorSubject, combineLatest, first, distinctUntilChanged } from 'rxjs';
18
+ import { takeUntilDestroyed, toSignal, toObservable } from '@angular/core/rxjs-interop';
19
+ import { RtlService, ResponsiveBreakpoints, ResizeObserverService } from '@fundamental-ngx/cdk/utils';
20
+
21
+ let itemCounter = 0;
22
+ class ToolHeaderButtonDirective {
23
+ /**
24
+ * Whether the button has a badge.
25
+ * @param hasBadge
26
+ */
27
+ set hasBadge(hasBadge) {
28
+ if (hasBadge) {
29
+ if (!this._badge) {
30
+ this._badge = this.renderer.createElement('span');
31
+ this.renderer.addClass(this._badge, 'fd-button__badge');
32
+ this.renderer.setAttribute(this._badge, 'id', this._badgeId);
33
+ this.renderer.appendChild(this.elementRef.nativeElement, this._badge);
34
+ }
35
+ }
36
+ else {
37
+ if (this._badge) {
38
+ this.renderer.removeChild(this.elementRef.nativeElement, this._badge);
39
+ this._badge = undefined;
40
+ }
41
+ }
42
+ }
43
+ /** @hidden */
44
+ constructor() {
45
+ /** @hidden */
46
+ this.elementRef = inject(ElementRef);
47
+ /** @hidden */
48
+ this._badgeId = `fdbToolHeaderButton-badge-${itemCounter++}`;
49
+ /** @hidden */
50
+ this.renderer = inject(Renderer2);
51
+ inject(ButtonComponent, { host: true }).fdType = 'transparent';
52
+ }
53
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
54
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderButtonDirective, isStandalone: true, selector: "[fd-button][fdbToolHeaderButton]", inputs: { hasBadge: "hasBadge" }, host: { classAttribute: "fd-button--tool-header" }, ngImport: i0 }); }
55
+ }
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderButtonDirective, decorators: [{
57
+ type: Directive,
58
+ args: [{
59
+ selector: '[fd-button][fdbToolHeaderButton]',
60
+ host: {
61
+ class: 'fd-button--tool-header'
62
+ },
63
+ standalone: true
64
+ }]
65
+ }], ctorParameters: function () { return []; }, propDecorators: { hasBadge: [{
66
+ type: Input
67
+ }] } });
68
+
69
+ class ToolHeaderProductSwitchComponent extends BasePopoverClass {
70
+ constructor() {
71
+ super(...arguments);
72
+ /** Placement of a popover. */
73
+ this.placement = 'bottom-end';
74
+ /** Whether the product switch is disabled. */
75
+ this.disabled = false;
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderProductSwitchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
78
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderProductSwitchComponent, isStandalone: true, selector: "fdb-tool-header-product-switch", inputs: { placement: "placement", disabled: "disabled" }, providers: [
79
+ {
80
+ provide: FD_PRODUCT_SWITCH_COMPONENT,
81
+ useExisting: ToolHeaderProductSwitchComponent
82
+ }
83
+ ], usesInheritance: true, ngImport: i0, template: `
84
+ <fd-product-switch
85
+ [placement]="placement"
86
+ [closeOnEscapeKey]="closeOnEscapeKey"
87
+ [closeOnOutsideClick]="closeOnOutsideClick"
88
+ [(isOpen)]="isOpen"
89
+ (isOpenChange)="isOpenChange.emit($event)"
90
+ [disabled]="disabled"
91
+ [triggers]="triggers"
92
+ [focusTrapped]="false"
93
+ [focusAutoCapture]="true"
94
+ [noArrow]="noArrow"
95
+ [disableScrollbar]="true"
96
+ >
97
+ <button
98
+ *fdProductSwitchButton
99
+ fd-button
100
+ fdbToolHeaderButton
101
+ [attr.aria-label]="'coreProductSwitch.ariaLabel' | fdTranslate"
102
+ [attr.title]="'coreProductSwitch.ariaLabel' | fdTranslate"
103
+ glyph="grid"
104
+ fdType="transparent"
105
+ ></button>
106
+ <ng-content></ng-content>
107
+ </fd-product-switch>
108
+ `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }, { kind: "directive", type: ToolHeaderButtonDirective, selector: "[fd-button][fdbToolHeaderButton]", inputs: ["hasBadge"] }, { kind: "component", type: ProductSwitchComponent, selector: "fd-product-switch", inputs: ["placement", "disabled"] }, { kind: "directive", type: ProductSwitchButtonDirective, selector: "[fdProductSwitchButton]" }] }); }
109
+ }
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderProductSwitchComponent, decorators: [{
111
+ type: Component,
112
+ args: [{
113
+ selector: 'fdb-tool-header-product-switch',
114
+ imports: [
115
+ ButtonComponent,
116
+ FdTranslatePipe,
117
+ PopoverBodyComponent,
118
+ PopoverComponent,
119
+ PopoverControlComponent,
120
+ ToolHeaderButtonDirective,
121
+ ProductSwitchComponent,
122
+ ProductSwitchButtonDirective
123
+ ],
124
+ template: `
125
+ <fd-product-switch
126
+ [placement]="placement"
127
+ [closeOnEscapeKey]="closeOnEscapeKey"
128
+ [closeOnOutsideClick]="closeOnOutsideClick"
129
+ [(isOpen)]="isOpen"
130
+ (isOpenChange)="isOpenChange.emit($event)"
131
+ [disabled]="disabled"
132
+ [triggers]="triggers"
133
+ [focusTrapped]="false"
134
+ [focusAutoCapture]="true"
135
+ [noArrow]="noArrow"
136
+ [disableScrollbar]="true"
137
+ >
138
+ <button
139
+ *fdProductSwitchButton
140
+ fd-button
141
+ fdbToolHeaderButton
142
+ [attr.aria-label]="'coreProductSwitch.ariaLabel' | fdTranslate"
143
+ [attr.title]="'coreProductSwitch.ariaLabel' | fdTranslate"
144
+ glyph="grid"
145
+ fdType="transparent"
146
+ ></button>
147
+ <ng-content></ng-content>
148
+ </fd-product-switch>
149
+ `,
150
+ providers: [
151
+ {
152
+ provide: FD_PRODUCT_SWITCH_COMPONENT,
153
+ useExisting: ToolHeaderProductSwitchComponent
154
+ }
155
+ ],
156
+ standalone: true
157
+ }]
158
+ }], propDecorators: { placement: [{
159
+ type: Input
160
+ }], disabled: [{
161
+ type: Input
162
+ }] } });
163
+
164
+ class ToolHeaderActionDirective {
165
+ /** @hidden */
166
+ constructor(templateRef) {
167
+ this.templateRef = templateRef;
168
+ /**
169
+ * Whether the action should have a separator next to it
170
+ */
171
+ this.hasSeparator = false;
172
+ /**
173
+ * Event emitted when the action is clicked when in overflow mode.
174
+ **/
175
+ this.clicked = new EventEmitter();
176
+ /**
177
+ * Function to be called when the action is clicked
178
+ * when in overflow mode.
179
+ **/
180
+ this.clickCallback = () => this.clicked.emit();
181
+ }
182
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderActionDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
183
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderActionDirective, isStandalone: true, selector: "[fdbToolHeaderAction]", inputs: { glyph: "glyph", label: "label", hasSeparator: "hasSeparator", forceVisibility: "forceVisibility" }, outputs: { clicked: "clicked" }, ngImport: i0 }); }
184
+ }
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderActionDirective, decorators: [{
186
+ type: Directive,
187
+ args: [{
188
+ selector: '[fdbToolHeaderAction]',
189
+ standalone: true
190
+ }]
191
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; }, propDecorators: { glyph: [{
192
+ type: Input,
193
+ args: [{ required: true }]
194
+ }], label: [{
195
+ type: Input,
196
+ args: [{ required: true }]
197
+ }], hasSeparator: [{
198
+ type: Input
199
+ }], forceVisibility: [{
200
+ type: Input
201
+ }], clicked: [{
202
+ type: Output
203
+ }] } });
204
+
205
+ /* eslint-disable @angular-eslint/no-input-rename */
206
+ class ToolHeaderActionsDirective {
207
+ /**
208
+ * Actions to be displayed in the header.
209
+ */
210
+ set actions(actions) {
211
+ this._inputActions$.next(actions.reduce((acc, actionOrActionGroup, index) => {
212
+ if (Array.isArray(actionOrActionGroup)) {
213
+ acc.push(...actionOrActionGroup);
214
+ if (index !== actions.length - 1) {
215
+ acc[acc.length - 1].hasSeparator = true;
216
+ }
217
+ }
218
+ else {
219
+ acc.push(actionOrActionGroup);
220
+ }
221
+ return acc;
222
+ }, []));
223
+ }
224
+ /** @hidden */
225
+ set _actionsFromContent(actions) {
226
+ if (this._contentActionsSubscription) {
227
+ this._contentActionsSubscription.unsubscribe();
228
+ this._contentActionsSubscription = undefined;
229
+ }
230
+ this._contentActionsSubscription = actions.changes
231
+ .pipe(startWith(actions), map((ql) => ql.toArray()), takeUntilDestroyed(this._destroyRef))
232
+ .subscribe((_actions) => {
233
+ this._contentActions$.next(_actions);
234
+ });
235
+ }
236
+ /** @hidden */
237
+ constructor() {
238
+ /** @hidden */
239
+ this._contentActions$ = new BehaviorSubject([]);
240
+ /** @hidden */
241
+ this._inputActions$ = new BehaviorSubject([]);
242
+ /** @hidden */
243
+ this._destroyRef = inject(DestroyRef);
244
+ this._actions = toSignal(combineLatest([this._contentActions$, this._inputActions$]).pipe(map(([contentActions, inputActions]) => [...contentActions, ...inputActions])), { requireSync: true });
245
+ }
246
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
247
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderActionsDirective, isStandalone: true, selector: "fdb-tool-header-actions", inputs: { actions: "actions" }, queries: [{ propertyName: "_actionsFromContent", predicate: ToolHeaderActionDirective }], ngImport: i0 }); }
248
+ }
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderActionsDirective, decorators: [{
250
+ type: Directive,
251
+ args: [{
252
+ // eslint-disable-next-line @angular-eslint/directive-selector
253
+ selector: 'fdb-tool-header-actions',
254
+ standalone: true
255
+ }]
256
+ }], ctorParameters: function () { return []; }, propDecorators: { actions: [{
257
+ type: Input
258
+ }], _actionsFromContent: [{
259
+ type: ContentChildren,
260
+ args: [ToolHeaderActionDirective]
261
+ }] } });
262
+
263
+ class ToolHeaderElementDirective {
264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderElementDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
265
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderElementDirective, isStandalone: true, selector: "[fdbToolHeaderElement]", host: { classAttribute: "fd-tool-header__element" }, ngImport: i0 }); }
266
+ }
267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderElementDirective, decorators: [{
268
+ type: Directive,
269
+ args: [{
270
+ selector: '[fdbToolHeaderElement]',
271
+ host: {
272
+ class: 'fd-tool-header__element'
273
+ },
274
+ standalone: true
275
+ }]
276
+ }] });
277
+
278
+ class ToolHeaderGroupDirective {
279
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
280
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "16.2.7", type: ToolHeaderGroupDirective, isStandalone: true, selector: "[fdbToolHeaderGroup]", inputs: { center: ["center", "center", coerceBooleanProperty], actions: ["actions", "actions", coerceBooleanProperty] }, host: { properties: { "class.fd-tool-header__group--center": "center", "class.fd-tool-header__group--actions": "actions" }, classAttribute: "fd-tool-header__group" }, ngImport: i0 }); }
281
+ }
282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderGroupDirective, decorators: [{
283
+ type: Directive,
284
+ args: [{
285
+ selector: '[fdbToolHeaderGroup]',
286
+ host: {
287
+ class: 'fd-tool-header__group',
288
+ '[class.fd-tool-header__group--center]': 'center',
289
+ '[class.fd-tool-header__group--actions]': 'actions'
290
+ },
291
+ standalone: true
292
+ }]
293
+ }], propDecorators: { center: [{
294
+ type: Input,
295
+ args: [{ transform: coerceBooleanProperty }]
296
+ }], actions: [{
297
+ type: Input,
298
+ args: [{ transform: coerceBooleanProperty }]
299
+ }] } });
300
+
301
+ class ToolHeaderLogoDirective {
302
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderLogoDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
303
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderLogoDirective, isStandalone: true, selector: "[fdbToolHeaderLogo]", host: { properties: { "attr.role": "\"button\"", "attr.tabindex": "0" }, classAttribute: "fd-tool-header__logo" }, ngImport: i0 }); }
304
+ }
305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderLogoDirective, decorators: [{
306
+ type: Directive,
307
+ args: [{
308
+ selector: '[fdbToolHeaderLogo]',
309
+ host: {
310
+ '[attr.role]': '"button"',
311
+ '[attr.tabindex]': '0',
312
+ class: 'fd-tool-header__logo'
313
+ },
314
+ standalone: true
315
+ }]
316
+ }] });
317
+
318
+ class ToolHeaderUserDirective {
319
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderUserDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
320
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderUserDirective, isStandalone: true, selector: "[fdbToolHeaderUser]", ngImport: i0 }); }
321
+ }
322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderUserDirective, decorators: [{
323
+ type: Directive,
324
+ args: [{
325
+ selector: '[fdbToolHeaderUser]',
326
+ standalone: true
327
+ }]
328
+ }] });
329
+
330
+ class ToolHeaderComponentClass {
331
+ constructor() {
332
+ /** Mode signal */
333
+ this.mode = signal('');
334
+ /** @hidden */
335
+ this.orientation = signal('landscape');
336
+ /** @hidden */
337
+ this.fdbToolHeaderState = computed(() => {
338
+ if (this.mode() === 'phone') {
339
+ return {
340
+ backButtonVisible: this.searchFieldExpanded(),
341
+ menuButtonVisible: !this.searchFieldExpanded(),
342
+ logoVisible: !this.searchFieldExpanded(),
343
+ productNameVisible: false,
344
+ secondTitleVisible: false,
345
+ searchFieldVisible: this.searchFieldExpanded(),
346
+ searchFieldToggleActionVisible: !!this.searchField() && !this.searchFieldExpanded(),
347
+ providedActionsVisible: !this.searchFieldExpanded(),
348
+ userAvatarVisible: !this.searchFieldExpanded(),
349
+ productSwitchVisible: !this.searchFieldExpanded(),
350
+ voiceInputVisible: this.searchFieldExpanded(),
351
+ separatorsBetweenActionsVisible: false
352
+ };
353
+ }
354
+ if (this.mode() === 'tablet') {
355
+ const isPortrait = this.orientation() === 'portrait';
356
+ const isLandscape = !isPortrait;
357
+ const searchFieldVisible = this.searchFieldExpanded() || isLandscape;
358
+ const searchFieldToggleActionVisible = !searchFieldVisible && !!this.searchField();
359
+ return {
360
+ backButtonVisible: false,
361
+ menuButtonVisible: true,
362
+ logoVisible: true,
363
+ productNameVisible: isPortrait ? !this.searchFieldExpanded() : true,
364
+ secondTitleVisible: isLandscape ? false : !this.searchFieldExpanded(),
365
+ searchFieldVisible,
366
+ searchFieldToggleActionVisible,
367
+ providedActionsVisible: true,
368
+ userAvatarVisible: true,
369
+ productSwitchVisible: true,
370
+ voiceInputVisible: false,
371
+ separatorsBetweenActionsVisible: this.orientation() === 'landscape'
372
+ };
373
+ }
374
+ return {
375
+ backButtonVisible: false,
376
+ menuButtonVisible: true,
377
+ logoVisible: true,
378
+ productNameVisible: true,
379
+ secondTitleVisible: true,
380
+ searchFieldVisible: true,
381
+ searchFieldToggleActionVisible: false,
382
+ providedActionsVisible: true,
383
+ userAvatarVisible: true,
384
+ productSwitchVisible: true,
385
+ voiceInputVisible: false,
386
+ separatorsBetweenActionsVisible: true
387
+ };
388
+ });
389
+ /** Search field signal */
390
+ this.searchField = signal(null);
391
+ /** @hidden */
392
+ this.searchFieldExpanded = signal(false);
393
+ /**
394
+ * RTL signal
395
+ * @hidden
396
+ */
397
+ this._rtl = toSignal(inject(RtlService).rtl);
398
+ }
399
+ }
400
+
401
+ /* eslint-disable @angular-eslint/no-input-rename */
402
+ const imports = [
403
+ ToolHeaderGroupDirective,
404
+ NgIf,
405
+ NgTemplateOutlet,
406
+ OverflowLayoutComponent,
407
+ NgForOf,
408
+ OverflowLayoutItemDirective,
409
+ OverflowItemRefDirective,
410
+ OverflowExpandDirective,
411
+ PopoverComponent,
412
+ PopoverControlComponent,
413
+ PopoverBodyDirective,
414
+ MenuTriggerDirective,
415
+ MenuComponent,
416
+ MenuItemComponent,
417
+ MenuInteractiveComponent,
418
+ MenuTitleDirective,
419
+ MenuAddonDirective,
420
+ GlyphMenuAddonDirective,
421
+ ToolHeaderElementDirective,
422
+ IconComponent,
423
+ ButtonComponent,
424
+ ToolHeaderButtonDirective,
425
+ ToolHeaderLogoDirective,
426
+ FdTranslatePipe
427
+ ];
428
+ class ToolHeaderComponent extends ToolHeaderComponentClass {
429
+ constructor() {
430
+ super(...arguments);
431
+ /**
432
+ * Whether to show the voice input action button on
433
+ * the right side of the tool header, when the mode is mobile
434
+ * and the search input is expanded
435
+ */
436
+ this.showVoiceInputAction = true;
437
+ /**
438
+ * Event emitted when the menu button is clicked
439
+ **/
440
+ this.menuClick = new EventEmitter();
441
+ /**
442
+ * Event emitted when user intends to expand the menu.
443
+ * Happens when user clicks `right arrow` key on the menu button
444
+ * if on ltr or `left arrow` key if on rtl.
445
+ **/
446
+ this.menuExpand = new EventEmitter();
447
+ /**
448
+ * Event emitted when user intends to collapse the menu.
449
+ * Happens when user clicks `left arrow` key on the menu button
450
+ * if on ltr or `right arrow` key if on rtl.
451
+ **/
452
+ this.menuCollapse = new EventEmitter();
453
+ /**
454
+ * Event emitted when the microphone button is clicked
455
+ **/
456
+ this.microphoneClick = new EventEmitter();
457
+ /**
458
+ * Event emitted when the default logo is clicked
459
+ */
460
+ this.logoClick = new EventEmitter();
461
+ /** @hidden */
462
+ this._ngZone = inject(NgZone);
463
+ }
464
+ /** Mode */
465
+ set _mode(mode) {
466
+ if (mode !== this.mode()) {
467
+ this.mode.set(mode);
468
+ }
469
+ }
470
+ /** @hidden */
471
+ set _orientation(orientation) {
472
+ if (orientation !== this.orientation()) {
473
+ this.orientation.set(orientation);
474
+ }
475
+ }
476
+ /** @hidden */
477
+ set _searchField(searchField) {
478
+ this.searchField.set(searchField);
479
+ }
480
+ /**
481
+ * The handler, responsible for closing the search field
482
+ * on outside click
483
+ * @hidden
484
+ **/
485
+ _onClick(event) {
486
+ if (this.searchFieldExpanded()) {
487
+ if (this.mode() === 'tablet' &&
488
+ this.orientation() === 'portrait' &&
489
+ this.searchField() &&
490
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
491
+ !event.composedPath().includes(this.searchField().elementRef.nativeElement)) {
492
+ this.searchFieldExpanded.set(false);
493
+ }
494
+ }
495
+ }
496
+ /** @hidden */
497
+ ngOnDestroy() {
498
+ if (this._searchFieldOutsideClickSubscription) {
499
+ this._searchFieldOutsideClickSubscription.unsubscribe();
500
+ }
501
+ }
502
+ /**
503
+ * Expand the search field
504
+ **/
505
+ expandSearchField() {
506
+ this.searchFieldExpanded.set(true);
507
+ this._ngZone.onStable.pipe(first()).subscribe(() => {
508
+ this.searchField()?.focus();
509
+ });
510
+ }
511
+ /** @hidden */
512
+ _handleMenuLeftArrowKey() {
513
+ if (this._rtl()) {
514
+ this.menuExpand.emit();
515
+ }
516
+ else {
517
+ this.menuCollapse.emit();
518
+ }
519
+ }
520
+ /** @hidden */
521
+ _handleMenuRightArrowKey() {
522
+ if (this._rtl()) {
523
+ this.menuCollapse.emit();
524
+ }
525
+ else {
526
+ this.menuExpand.emit();
527
+ }
528
+ }
529
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
530
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.7", type: ToolHeaderComponent, isStandalone: true, selector: "fdb-tool-header", inputs: { productName: "productName", secondTitle: "secondTitle", _mode: ["mode", "_mode"], _orientation: ["orientation", "_orientation"], showMenuButton: ["showMenuButton", "showMenuButton", coerceBooleanProperty], showVoiceInputAction: ["showVoiceInputAction", "showVoiceInputAction", coerceBooleanProperty] }, outputs: { menuClick: "menuClick", menuExpand: "menuExpand", menuCollapse: "menuCollapse", microphoneClick: "microphoneClick", logoClick: "logoClick" }, host: { listeners: { "document:click": "_onClick($event)" }, properties: { "class.fd-tool-header--menu": "showMenuButton" }, classAttribute: "fd-tool-header" }, providers: [
531
+ contentDensityObserverProviders(),
532
+ {
533
+ provide: ToolHeaderComponentClass,
534
+ useExisting: ToolHeaderComponent
535
+ }
536
+ ], queries: [{ propertyName: "_toolHeaderActionsDirective", first: true, predicate: ToolHeaderActionsDirective, descendants: true }, { propertyName: "_toolHeaderLogoDirective", first: true, predicate: ToolHeaderLogoDirective, descendants: true }, { propertyName: "_searchField", first: true, predicate: SearchFieldComponent, descendants: true }, { propertyName: "_toolHeaderUser", first: true, predicate: ToolHeaderUserDirective, descendants: true }, { propertyName: "_toolHeaderProductSwitch", first: true, predicate: FD_PRODUCT_SWITCH_COMPONENT$1, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div fdbToolHeaderGroup [class.fd-tool-header--menu]=\"showMenuButton\">\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().backButtonVisible\">\n <button fd-button fdbToolHeaderButton glyph=\"slim-arrow-left\" (click)=\"searchFieldExpanded.set(false)\"></button>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().menuButtonVisible && showMenuButton\">\n <button\n fd-button\n fdbToolHeaderButton\n [title]=\"'btpToolHeader.menuButtonAriaLabel' | fdTranslate\"\n [ariaLabel]=\"'btpToolHeader.menuButtonAriaLabel' | fdTranslate\"\n glyph=\"menu2\"\n (keydown.arrowLeft)=\"_handleMenuLeftArrowKey()\"\n (keydown.arrowRight)=\"_handleMenuRightArrowKey()\"\n (click)=\"menuClick.emit()\"\n ></button>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().logoVisible\">\n <ng-container *ngIf=\"_toolHeaderLogoDirective; else defaultLogo\">\n <ng-content select=\"[fdbToolHeaderLogo]\"></ng-content>\n </ng-container>\n <ng-template #defaultLogo>\n <img\n fdbToolHeaderLogo\n (click)=\"logoClick.emit()\"\n src=\"https://unpkg.com/fundamental-styles/dist/images/sap-logo.png\"\n srcset=\"\n https://unpkg.com/fundamental-styles/dist/images/sap-logo@2x.png 1x,\n https://unpkg.com/fundamental-styles/dist/images/sap-logo@3x.png 2x,\n https://unpkg.com/fundamental-styles/dist/images/sap-logo@4x.png 3x\n \"\n alt=\"SAP logo\"\n aria-label=\"SAP logo\"\n title=\"SAP logo\"\n />\n </ng-template>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().productNameVisible\">\n <h1 class=\"fd-tool-header__product-name\">\n {{ productName }}\n </h1>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().secondTitleVisible && secondTitle\">\n <div class=\"fd-tool-header__second-title\">\n {{ secondTitle }}\n </div>\n </div>\n</div>\n\n<div fdbToolHeaderGroup center *ngIf=\"fdbToolHeaderState().searchFieldVisible\">\n <ng-content select=\"fdb-search-field\"></ng-content>\n</div>\n\n<div fdbToolHeaderGroup actions>\n <fd-overflow-layout fdbToolHeaderElement [style.justify-content]=\"'end'\">\n <ng-container *ngIf=\"fdbToolHeaderState().searchFieldToggleActionVisible\">\n <div fdbToolHeaderElement *fdOverflowItemRef=\"let hidden\" [forceVisibility]=\"true\" fdOverflowLayoutItem>\n <button\n fd-button\n fdbToolHeaderButton\n glyph=\"search\"\n (click)=\"$event.stopPropagation(); expandSearchField()\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"fdbToolHeaderState().providedActionsVisible\">\n <ng-container *ngFor=\"let action of _toolHeaderActionsDirective?._actions()\">\n <div\n fdbToolHeaderElement\n *fdOverflowItemRef=\"let hidden\"\n [forceVisibility]=\"!!action.forceVisibility\"\n fdOverflowLayoutItem\n >\n <ng-template\n [ngIf]=\"!!action.templateRef\"\n [ngIfThen]=\"$any(action.templateRef)\"\n [ngIfElse]=\"defaultActionButtonTemplate\"\n ></ng-template>\n <ng-template #defaultActionButtonTemplate>\n <button\n fd-button\n fdbToolHeaderButton\n [glyph]=\"action.glyph\"\n (click)=\"action.clickCallback()\"\n [ariaLabel]=\"action.label\"\n >\n <span class=\"fd-button__badge\" *ngIf=\"action.hasBadge\"></span>\n </button>\n </ng-template>\n <div\n class=\"fd-tool-header__separator\"\n *ngIf=\"action.hasSeparator && fdbToolHeaderState().separatorsBetweenActionsVisible\"\n ></div>\n </div>\n </ng-container>\n </ng-container>\n\n <fdb-navigation-menu-popover *fdOverflowExpand=\"let overflowItems\" fdbToolHeaderElement>\n <button *fdbNavigationMenuPopoverControl fd-button fdbToolHeaderButton glyph=\"overflow\"></button>\n <ul *fdPopoverBody fdkFocusableList [wrap]=\"true\" fdb-navigation-menu>\n <ng-container *ngFor=\"let item of overflowItems\">\n <ng-container *ngIf=\"_toolHeaderActionsDirective?._actions() as actions\">\n <li\n *ngIf=\"\n fdbToolHeaderState().searchFieldToggleActionVisible\n ? actions[item.globalIndex - 1]\n : actions[item.globalIndex] as action\n \"\n fdb-navigation-menu-item\n fdkFocusableItem\n [glyph]=\"action.glyph\"\n (click)=\"action.clickCallback()\"\n [label]=\"action.label\"\n ></li>\n </ng-container>\n </ng-container>\n </ul>\n </fdb-navigation-menu-popover>\n </fd-overflow-layout>\n <ng-container *ngIf=\"fdbToolHeaderState().userAvatarVisible && _toolHeaderUser\">\n <div fdbToolHeaderElement>\n <div class=\"fd-tool-header__separator\"></div>\n <ng-content select=\"[fdbToolHeaderUser]\"></ng-content>\n </div>\n </ng-container>\n <ng-container *ngIf=\"fdbToolHeaderState().productSwitchVisible && _toolHeaderProductSwitch\">\n <div fdbToolHeaderElement>\n <div class=\"fd-tool-header__separator\"></div>\n <ng-content select=\"fdb-tool-header-product-switch, fd-product-switch\"></ng-content>\n </div>\n </ng-container>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().voiceInputVisible\">\n <button\n fd-button\n fdbToolHeaderButton\n glyph=\"microphone\"\n [ariaLabel]=\"'Search with voice'\"\n (click)=\"microphoneClick.emit()\"\n ></button>\n </div>\n</div>\n", styles: ["@import\"../../../../../../node_modules/fundamental-styles/dist/tool-header.css\";.fd-popover__body.fdb-tool-header-actions-overflow-popover-body{--fdPopover_Offset: .3875rem;width:auto;height:auto;padding:.5rem;background:var(--sapGroup_ContentBackground);border:none;border-radius:.5rem;box-shadow:var(--sapMenu_Shadow1)}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu{--fdMenu_Item_Spacing_Left: 0}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu .fd-menu__link{--fdMenu_Link_Height: 2rem;border-radius:.375rem}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu .fd-menu__link:focus:after{display:none}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu .fd-menu__link:focus:before{border:var(--sapContent_FocusWidth) var(--sapContent_FocusStyle) var(--sapContent_FocusColor);border-radius:.375rem;inset:.125rem;content:\"\";pointer-events:none;position:absolute}\n"], dependencies: [{ kind: "directive", type: ToolHeaderGroupDirective, selector: "[fdbToolHeaderGroup]", inputs: ["center", "actions"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: OverflowLayoutComponent, selector: "fd-overflow-layout", inputs: ["maxVisibleItems", "navigationTrigger", "showMorePosition", "reverseHiddenItems", "enableKeyboardNavigation", "moreItemsButtonText"], outputs: ["visibleItemsCount", "hiddenItemsCount"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: OverflowLayoutItemDirective, selector: "[fdOverflowLayoutItem]", inputs: ["forceVisibility"], outputs: ["hiddenChange"] }, { kind: "directive", type: OverflowItemRefDirective, selector: "[fdOverflowItemRef]", inputs: ["fdOverflowItemRef"] }, { kind: "directive", type: OverflowExpandDirective, selector: "[fdOverflowExpand]", inputs: ["fdOverflowExpandItems"] }, { kind: "directive", type: PopoverBodyDirective, selector: "[fdPopoverBody]" }, { kind: "directive", type: ToolHeaderElementDirective, selector: "[fdbToolHeaderElement]" }, { kind: "component", type: ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "directive", type: ToolHeaderButtonDirective, selector: "[fd-button][fdbToolHeaderButton]", inputs: ["hasBadge"] }, { kind: "directive", type: ToolHeaderLogoDirective, selector: "[fdbToolHeaderLogo]" }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }, { kind: "component", type: NavigationMenuComponent, selector: "fdb-navigation-menu, ul[fdb-navigation-menu]" }, { kind: "component", type: NavigationMenuItemComponent, selector: "fdb-navigation-menu-item, li[fdb-navigation-menu-item]", inputs: ["glyph", "label"] }, { kind: "directive", type: FocusableListDirective, selector: "[fdkFocusableList]", inputs: ["focusable", "navigationDirection", "contentDirection", "wrap", "listFocusedEventAnnouncer"], outputs: ["itemFocused"], exportAs: ["fdkFocusableList"] }, { kind: "directive", type: FocusableItemDirective, selector: "[fdkFocusableItem]", inputs: ["fdkFocusableItem", "cellFocusedEventAnnouncer"], outputs: ["cellFocused"] }, { kind: "component", type: NavigationMenuPopoverComponent, selector: "fdb-navigation-menu-popover" }, { kind: "directive", type: NavigationMenuPopoverControlDirective, selector: "[fdbNavigationMenuPopoverControl]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
537
+ }
538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderComponent, decorators: [{
539
+ type: Component,
540
+ args: [{ selector: 'fdb-tool-header', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
541
+ class: 'fd-tool-header',
542
+ '[class.fd-tool-header--menu]': 'showMenuButton'
543
+ }, imports: [
544
+ imports,
545
+ NavigationMenuComponent,
546
+ NavigationMenuItemComponent,
547
+ FocusableListDirective,
548
+ FocusableItemDirective,
549
+ NavigationMenuPopoverComponent,
550
+ NavigationMenuPopoverControlDirective,
551
+ AsyncPipe
552
+ ], providers: [
553
+ contentDensityObserverProviders(),
554
+ {
555
+ provide: ToolHeaderComponentClass,
556
+ useExisting: ToolHeaderComponent
557
+ }
558
+ ], template: "<div fdbToolHeaderGroup [class.fd-tool-header--menu]=\"showMenuButton\">\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().backButtonVisible\">\n <button fd-button fdbToolHeaderButton glyph=\"slim-arrow-left\" (click)=\"searchFieldExpanded.set(false)\"></button>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().menuButtonVisible && showMenuButton\">\n <button\n fd-button\n fdbToolHeaderButton\n [title]=\"'btpToolHeader.menuButtonAriaLabel' | fdTranslate\"\n [ariaLabel]=\"'btpToolHeader.menuButtonAriaLabel' | fdTranslate\"\n glyph=\"menu2\"\n (keydown.arrowLeft)=\"_handleMenuLeftArrowKey()\"\n (keydown.arrowRight)=\"_handleMenuRightArrowKey()\"\n (click)=\"menuClick.emit()\"\n ></button>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().logoVisible\">\n <ng-container *ngIf=\"_toolHeaderLogoDirective; else defaultLogo\">\n <ng-content select=\"[fdbToolHeaderLogo]\"></ng-content>\n </ng-container>\n <ng-template #defaultLogo>\n <img\n fdbToolHeaderLogo\n (click)=\"logoClick.emit()\"\n src=\"https://unpkg.com/fundamental-styles/dist/images/sap-logo.png\"\n srcset=\"\n https://unpkg.com/fundamental-styles/dist/images/sap-logo@2x.png 1x,\n https://unpkg.com/fundamental-styles/dist/images/sap-logo@3x.png 2x,\n https://unpkg.com/fundamental-styles/dist/images/sap-logo@4x.png 3x\n \"\n alt=\"SAP logo\"\n aria-label=\"SAP logo\"\n title=\"SAP logo\"\n />\n </ng-template>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().productNameVisible\">\n <h1 class=\"fd-tool-header__product-name\">\n {{ productName }}\n </h1>\n </div>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().secondTitleVisible && secondTitle\">\n <div class=\"fd-tool-header__second-title\">\n {{ secondTitle }}\n </div>\n </div>\n</div>\n\n<div fdbToolHeaderGroup center *ngIf=\"fdbToolHeaderState().searchFieldVisible\">\n <ng-content select=\"fdb-search-field\"></ng-content>\n</div>\n\n<div fdbToolHeaderGroup actions>\n <fd-overflow-layout fdbToolHeaderElement [style.justify-content]=\"'end'\">\n <ng-container *ngIf=\"fdbToolHeaderState().searchFieldToggleActionVisible\">\n <div fdbToolHeaderElement *fdOverflowItemRef=\"let hidden\" [forceVisibility]=\"true\" fdOverflowLayoutItem>\n <button\n fd-button\n fdbToolHeaderButton\n glyph=\"search\"\n (click)=\"$event.stopPropagation(); expandSearchField()\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"fdbToolHeaderState().providedActionsVisible\">\n <ng-container *ngFor=\"let action of _toolHeaderActionsDirective?._actions()\">\n <div\n fdbToolHeaderElement\n *fdOverflowItemRef=\"let hidden\"\n [forceVisibility]=\"!!action.forceVisibility\"\n fdOverflowLayoutItem\n >\n <ng-template\n [ngIf]=\"!!action.templateRef\"\n [ngIfThen]=\"$any(action.templateRef)\"\n [ngIfElse]=\"defaultActionButtonTemplate\"\n ></ng-template>\n <ng-template #defaultActionButtonTemplate>\n <button\n fd-button\n fdbToolHeaderButton\n [glyph]=\"action.glyph\"\n (click)=\"action.clickCallback()\"\n [ariaLabel]=\"action.label\"\n >\n <span class=\"fd-button__badge\" *ngIf=\"action.hasBadge\"></span>\n </button>\n </ng-template>\n <div\n class=\"fd-tool-header__separator\"\n *ngIf=\"action.hasSeparator && fdbToolHeaderState().separatorsBetweenActionsVisible\"\n ></div>\n </div>\n </ng-container>\n </ng-container>\n\n <fdb-navigation-menu-popover *fdOverflowExpand=\"let overflowItems\" fdbToolHeaderElement>\n <button *fdbNavigationMenuPopoverControl fd-button fdbToolHeaderButton glyph=\"overflow\"></button>\n <ul *fdPopoverBody fdkFocusableList [wrap]=\"true\" fdb-navigation-menu>\n <ng-container *ngFor=\"let item of overflowItems\">\n <ng-container *ngIf=\"_toolHeaderActionsDirective?._actions() as actions\">\n <li\n *ngIf=\"\n fdbToolHeaderState().searchFieldToggleActionVisible\n ? actions[item.globalIndex - 1]\n : actions[item.globalIndex] as action\n \"\n fdb-navigation-menu-item\n fdkFocusableItem\n [glyph]=\"action.glyph\"\n (click)=\"action.clickCallback()\"\n [label]=\"action.label\"\n ></li>\n </ng-container>\n </ng-container>\n </ul>\n </fdb-navigation-menu-popover>\n </fd-overflow-layout>\n <ng-container *ngIf=\"fdbToolHeaderState().userAvatarVisible && _toolHeaderUser\">\n <div fdbToolHeaderElement>\n <div class=\"fd-tool-header__separator\"></div>\n <ng-content select=\"[fdbToolHeaderUser]\"></ng-content>\n </div>\n </ng-container>\n <ng-container *ngIf=\"fdbToolHeaderState().productSwitchVisible && _toolHeaderProductSwitch\">\n <div fdbToolHeaderElement>\n <div class=\"fd-tool-header__separator\"></div>\n <ng-content select=\"fdb-tool-header-product-switch, fd-product-switch\"></ng-content>\n </div>\n </ng-container>\n <div fdbToolHeaderElement *ngIf=\"fdbToolHeaderState().voiceInputVisible\">\n <button\n fd-button\n fdbToolHeaderButton\n glyph=\"microphone\"\n [ariaLabel]=\"'Search with voice'\"\n (click)=\"microphoneClick.emit()\"\n ></button>\n </div>\n</div>\n", styles: ["@import\"../../../../../../node_modules/fundamental-styles/dist/tool-header.css\";.fd-popover__body.fdb-tool-header-actions-overflow-popover-body{--fdPopover_Offset: .3875rem;width:auto;height:auto;padding:.5rem;background:var(--sapGroup_ContentBackground);border:none;border-radius:.5rem;box-shadow:var(--sapMenu_Shadow1)}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu{--fdMenu_Item_Spacing_Left: 0}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu .fd-menu__link{--fdMenu_Link_Height: 2rem;border-radius:.375rem}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu .fd-menu__link:focus:after{display:none}.fd-popover__body.fdb-tool-header-actions-overflow-popover-body .fd-menu .fd-menu__link:focus:before{border:var(--sapContent_FocusWidth) var(--sapContent_FocusStyle) var(--sapContent_FocusColor);border-radius:.375rem;inset:.125rem;content:\"\";pointer-events:none;position:absolute}\n"] }]
559
+ }], propDecorators: { productName: [{
560
+ type: Input,
561
+ args: [{ required: true }]
562
+ }], secondTitle: [{
563
+ type: Input
564
+ }], _mode: [{
565
+ type: Input,
566
+ args: ['mode']
567
+ }], _orientation: [{
568
+ type: Input,
569
+ args: ['orientation']
570
+ }], showMenuButton: [{
571
+ type: Input,
572
+ args: [{ transform: coerceBooleanProperty }]
573
+ }], showVoiceInputAction: [{
574
+ type: Input,
575
+ args: [{ transform: coerceBooleanProperty }]
576
+ }], menuClick: [{
577
+ type: Output
578
+ }], menuExpand: [{
579
+ type: Output
580
+ }], menuCollapse: [{
581
+ type: Output
582
+ }], microphoneClick: [{
583
+ type: Output
584
+ }], logoClick: [{
585
+ type: Output
586
+ }], _toolHeaderActionsDirective: [{
587
+ type: ContentChild,
588
+ args: [ToolHeaderActionsDirective]
589
+ }], _toolHeaderLogoDirective: [{
590
+ type: ContentChild,
591
+ args: [ToolHeaderLogoDirective]
592
+ }], _searchField: [{
593
+ type: ContentChild,
594
+ args: [SearchFieldComponent]
595
+ }], _toolHeaderUser: [{
596
+ type: ContentChild,
597
+ args: [ToolHeaderUserDirective]
598
+ }], _toolHeaderProductSwitch: [{
599
+ type: ContentChild,
600
+ args: [FD_PRODUCT_SWITCH_COMPONENT$1]
601
+ }], _onClick: [{
602
+ type: HostListener,
603
+ args: ['document:click', ['$event']]
604
+ }] } });
605
+
606
+ const DEFAULT_CONFIG = {
607
+ desktop: ResponsiveBreakpoints.L + 1,
608
+ tabletLandscape: [ResponsiveBreakpoints.M + 1, ResponsiveBreakpoints.L],
609
+ tabletPortrait: [ResponsiveBreakpoints.S + 1, ResponsiveBreakpoints.M],
610
+ phone: ResponsiveBreakpoints.S
611
+ };
612
+ class ToolHeaderAutoModeDirective {
613
+ /**
614
+ * What sizes should be used to determine mode.
615
+ * Sizes mean the width of the tool header, not the whole screen.
616
+ **/
617
+ set config(config) {
618
+ this._config.set({ ...DEFAULT_CONFIG, ...config });
619
+ }
620
+ /**
621
+ * @hidden
622
+ */
623
+ constructor() {
624
+ /**
625
+ * Current mode of the ToolHeaderComponent
626
+ */
627
+ this.modeChange = new EventEmitter();
628
+ /**
629
+ * Current orientation of the ToolHeaderComponent
630
+ */
631
+ this.orientationChange = new EventEmitter();
632
+ /**
633
+ * Current content density of the ToolHeaderComponent
634
+ */
635
+ this.contentDensityChange = new EventEmitter();
636
+ /**
637
+ * Reference to the element on which the directive is applied.
638
+ */
639
+ this.elementRef = inject(ElementRef);
640
+ /**
641
+ * Current configuration of the directive.
642
+ */
643
+ this._config = signal(DEFAULT_CONFIG);
644
+ /** @hidden */
645
+ this._contentDensity = inject(ContentDensityDirective);
646
+ /**
647
+ * Signal of the Width of the element
648
+ */
649
+ this._elementWidth = toSignal(inject(ResizeObserverService)
650
+ .observe(this.elementRef.nativeElement)
651
+ .pipe(map((entries) => entries[0].contentRect.width), startWith(this.elementRef.nativeElement.clientWidth)), { requireSync: true });
652
+ /**
653
+ * Reference to the ToolHeaderComponent
654
+ */
655
+ this._toolHeaderComponent = inject(ToolHeaderComponent, { host: true });
656
+ /**
657
+ * Current mode of the ToolHeaderComponent
658
+ */
659
+ this._currentMode = computed(() => this._getMode(this._elementWidth(), this._config()));
660
+ toObservable(this._currentMode)
661
+ .pipe(distinctUntilChanged((a, b) => a[0] === b[0] && a[1] === b[1]), takeUntilDestroyed())
662
+ .subscribe((_mode) => {
663
+ const [mode, orientation = 'landscape'] = _mode;
664
+ this._toolHeaderComponent._mode = mode;
665
+ this._toolHeaderComponent._orientation = orientation;
666
+ const contentDensity = mode ? ContentDensityMode.COMPACT : ContentDensityMode.COZY;
667
+ this._contentDensity.fdContentDensity = contentDensity;
668
+ this.modeChange.emit(mode);
669
+ this.orientationChange.emit(orientation);
670
+ this.contentDensityChange.emit(contentDensity);
671
+ });
672
+ }
673
+ /**
674
+ * What mode should be used for the given width and configuration
675
+ * @param width
676
+ * @param config
677
+ * @private
678
+ */
679
+ _getMode(width, config) {
680
+ if (width >= config.desktop) {
681
+ return ['', 'landscape'];
682
+ }
683
+ if (width <= config.phone) {
684
+ return ['phone', 'landscape'];
685
+ }
686
+ return [
687
+ 'tablet',
688
+ width >= config.tabletLandscape[0] && width <= config.tabletLandscape[1] ? 'landscape' : 'portrait'
689
+ ];
690
+ }
691
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderAutoModeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
692
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ToolHeaderAutoModeDirective, isStandalone: true, selector: "fdb-tool-header[fdbToolHeaderAutoMode]", inputs: { config: "config" }, outputs: { modeChange: "modeChange", orientationChange: "orientationChange", contentDensityChange: "contentDensityChange" }, exportAs: ["fdbToolHeaderAutoMode"], hostDirectives: [{ directive: i1.ContentDensityDirective }], ngImport: i0 }); }
693
+ }
694
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ToolHeaderAutoModeDirective, decorators: [{
695
+ type: Directive,
696
+ args: [{
697
+ selector: 'fdb-tool-header[fdbToolHeaderAutoMode]',
698
+ exportAs: 'fdbToolHeaderAutoMode',
699
+ hostDirectives: [ContentDensityDirective],
700
+ standalone: true
701
+ }]
702
+ }], ctorParameters: function () { return []; }, propDecorators: { config: [{
703
+ type: Input
704
+ }], modeChange: [{
705
+ type: Output
706
+ }], orientationChange: [{
707
+ type: Output
708
+ }], contentDensityChange: [{
709
+ type: Output
710
+ }] } });
711
+
712
+ /**
713
+ * Generated bundle index. Do not edit.
714
+ */
715
+
716
+ export { ToolHeaderActionDirective, ToolHeaderActionsDirective, ToolHeaderAutoModeDirective, ToolHeaderButtonDirective, ToolHeaderComponent, ToolHeaderLogoDirective, ToolHeaderProductSwitchComponent, ToolHeaderUserDirective };
717
+ //# sourceMappingURL=fundamental-ngx-btp-tool-header.mjs.map