@hug/ngx-layout 22.0.0-alpha.1 → 22.0.0-alpha.2

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/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 22.0.0-alpha.2 (2026-03-18)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **filters-group:** add filters-group component #DESIGNSYS-177 ([dea1a5f](https://github.com/DSI-HUG/ngx-components/commit/dea1a5f))
6
+
7
+ ### ❤️ Thank You
8
+
9
+ - Esther Layat
10
+
1
11
  ## 22.0.0-alpha.1 (2026-03-13)
2
12
 
3
13
  ### 🚀 Features
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, signal, computed, inject, contentChildren, ElementRef, viewChild, Renderer2, DestroyRef, effect, ChangeDetectionStrategy, ViewEncapsulation, Component, input, output, Directive, contentChild, afterRenderEffect, untracked } from '@angular/core';
2
+ import { Injectable, signal, effect, computed, inject, contentChildren, ElementRef, viewChild, Renderer2, ChangeDetectionStrategy, ViewEncapsulation, Component, input, output, InjectionToken, TemplateRef, forwardRef, Directive, model, contentChild, afterRenderEffect, untracked } from '@angular/core';
3
3
  import * as i2 from '@angular/material/button';
4
4
  import { MatIconButton, MatButtonModule } from '@angular/material/button';
5
5
  import * as i1$1 from '@angular/material/icon';
@@ -9,8 +9,17 @@ import { MatMenuModule } from '@angular/material/menu';
9
9
  import * as i3 from '@angular/material/tooltip';
10
10
  import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
11
11
  import { NgxAbstractIntl, provideNgxIntl } from '@hug/ngx-core';
12
+ import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
13
+ import { NgTemplateOutlet, LowerCasePipe } from '@angular/common';
14
+ import * as i3$1 from '@angular/forms';
15
+ import { FormsModule, NgControl } from '@angular/forms';
16
+ import * as i4 from '@angular/material/badge';
17
+ import { MatBadgeModule } from '@angular/material/badge';
18
+ import * as i1$2 from '@angular/material/chips';
19
+ import { MatChipsModule } from '@angular/material/chips';
20
+ import * as i2$1 from '@angular/material/slide-toggle';
21
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
12
22
  import { toSignal } from '@angular/core/rxjs-interop';
13
- import { NgControl } from '@angular/forms';
14
23
 
15
24
  /**
16
25
  * Data for internationalization
@@ -21,6 +30,10 @@ class NgxLayoutIntl extends NgxAbstractIntl {
21
30
  deleteSearch = '';
22
31
  openSearchBar = '';
23
32
  moreActions = '';
33
+ allFilters = '';
34
+ filters = '';
35
+ actives = '';
36
+ reset = '';
24
37
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxLayoutIntl, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
25
38
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxLayoutIntl });
26
39
  }
@@ -45,21 +58,28 @@ const buttonDimensions = 40;
45
58
  * @param box
46
59
  * @param defaultSize
47
60
  */
48
- const resizeSignal = (element, destroyRef, box = 'border-box') => {
49
- const initialValue = {
50
- borderBoxSize: [],
51
- contentRect: element.getBoundingClientRect(),
52
- contentBoxSize: [],
53
- devicePixelContentBoxSize: [],
54
- target: element
55
- };
56
- const value = signal(initialValue, ...(ngDevMode ? [{ debugName: "value" }] : []));
57
- const ro = new ResizeObserver(entries => {
58
- value.set(entries[0] || initialValue);
59
- });
60
- ro.observe(element, { box });
61
- destroyRef.onDestroy(() => {
62
- ro.disconnect();
61
+ const resizeSignal$1 = (element, box = 'border-box') => {
62
+ const value = signal(undefined, ...(ngDevMode ? [{ debugName: "value" }] : []));
63
+ effect(onCleanup => {
64
+ const el = element()?.nativeElement;
65
+ if (!el) {
66
+ return;
67
+ }
68
+ const initialValue = {
69
+ borderBoxSize: [],
70
+ contentRect: new DOMRect(),
71
+ contentBoxSize: [],
72
+ devicePixelContentBoxSize: [],
73
+ target: el
74
+ };
75
+ value.set(initialValue);
76
+ const ro = new ResizeObserver(entries => {
77
+ value.set(entries[0] || initialValue);
78
+ });
79
+ ro.observe(el, { box });
80
+ onCleanup(() => {
81
+ ro.disconnect();
82
+ });
63
83
  });
64
84
  return value;
65
85
  };
@@ -74,9 +94,8 @@ class NgxActionsGroupComponent {
74
94
  hiddenContainer = viewChild.required('hiddenContainer');
75
95
  hostElement = inject(ElementRef);
76
96
  renderer = inject(Renderer2);
77
- destroyRef = inject(DestroyRef);
78
- hostSize = resizeSignal(this.hostElement.nativeElement, this.destroyRef);
79
- hostWidth = computed(() => this.hostSize().contentRect.width, ...(ngDevMode ? [{ debugName: "hostWidth" }] : []));
97
+ hostSize = resizeSignal$1(() => this.hostElement);
98
+ hostWidth = computed(() => Math.ceil(this.hostSize()?.contentRect.width || 0), ...(ngDevMode ? [{ debugName: "hostWidth" }] : []));
80
99
  visibleActions = computed(() => {
81
100
  const maxVisible = this.getMaxVisibleAction(this.hostWidth());
82
101
  return this.iconButtons().slice(0, maxVisible);
@@ -167,6 +186,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
167
186
  }, template: "@if (withBackIcon()) {\n <button matIconButton matTooltip=\"{{ intl?.back ?? 'Back' }}\" (click)=\"triggerGoBack()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n}\n\n<header class=\"{{ mode() }}\">\n <h1 class=\"title\">{{ title() }}</h1>\n @if (subtitle()) {\n @if (mode() === 'condensed') {\n <mat-icon>chevron_right</mat-icon>\n }\n <h2 class=\"subtitle\">{{ subtitle() }}</h2>\n }\n</header>\n\n<section class=\"actions\">\n <ng-content />\n @if (helpUrl()) {\n <button matIconButton matTooltip=\"{{ intl?.help ?? 'Help' }}\" (click)=\"openHelp()\">\n <mat-icon>help</mat-icon>\n </button>\n }\n</section>\n", styles: ["ngx-app-bar{display:flex;flex-direction:row;align-items:center;min-height:var(--ngx-app-bar-min-height, 3.5rem);box-sizing:border-box;gap:var(--ngx-app-bar-gap, .25rem)}ngx-app-bar header{color:var(--mat-sys-on-surface-variant)}ngx-app-bar header.condensed{display:flex;flex-direction:row;align-items:center;gap:var(--ngx-app-bar-condensed-gap, .5rem)}ngx-app-bar header.condensed mat-icon{color:var(--mat-sys-outline)}ngx-app-bar header .title,ngx-app-bar header .subtitle{margin:0;white-space:nowrap}ngx-app-bar header .title{font:var(--ngx-app-bar-title-font, var(--mat-sys-headline-medium));letter-spacing:var(--ngx-app-bar-title-letter-spacing, var(--mat-sys-headline-medium-tracking))}ngx-app-bar header .subtitle{font:var(--ngx-app-bar-subtitle-font, var(--mat-sys-headline-small));letter-spacing:var(--ngx-app-bar-subtitle-letter-spacing, var(--mat-sys-headline-small-tracking))}ngx-app-bar .actions{display:flex;justify-content:flex-end;flex-grow:1;gap:var(--ngx-app-bar-actions-gap, .5rem)}\n"] }]
168
187
  }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], helpUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "helpUrl", required: false }] }], withBackIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "withBackIcon", required: false }] }], goBack: [{ type: i0.Output, args: ["goBack"] }] } });
169
188
 
189
+ // eslint-disable-next-line @typescript-eslint/naming-convention
190
+ const FILTER_TOKEN = new InjectionToken('FILTER_TOKEN');
191
+
192
+ class NgxFilterDirective {
193
+ type = 'complex';
194
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
195
+ active = input.required(...(ngDevMode ? [{ debugName: "active" }] : []));
196
+ selectedFilterLabel = input('', ...(ngDevMode ? [{ debugName: "selectedFilterLabel" }] : []));
197
+ templateRef = inject(TemplateRef);
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxFilterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
199
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.1", type: NgxFilterDirective, isStandalone: true, selector: "ng-template[ngx-filter]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: true, transformFunction: null }, selectedFilterLabel: { classPropertyName: "selectedFilterLabel", publicName: "selectedFilterLabel", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: FILTER_TOKEN, useExisting: forwardRef(() => NgxFilterDirective) }], ngImport: i0 });
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxFilterDirective, decorators: [{
202
+ type: Directive,
203
+ args: [{
204
+ selector: 'ng-template[ngx-filter]',
205
+ standalone: true,
206
+ providers: [{ provide: FILTER_TOKEN, useExisting: forwardRef(() => NgxFilterDirective) }]
207
+ }]
208
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: true }] }], selectedFilterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedFilterLabel", required: false }] }] } });
209
+
210
+ class NgxFilterToggleDirective {
211
+ type = 'toggle';
212
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
213
+ active = model.required(...(ngDevMode ? [{ debugName: "active" }] : []));
214
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxFilterToggleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
215
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.1", type: NgxFilterToggleDirective, isStandalone: true, selector: "ng-template[ngx-filter-toggle]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { active: "activeChange" }, providers: [{ provide: FILTER_TOKEN, useExisting: forwardRef(() => NgxFilterToggleDirective) }], ngImport: i0 });
216
+ }
217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxFilterToggleDirective, decorators: [{
218
+ type: Directive,
219
+ args: [{
220
+ selector: 'ng-template[ngx-filter-toggle]',
221
+ standalone: true,
222
+ providers: [{ provide: FILTER_TOKEN, useExisting: forwardRef(() => NgxFilterToggleDirective) }]
223
+ }]
224
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: true }] }, { type: i0.Output, args: ["activeChange"] }] } });
225
+
226
+ const resizeSignal = (element, box = 'border-box') => {
227
+ const value = signal(undefined, ...(ngDevMode ? [{ debugName: "value" }] : []));
228
+ effect(onCleanup => {
229
+ const el = element()?.nativeElement;
230
+ if (!el) {
231
+ return;
232
+ }
233
+ const initialValue = {
234
+ borderBoxSize: [],
235
+ contentRect: new DOMRect(),
236
+ contentBoxSize: [],
237
+ devicePixelContentBoxSize: [],
238
+ target: el
239
+ };
240
+ value.set(initialValue);
241
+ const ro = new ResizeObserver(entries => {
242
+ value.set(entries[0] || initialValue);
243
+ });
244
+ ro.observe(el, { box });
245
+ onCleanup(() => {
246
+ ro.disconnect();
247
+ });
248
+ });
249
+ return value;
250
+ };
251
+ class NgxFiltersGroupComponent {
252
+ resetFilters = output();
253
+ folded = input(...(ngDevMode ? [undefined, { debugName: "folded" }] : []));
254
+ intl = inject(NgxLayoutIntl, { optional: true });
255
+ // #region Overlay
256
+ overlayOrigin = signal(undefined, ...(ngDevMode ? [{ debugName: "overlayOrigin" }] : []));
257
+ overlayContent = signal(undefined, ...(ngDevMode ? [{ debugName: "overlayContent" }] : []));
258
+ overlayOpen = signal(false, ...(ngDevMode ? [{ debugName: "overlayOpen" }] : []));
259
+ moreFiltersOverlay = signal(false, ...(ngDevMode ? [{ debugName: "moreFiltersOverlay" }] : []));
260
+ overlayPositions = [{
261
+ originX: 'center',
262
+ originY: 'bottom',
263
+ overlayX: 'center',
264
+ overlayY: 'top',
265
+ offsetY: 16
266
+ }, {
267
+ originX: 'end',
268
+ originY: 'bottom',
269
+ overlayX: 'end',
270
+ overlayY: 'top',
271
+ offsetY: 16
272
+ }];
273
+ // #endregion
274
+ // #region Filters
275
+ allFilters = contentChildren(FILTER_TOKEN, ...(ngDevMode ? [{ debugName: "allFilters" }] : []));
276
+ activeFiltersAmount = computed(() => this.invisibleFilters().filter(filter => filter.active()).length, ...(ngDevMode ? [{ debugName: "activeFiltersAmount" }] : []));
277
+ visibleFilters = computed(() => {
278
+ const lastFittingIndex = this.lastFittingIndex();
279
+ if (lastFittingIndex < 0) {
280
+ return [];
281
+ }
282
+ return this.allFilters().slice(0, lastFittingIndex);
283
+ }, ...(ngDevMode ? [{ debugName: "visibleFilters" }] : []));
284
+ invisibleFilters = computed(() => {
285
+ const lastFittingIndex = this.lastFittingIndex();
286
+ if (lastFittingIndex < 0) {
287
+ return this.allFilters();
288
+ }
289
+ return this.allFilters().slice(lastFittingIndex);
290
+ }, ...(ngDevMode ? [{ debugName: "invisibleFilters" }] : []));
291
+ filterContainerRef = viewChild.required('container');
292
+ filterContainerPadding = computed(() => Number.parseFloat(globalThis.getComputedStyle(this.filterContainerRef().nativeElement).paddingInline), ...(ngDevMode ? [{ debugName: "filterContainerPadding" }] : []));
293
+ // #endregion
294
+ // #region Host
295
+ hostElement = inject(ElementRef);
296
+ hostSize = resizeSignal(() => this.hostElement);
297
+ hostWidth = computed(() => Math.ceil(this.hostSize()?.contentRect.width || 0), ...(ngDevMode ? [{ debugName: "hostWidth" }] : []));
298
+ // #endregion
299
+ // #region MeasureRow
300
+ measureRowRef = viewChild('measureRow', ...(ngDevMode ? [{ debugName: "measureRowRef" }] : []));
301
+ measureRowSize = resizeSignal(() => this.measureRowRef());
302
+ measureRowWidth = computed(() => Math.ceil(this.measureRowSize()?.contentRect.width || 0), ...(ngDevMode ? [{ debugName: "measureRowWidth" }] : []));
303
+ // #endregion
304
+ // #region StaticFields
305
+ staticFieldsRef = viewChild('static', ...(ngDevMode ? [{ debugName: "staticFieldsRef" }] : []));
306
+ staticFieldsSize = resizeSignal(() => this.staticFieldsRef());
307
+ staticFieldsWidth = computed(() => Math.ceil(this.staticFieldsSize()?.contentRect.width || 0), ...(ngDevMode ? [{ debugName: "staticFieldsWidth" }] : []));
308
+ // #endregion
309
+ lastFittingIndex = computed(() => {
310
+ const hostWidth = this.hostWidth();
311
+ if (!hostWidth) {
312
+ return -1;
313
+ }
314
+ const availableSpace = hostWidth - (this.staticFieldsWidth() + (2 * this.filterContainerPadding()));
315
+ const filters = Array.from(this.measureRowRef()?.nativeElement.querySelectorAll('mat-chip-option') ?? []);
316
+ if (availableSpace - this.measureRowWidth() >= 0) {
317
+ return filters.length;
318
+ }
319
+ return this.getLastFittingIndex(availableSpace, filters);
320
+ }, ...(ngDevMode ? [{ debugName: "lastFittingIndex" }] : []));
321
+ emitResetClicked() {
322
+ this.resetFilters.emit();
323
+ }
324
+ getLastFittingIndex(availableSpace, elements) {
325
+ const firstEl = elements[0];
326
+ if (!firstEl || availableSpace <= 0 || availableSpace - firstEl.offsetWidth < 0) {
327
+ return -1;
328
+ }
329
+ let residualAvailableSpace = availableSpace;
330
+ const lastFittingIndex = elements.findIndex(el => {
331
+ residualAvailableSpace -= el.offsetWidth + 16;
332
+ return residualAvailableSpace <= 0;
333
+ });
334
+ return lastFittingIndex >= 0 ? lastFittingIndex : elements.length - 1;
335
+ }
336
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxFiltersGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
337
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: NgxFiltersGroupComponent, isStandalone: true, selector: "ngx-filters-group", inputs: { folded: { classPropertyName: "folded", publicName: "folded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetFilters: "resetFilters" }, queries: [{ propertyName: "allFilters", predicate: FILTER_TOKEN, isSignal: true }], viewQueries: [{ propertyName: "filterContainerRef", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "measureRowRef", first: true, predicate: ["measureRow"], descendants: true, isSignal: true }, { propertyName: "staticFieldsRef", first: true, predicate: ["static"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (folded()) {\n <section\n class=\"filter-container\"\n #container\n [matBadge]=\"activeFiltersAmount()\"\n [matBadgeHidden]=\"activeFiltersAmount() <= 0\">\n <button\n mat-icon-button\n aria-label=\"All filters\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(moreFilters);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(true)\n \"\n matTooltip=\"{{ intl?.allFilters ?? 'All filters' }}\">\n <mat-icon>filter_alt</mat-icon>\n </button>\n </section>\n} @else {\n @if (allFilters()) {\n <section #measureRow class=\"measure-row\">\n <mat-chip-set>\n @for (f of allFilters(); track $index) {\n <mat-chip-option [selectable]=\"false\" [selected]=\"f.active()\">\n {{ f.label() }}\n @if (f.type === 'complex' && f.selectedFilterLabel()) {\n <span class=\"selected-label\">: {{ f.selectedFilterLabel() }}</span>\n }\n @if (f.type === 'complex') {\n <mat-icon matChipTrailingIcon>arrow_drop_down</mat-icon>\n }\n </mat-chip-option>\n }\n <mat-chip #overflowMeasure>\n +00 {{ intl?.filters ?? 'Filters' | lowercase }} (00 {{ intl?.actives ?? 'Actives' | lowercase }})\n <mat-icon matChipTrailingIcon>arrow_drop_down</mat-icon>\n </mat-chip>\n </mat-chip-set>\n </section>\n }\n\n <section class=\"filter-container\" #container>\n <mat-chip-set>\n @if (this.visibleFilters().length) {\n @for (f of visibleFilters(); track $index) {\n @if (f.type === 'toggle') {\n <mat-chip-option\n selectable=\"true\"\n [selected]=\"f.active()\"\n (selectionChange)=\"f.active.set($event.selected)\">\n {{ f.label() }}\n </mat-chip-option>\n } @else {\n <mat-chip-option\n [selectable]=\"false\"\n [selected]=\"f.active()\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(f.templateRef);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(false)\n \">\n {{ f.label() }}\n @if (f.selectedFilterLabel()) {\n <span class=\"selected-label\">: {{ f.selectedFilterLabel() }}</span>\n }\n <mat-icon\n [class.is-overlay-open]=\"this.overlayOpen() && this.overlayContent() === f.templateRef\"\n matChipTrailingIcon>\n arrow_drop_down\n </mat-icon>\n </mat-chip-option>\n }\n }\n }\n </mat-chip-set>\n <section class=\"static\" #static>\n @if (invisibleFilters().length; as invisibleFiltersAmount) {\n <mat-chip-set>\n <mat-chip\n cdkOverlayOrigin\n [class.filter-active]=\"activeFiltersAmount()\"\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(moreFilters);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(true)\n \">\n +{{ invisibleFiltersAmount }} {{ intl?.filters ?? 'Filters' | lowercase }} ({{\n activeFiltersAmount()\n }}\n {{ intl?.actives ?? 'Actives' | lowercase }})\n <mat-icon\n [class.is-overlay-open]=\"this.overlayOpen() && this.overlayContent() === moreFilters\"\n matChipTrailingIcon>\n arrow_drop_down\n </mat-icon>\n </mat-chip>\n </mat-chip-set>\n }\n <button\n mat-icon-button\n aria-label=\"Reset filters\"\n (click)=\"emitResetClicked()\"\n matTooltip=\"{{ intl?.reset ?? 'Reset' }}\">\n <mat-icon>settings_backup_restore</mat-icon>\n </button>\n </section>\n </section>\n}\n\n<ng-template #moreFilters>\n @if (allFilters()) {\n @for (f of allFilters(); track $index) {\n @if (f.type === 'toggle') {\n <section class=\"filter\">\n <mat-slide-toggle labelPosition=\"before\" [(ngModel)]=\"f.active\">\n {{ f.label() }}\n </mat-slide-toggle>\n </section>\n } @else {\n <section class=\"filter\">\n <div class=\"title\">\n <span class=\"label\">{{ f.label() }}</span>\n <span class=\"value\">{{ f.selectedFilterLabel() }}</span>\n </div>\n @if (f.templateRef) {\n <ng-container *ngTemplateOutlet=\"f.templateRef\"></ng-container>\n }\n </section>\n }\n }\n }\n</ng-template>\n\n@let overlayOrigin = this.overlayOrigin();\n@let overlayOpen = this.overlayOpen();\n@let overlayContent = this.overlayContent();\n@if (overlayOrigin && overlayOpen && overlayContent) {\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n (detach)=\"this.overlayOpen.set(false)\"\n cdkConnectedOverlayHasBackdrop=\"true\"\n backdrop\n (backdropClick)=\"this.overlayOpen.set(false)\"\n cdkConnectedOverlayPanelClass=\"filter-group--overlay\"\n cdkConnectedOverlayBackdropClass=\"filter-group--overlay--backdrop--transparent\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"32\">\n @if (moreFiltersOverlay()) {\n <div class=\"filters--title\">\n <span>{{ intl?.filters ?? 'Filters' }}</span>\n <button\n mat-icon-button\n aria-label=\"Reset filters\"\n (click)=\"emitResetClicked()\"\n matTooltip=\"{{ intl?.reset ?? 'Reset' }}\">\n <mat-icon>settings_backup_restore</mat-icon>\n </button>\n </div>\n }\n <div class=\"filters--content\">\n <ng-container *ngTemplateOutlet=\"overlayContent\"></ng-container>\n </div>\n </ng-template>\n}\n", styles: ["ngx-filters-group{flex:1;display:flex;flex-direction:row;justify-content:end}ngx-filters-group .selected-label{max-width:var(--ngx-filters-group-selected-label-max-width, 27ch);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}ngx-filters-group .measure-row{display:flex;flex-direction:row;gap:var(--ngx-filters-group-gap, .5rem);position:absolute;visibility:hidden;pointer-events:none}ngx-filters-group .filter-container{display:flex;flex-direction:row;align-items:center;gap:var(--ngx-filters-group-gap, .5rem);block-size:var(--ngx-filters-group-block-size, 3rem);border-radius:var(--ngx-filters-group-border-radius, 2rem);padding-inline:var(--ngx-filters-group-padding-inline, .5rem);background-color:var(--mat-sys-surface-container-low)}ngx-filters-group .filter-container .static{display:flex;flex-direction:row;gap:var(--ngx-filters-group-gap, .5rem)}ngx-filters-group .filter-container .static mat-chip:first-child{--mat-chip-container-shape-radius: var(--ngx-filters-group-first-chip-shape-radius, .5rem)}ngx-filters-group .filter-container .static mat-chip.filter-active{--mat-chip-elevated-container-color: var(--mat-sys-secondary-container);--mat-chip-outline-color: transparent}ngx-filters-group .filter-container mat-chip-set>div{flex-wrap:nowrap}ngx-filters-group .filter-container mat-chip,ngx-filters-group .filter-container mat-chip-option{min-width:0}ngx-filters-group .filter-container mat-chip:first-child,ngx-filters-group .filter-container mat-chip-option:first-child{--mat-chip-container-shape-radius: var(--ngx-filters-group-first-chip-option-shape-radius, 1rem .5rem .5rem 1rem)}ngx-filters-group .filter-container mat-chip .mat-mdc-chip-action-label,ngx-filters-group .filter-container mat-chip-option .mat-mdc-chip-action-label{display:flex;align-items:center}ngx-filters-group .filter-container mat-chip .is-overlay-open,ngx-filters-group .filter-container mat-chip-option .is-overlay-open{transform:rotate(180deg)}ngx-filters-group .filter-container:has(>button:only-of-type){padding-inline:var(--ngx-filters-group-folded-padding-inline, .25rem)}.filter-group--overlay{display:flex;flex-direction:column;background-color:var(--mat-sys-surface-container-high);border-radius:var(--ngx-filters-group-overlay-border-radius, .5rem);overflow:hidden}.filter-group--overlay mat-slide-toggle>*{width:100%;justify-content:space-between}.filter-group--overlay mat-slide-toggle>* label{margin:0}.filter-group--overlay{--filter-padding: var(--ngx-filters-group-overlay-filter-padding, 1rem)}.filter-group--overlay .filters--title{border-block-end:1px solid var(--mat-sys-outline-variant);display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding-inline:var(--filter-padding);padding-block:calc(var(--filter-padding) / 4)}.filter-group--overlay .filters--content{min-width:18.75rem;overflow:auto;display:flex;flex-direction:column;justify-items:stretch;gap:var(--ngx-filters-group-overlay-filter-gap, .5rem);padding:var(--filter-padding)}.filter-group--overlay .filters--content .filter{display:flex;flex-direction:column;gap:var(--ngx-filters-group-overlay-filter-gap, .5rem);padding-block:var(--filter-padding)}.filter-group--overlay .filters--content .filter:not(:last-child){border-bottom:1px dashed var(--mat-sys-outline-variant)}.filter-group--overlay .filters--content .filter:last-child{padding-block-end:unset}.filter-group--overlay .filters--content .filter:first-child{padding-block-start:unset}.filter-group--overlay .filters--content .filter .title{display:inline-flex;justify-content:space-between;align-items:baseline}.filter-group--overlay .filters--content .filter .title .label{font:var(--mat-sys-label-large)}.filter-group--overlay .filters--content .filter .title .value{font:var(--mat-sys-label-medium);max-width:var(--ngx-filters-group-overlay-max-width, 27ch);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.filter-group--overlay .filters--content .filter>[no-padding]{margin-inline:-1rem}.filter-group--overlay--backdrop--transparent{background-color:transparent}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i1$2.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i1$2.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: i1$2.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: i1$2.MatChipTrailingIcon, selector: "mat-chip-trailing-icon, [matChipTrailingIcon]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: 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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i4.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
338
+ }
339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxFiltersGroupComponent, decorators: [{
340
+ type: Component,
341
+ args: [{ selector: 'ngx-filters-group', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
342
+ MatIcon,
343
+ MatIconButton,
344
+ MatChipsModule,
345
+ MatTooltip,
346
+ NgTemplateOutlet,
347
+ CdkConnectedOverlay,
348
+ CdkOverlayOrigin,
349
+ MatSlideToggleModule,
350
+ FormsModule,
351
+ MatBadgeModule,
352
+ LowerCasePipe
353
+ ], template: "@if (folded()) {\n <section\n class=\"filter-container\"\n #container\n [matBadge]=\"activeFiltersAmount()\"\n [matBadgeHidden]=\"activeFiltersAmount() <= 0\">\n <button\n mat-icon-button\n aria-label=\"All filters\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(moreFilters);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(true)\n \"\n matTooltip=\"{{ intl?.allFilters ?? 'All filters' }}\">\n <mat-icon>filter_alt</mat-icon>\n </button>\n </section>\n} @else {\n @if (allFilters()) {\n <section #measureRow class=\"measure-row\">\n <mat-chip-set>\n @for (f of allFilters(); track $index) {\n <mat-chip-option [selectable]=\"false\" [selected]=\"f.active()\">\n {{ f.label() }}\n @if (f.type === 'complex' && f.selectedFilterLabel()) {\n <span class=\"selected-label\">: {{ f.selectedFilterLabel() }}</span>\n }\n @if (f.type === 'complex') {\n <mat-icon matChipTrailingIcon>arrow_drop_down</mat-icon>\n }\n </mat-chip-option>\n }\n <mat-chip #overflowMeasure>\n +00 {{ intl?.filters ?? 'Filters' | lowercase }} (00 {{ intl?.actives ?? 'Actives' | lowercase }})\n <mat-icon matChipTrailingIcon>arrow_drop_down</mat-icon>\n </mat-chip>\n </mat-chip-set>\n </section>\n }\n\n <section class=\"filter-container\" #container>\n <mat-chip-set>\n @if (this.visibleFilters().length) {\n @for (f of visibleFilters(); track $index) {\n @if (f.type === 'toggle') {\n <mat-chip-option\n selectable=\"true\"\n [selected]=\"f.active()\"\n (selectionChange)=\"f.active.set($event.selected)\">\n {{ f.label() }}\n </mat-chip-option>\n } @else {\n <mat-chip-option\n [selectable]=\"false\"\n [selected]=\"f.active()\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(f.templateRef);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(false)\n \">\n {{ f.label() }}\n @if (f.selectedFilterLabel()) {\n <span class=\"selected-label\">: {{ f.selectedFilterLabel() }}</span>\n }\n <mat-icon\n [class.is-overlay-open]=\"this.overlayOpen() && this.overlayContent() === f.templateRef\"\n matChipTrailingIcon>\n arrow_drop_down\n </mat-icon>\n </mat-chip-option>\n }\n }\n }\n </mat-chip-set>\n <section class=\"static\" #static>\n @if (invisibleFilters().length; as invisibleFiltersAmount) {\n <mat-chip-set>\n <mat-chip\n cdkOverlayOrigin\n [class.filter-active]=\"activeFiltersAmount()\"\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(moreFilters);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(true)\n \">\n +{{ invisibleFiltersAmount }} {{ intl?.filters ?? 'Filters' | lowercase }} ({{\n activeFiltersAmount()\n }}\n {{ intl?.actives ?? 'Actives' | lowercase }})\n <mat-icon\n [class.is-overlay-open]=\"this.overlayOpen() && this.overlayContent() === moreFilters\"\n matChipTrailingIcon>\n arrow_drop_down\n </mat-icon>\n </mat-chip>\n </mat-chip-set>\n }\n <button\n mat-icon-button\n aria-label=\"Reset filters\"\n (click)=\"emitResetClicked()\"\n matTooltip=\"{{ intl?.reset ?? 'Reset' }}\">\n <mat-icon>settings_backup_restore</mat-icon>\n </button>\n </section>\n </section>\n}\n\n<ng-template #moreFilters>\n @if (allFilters()) {\n @for (f of allFilters(); track $index) {\n @if (f.type === 'toggle') {\n <section class=\"filter\">\n <mat-slide-toggle labelPosition=\"before\" [(ngModel)]=\"f.active\">\n {{ f.label() }}\n </mat-slide-toggle>\n </section>\n } @else {\n <section class=\"filter\">\n <div class=\"title\">\n <span class=\"label\">{{ f.label() }}</span>\n <span class=\"value\">{{ f.selectedFilterLabel() }}</span>\n </div>\n @if (f.templateRef) {\n <ng-container *ngTemplateOutlet=\"f.templateRef\"></ng-container>\n }\n </section>\n }\n }\n }\n</ng-template>\n\n@let overlayOrigin = this.overlayOrigin();\n@let overlayOpen = this.overlayOpen();\n@let overlayContent = this.overlayContent();\n@if (overlayOrigin && overlayOpen && overlayContent) {\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n (detach)=\"this.overlayOpen.set(false)\"\n cdkConnectedOverlayHasBackdrop=\"true\"\n backdrop\n (backdropClick)=\"this.overlayOpen.set(false)\"\n cdkConnectedOverlayPanelClass=\"filter-group--overlay\"\n cdkConnectedOverlayBackdropClass=\"filter-group--overlay--backdrop--transparent\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"32\">\n @if (moreFiltersOverlay()) {\n <div class=\"filters--title\">\n <span>{{ intl?.filters ?? 'Filters' }}</span>\n <button\n mat-icon-button\n aria-label=\"Reset filters\"\n (click)=\"emitResetClicked()\"\n matTooltip=\"{{ intl?.reset ?? 'Reset' }}\">\n <mat-icon>settings_backup_restore</mat-icon>\n </button>\n </div>\n }\n <div class=\"filters--content\">\n <ng-container *ngTemplateOutlet=\"overlayContent\"></ng-container>\n </div>\n </ng-template>\n}\n", styles: ["ngx-filters-group{flex:1;display:flex;flex-direction:row;justify-content:end}ngx-filters-group .selected-label{max-width:var(--ngx-filters-group-selected-label-max-width, 27ch);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}ngx-filters-group .measure-row{display:flex;flex-direction:row;gap:var(--ngx-filters-group-gap, .5rem);position:absolute;visibility:hidden;pointer-events:none}ngx-filters-group .filter-container{display:flex;flex-direction:row;align-items:center;gap:var(--ngx-filters-group-gap, .5rem);block-size:var(--ngx-filters-group-block-size, 3rem);border-radius:var(--ngx-filters-group-border-radius, 2rem);padding-inline:var(--ngx-filters-group-padding-inline, .5rem);background-color:var(--mat-sys-surface-container-low)}ngx-filters-group .filter-container .static{display:flex;flex-direction:row;gap:var(--ngx-filters-group-gap, .5rem)}ngx-filters-group .filter-container .static mat-chip:first-child{--mat-chip-container-shape-radius: var(--ngx-filters-group-first-chip-shape-radius, .5rem)}ngx-filters-group .filter-container .static mat-chip.filter-active{--mat-chip-elevated-container-color: var(--mat-sys-secondary-container);--mat-chip-outline-color: transparent}ngx-filters-group .filter-container mat-chip-set>div{flex-wrap:nowrap}ngx-filters-group .filter-container mat-chip,ngx-filters-group .filter-container mat-chip-option{min-width:0}ngx-filters-group .filter-container mat-chip:first-child,ngx-filters-group .filter-container mat-chip-option:first-child{--mat-chip-container-shape-radius: var(--ngx-filters-group-first-chip-option-shape-radius, 1rem .5rem .5rem 1rem)}ngx-filters-group .filter-container mat-chip .mat-mdc-chip-action-label,ngx-filters-group .filter-container mat-chip-option .mat-mdc-chip-action-label{display:flex;align-items:center}ngx-filters-group .filter-container mat-chip .is-overlay-open,ngx-filters-group .filter-container mat-chip-option .is-overlay-open{transform:rotate(180deg)}ngx-filters-group .filter-container:has(>button:only-of-type){padding-inline:var(--ngx-filters-group-folded-padding-inline, .25rem)}.filter-group--overlay{display:flex;flex-direction:column;background-color:var(--mat-sys-surface-container-high);border-radius:var(--ngx-filters-group-overlay-border-radius, .5rem);overflow:hidden}.filter-group--overlay mat-slide-toggle>*{width:100%;justify-content:space-between}.filter-group--overlay mat-slide-toggle>* label{margin:0}.filter-group--overlay{--filter-padding: var(--ngx-filters-group-overlay-filter-padding, 1rem)}.filter-group--overlay .filters--title{border-block-end:1px solid var(--mat-sys-outline-variant);display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding-inline:var(--filter-padding);padding-block:calc(var(--filter-padding) / 4)}.filter-group--overlay .filters--content{min-width:18.75rem;overflow:auto;display:flex;flex-direction:column;justify-items:stretch;gap:var(--ngx-filters-group-overlay-filter-gap, .5rem);padding:var(--filter-padding)}.filter-group--overlay .filters--content .filter{display:flex;flex-direction:column;gap:var(--ngx-filters-group-overlay-filter-gap, .5rem);padding-block:var(--filter-padding)}.filter-group--overlay .filters--content .filter:not(:last-child){border-bottom:1px dashed var(--mat-sys-outline-variant)}.filter-group--overlay .filters--content .filter:last-child{padding-block-end:unset}.filter-group--overlay .filters--content .filter:first-child{padding-block-start:unset}.filter-group--overlay .filters--content .filter .title{display:inline-flex;justify-content:space-between;align-items:baseline}.filter-group--overlay .filters--content .filter .title .label{font:var(--mat-sys-label-large)}.filter-group--overlay .filters--content .filter .title .value{font:var(--mat-sys-label-medium);max-width:var(--ngx-filters-group-overlay-max-width, 27ch);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.filter-group--overlay .filters--content .filter>[no-padding]{margin-inline:-1rem}.filter-group--overlay--backdrop--transparent{background-color:transparent}\n"] }]
354
+ }], propDecorators: { resetFilters: [{ type: i0.Output, args: ["resetFilters"] }], folded: [{ type: i0.Input, args: [{ isSignal: true, alias: "folded", required: false }] }], allFilters: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FILTER_TOKEN), { isSignal: true }] }], filterContainerRef: [{ type: i0.ViewChild, args: ['container', { isSignal: true }] }], measureRowRef: [{ type: i0.ViewChild, args: ['measureRow', { isSignal: true }] }], staticFieldsRef: [{ type: i0.ViewChild, args: ['static', { isSignal: true }] }] } });
355
+
170
356
  class NgxLayoutComponent {
171
357
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
172
358
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.1", type: NgxLayoutComponent, isStandalone: true, selector: "ngx-layout", ngImport: i0, template: "<ng-content select=\"ngx-app-bar\"></ng-content>\n<ng-content select=\"ngx-main-bar\"></ng-content>\n<!--\n The ng-content's is not clearly defined yet. The potential use-cases are:\n - Display GPD bars\n - Display warnings\n -->\n<ng-content></ng-content>\n<section class=\"content\">\n <ng-content select=\"ngx-panel\"></ng-content>\n</section>\n", styles: [":host{display:flex;flex-direction:column;flex:1 1 0;background-color:var(--mat-sys-surface-container);padding-block-end:var(--ngx-layout-padding-block-end, .75rem);padding-inline:var(--ngx-layout-padding-inline, 1rem);box-sizing:border-box}:host .content{display:flex;flex:1 1 0;overflow:hidden;gap:var(--ngx-layout-content-gap, .5rem);padding-block:var(--ngx-layout-content-padding-block, .25rem)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -278,7 +464,7 @@ class NgxSearchBarContainerComponent {
278
464
  const searchText = untracked(this.searchText);
279
465
  const blurred = this.searchInput()?.blurred();
280
466
  if (blurred && !searchText) {
281
- this.toggleFolded();
467
+ this.manualFoldingState.set(true);
282
468
  }
283
469
  }
284
470
  });
@@ -295,16 +481,16 @@ class NgxSearchBarContainerComponent {
295
481
  searchInput.focus();
296
482
  }
297
483
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxSearchBarContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: NgxSearchBarContainerComponent, isStandalone: true, selector: "ngx-search-bar-container", inputs: { folded: { classPropertyName: "folded", publicName: "folded", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "searchInput", first: true, predicate: NgxSearchInputDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isFolded()) {\n <button\n matIconButton\n aria-label=\"Open search bar\"\n (click)=\"toggleFolded()\"\n matTooltip=\"{{ intl?.openSearchBar ?? 'Open search bar' }}\">\n <mat-icon>search</mat-icon>\n </button>\n} @else {\n <ng-content select=\"[ngx-search-input]\"></ng-content>\n\n @if (searchText()) {\n <button\n matIconButton\n aria-label=\"Clear button\"\n (click)=\"resetInput()\"\n matTooltip=\"{{ intl?.deleteSearch ?? 'Clear search' }}\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"icon-search-bar\" aria-hidden=\"false\" aria-label=\"Search icon\" fontIcon=\"search\" />\n }\n}\n", styles: ["ngx-search-bar-container{display:flex;align-items:center;block-size:var(--ngx-search-bar-container-block-size, 3rem);border-radius:var(--ngx-search-bar-container-radius, 2rem);padding-inline-start:var(--ngx-search-bar-container-padding-inline-start, 1.125rem);padding-inline-end:var(--ngx-search-bar-container-padding-inline-end, .25rem);background-color:var(--mat-sys-surface-container-high);gap:var(--ngx-search-bar-container-gap, .125rem)}ngx-search-bar-container:has(button:only-child){width:fit-content;padding:var(--ngx-search-bar-folded-container-padding, 0 .25rem)}ngx-search-bar-container>input[ngx-search-input]{font:var(--mat-sys-body-large);letter-spacing:var(--mat-sys-body-large-tracking);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}ngx-search-bar-container>input[ngx-search-input]::placeholder{color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container mat-icon.icon-search-bar{padding:var(--ngx-search-bar-icon-padding, .5rem);color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container [ngx-search-input]{flex:1;background:none;border:none}ngx-search-bar-container [ngx-search-input]:focus{outline:none}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
484
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: NgxSearchBarContainerComponent, isStandalone: true, selector: "ngx-search-bar-container", inputs: { folded: { classPropertyName: "folded", publicName: "folded", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "searchInput", first: true, predicate: NgxSearchInputDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isFolded()) {\n <button\n matIconButton\n aria-label=\"Open search bar\"\n (click)=\"toggleFolded()\"\n matTooltip=\"{{ intl?.openSearchBar ?? 'Open search bar' }}\">\n <mat-icon>search</mat-icon>\n </button>\n} @else {\n <ng-content select=\"[ngx-search-input]\"></ng-content>\n\n @if (searchText()) {\n <button\n matIconButton\n aria-label=\"Clear button\"\n (click)=\"resetInput()\"\n matTooltip=\"{{ intl?.deleteSearch ?? 'Clear search' }}\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"icon-search-bar\" aria-hidden=\"false\" aria-label=\"Search icon\" fontIcon=\"search\" />\n }\n}\n", styles: ["ngx-search-bar-container{display:flex;flex:1 1 auto;max-width:400px;align-items:center;block-size:var(--ngx-search-bar-container-block-size, 3rem);border-radius:var(--ngx-search-bar-container-radius, 2rem);padding-inline-start:var(--ngx-search-bar-container-padding-inline-start, 1.125rem);padding-inline-end:var(--ngx-search-bar-container-padding-inline-end, .25rem);background-color:var(--mat-sys-surface-container-high);gap:var(--ngx-search-bar-container-gap, .125rem)}ngx-search-bar-container:has(button:only-child){width:fit-content;padding:var(--ngx-search-bar-folded-container-padding, 0 .25rem);flex:0}ngx-search-bar-container>input[ngx-search-input]{font:var(--mat-sys-body-large);letter-spacing:var(--mat-sys-body-large-tracking);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10px}ngx-search-bar-container>input[ngx-search-input]::placeholder{color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container mat-icon.icon-search-bar{padding:var(--ngx-search-bar-icon-padding, .5rem);color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container [ngx-search-input]{flex:1;background:none;border:none}ngx-search-bar-container [ngx-search-input]:focus{outline:none}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
299
485
  }
300
486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: NgxSearchBarContainerComponent, decorators: [{
301
487
  type: Component,
302
- args: [{ selector: 'ngx-search-bar-container', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatIconModule, MatButtonModule, MatTooltipModule], template: "@if (isFolded()) {\n <button\n matIconButton\n aria-label=\"Open search bar\"\n (click)=\"toggleFolded()\"\n matTooltip=\"{{ intl?.openSearchBar ?? 'Open search bar' }}\">\n <mat-icon>search</mat-icon>\n </button>\n} @else {\n <ng-content select=\"[ngx-search-input]\"></ng-content>\n\n @if (searchText()) {\n <button\n matIconButton\n aria-label=\"Clear button\"\n (click)=\"resetInput()\"\n matTooltip=\"{{ intl?.deleteSearch ?? 'Clear search' }}\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"icon-search-bar\" aria-hidden=\"false\" aria-label=\"Search icon\" fontIcon=\"search\" />\n }\n}\n", styles: ["ngx-search-bar-container{display:flex;align-items:center;block-size:var(--ngx-search-bar-container-block-size, 3rem);border-radius:var(--ngx-search-bar-container-radius, 2rem);padding-inline-start:var(--ngx-search-bar-container-padding-inline-start, 1.125rem);padding-inline-end:var(--ngx-search-bar-container-padding-inline-end, .25rem);background-color:var(--mat-sys-surface-container-high);gap:var(--ngx-search-bar-container-gap, .125rem)}ngx-search-bar-container:has(button:only-child){width:fit-content;padding:var(--ngx-search-bar-folded-container-padding, 0 .25rem)}ngx-search-bar-container>input[ngx-search-input]{font:var(--mat-sys-body-large);letter-spacing:var(--mat-sys-body-large-tracking);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}ngx-search-bar-container>input[ngx-search-input]::placeholder{color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container mat-icon.icon-search-bar{padding:var(--ngx-search-bar-icon-padding, .5rem);color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container [ngx-search-input]{flex:1;background:none;border:none}ngx-search-bar-container [ngx-search-input]:focus{outline:none}\n"] }]
488
+ args: [{ selector: 'ngx-search-bar-container', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatIconModule, MatButtonModule, MatTooltipModule], template: "@if (isFolded()) {\n <button\n matIconButton\n aria-label=\"Open search bar\"\n (click)=\"toggleFolded()\"\n matTooltip=\"{{ intl?.openSearchBar ?? 'Open search bar' }}\">\n <mat-icon>search</mat-icon>\n </button>\n} @else {\n <ng-content select=\"[ngx-search-input]\"></ng-content>\n\n @if (searchText()) {\n <button\n matIconButton\n aria-label=\"Clear button\"\n (click)=\"resetInput()\"\n matTooltip=\"{{ intl?.deleteSearch ?? 'Clear search' }}\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"icon-search-bar\" aria-hidden=\"false\" aria-label=\"Search icon\" fontIcon=\"search\" />\n }\n}\n", styles: ["ngx-search-bar-container{display:flex;flex:1 1 auto;max-width:400px;align-items:center;block-size:var(--ngx-search-bar-container-block-size, 3rem);border-radius:var(--ngx-search-bar-container-radius, 2rem);padding-inline-start:var(--ngx-search-bar-container-padding-inline-start, 1.125rem);padding-inline-end:var(--ngx-search-bar-container-padding-inline-end, .25rem);background-color:var(--mat-sys-surface-container-high);gap:var(--ngx-search-bar-container-gap, .125rem)}ngx-search-bar-container:has(button:only-child){width:fit-content;padding:var(--ngx-search-bar-folded-container-padding, 0 .25rem);flex:0}ngx-search-bar-container>input[ngx-search-input]{font:var(--mat-sys-body-large);letter-spacing:var(--mat-sys-body-large-tracking);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10px}ngx-search-bar-container>input[ngx-search-input]::placeholder{color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container mat-icon.icon-search-bar{padding:var(--ngx-search-bar-icon-padding, .5rem);color:var(--mat-sys-on-surface-variant)}ngx-search-bar-container [ngx-search-input]{flex:1;background:none;border:none}ngx-search-bar-container [ngx-search-input]:focus{outline:none}\n"] }]
303
489
  }], ctorParameters: () => [], propDecorators: { folded: [{ type: i0.Input, args: [{ isSignal: true, alias: "folded", required: false }] }], searchInput: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NgxSearchInputDirective), { isSignal: true }] }] } });
304
490
 
305
491
  /**
306
492
  * Generated bundle index. Do not edit.
307
493
  */
308
494
 
309
- export { NgxActionsGroupComponent, NgxAppBarComponent, NgxLayoutComponent, NgxLayoutIntl, NgxMainBarComponent, NgxPanelComponent, NgxSearchBarContainerComponent, NgxSearchInputDirective, provideNgxLayout, resizeSignal };
495
+ export { NgxActionsGroupComponent, NgxAppBarComponent, NgxFilterDirective, NgxFilterToggleDirective, NgxFiltersGroupComponent, NgxLayoutComponent, NgxLayoutIntl, NgxMainBarComponent, NgxPanelComponent, NgxSearchBarContainerComponent, NgxSearchInputDirective, provideNgxLayout };
310
496
  //# sourceMappingURL=hug-ngx-layout.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hug-ngx-layout.mjs","sources":["../../../projects/layout/src/providers/ngx-layout-intl.ts","../../../projects/layout/src/providers/index.ts","../../../projects/layout/src/actions-group/actions-group.component.ts","../../../projects/layout/src/actions-group/actions-group.component.html","../../../projects/layout/src/app-bar/app-bar.component.ts","../../../projects/layout/src/app-bar/app-bar.component.html","../../../projects/layout/src/layout.component.ts","../../../projects/layout/src/layout.component.html","../../../projects/layout/src/main-bar/main-bar.component.ts","../../../projects/layout/src/main-bar/main-bar.component.html","../../../projects/layout/src/panel/panel.component.ts","../../../projects/layout/src/panel/panel.component.html","../../../projects/layout/src/search-bar-container/directives/search-input.directive.ts","../../../projects/layout/src/search-bar-container/search-bar-container.component.ts","../../../projects/layout/src/search-bar-container/search-bar-container.component.html","../../../projects/layout/src/hug-ngx-layout.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { NgxAbstractIntl } from '@hug/ngx-core';\n/**\n * Data for internationalization\n */\n@Injectable()\nexport class NgxLayoutIntl extends NgxAbstractIntl<NgxLayoutIntl> {\n public help = '';\n public back = '';\n public deleteSearch = '';\n public openSearchBar = '';\n public moreActions = '';\n}\n","import { EnvironmentProviders } from '@angular/core';\nimport { NgxOptionsIntl, provideNgxIntl } from '@hug/ngx-core';\n\nimport { NgxLayoutIntl } from './ngx-layout-intl';\n\nexport * from './ngx-layout-intl';\n\n/**\n * Provide the component to the application level.\n * @param options - The component's providing options.\n * @param options.translationsPath - The path to the translations files (default: `translations/ngx-layout`).\n * @param options.customIntl - A custom internationalization class to inject.\n */\nexport const provideNgxLayout = (\n options?: NgxOptionsIntl<NgxLayoutIntl>\n): EnvironmentProviders =>\n provideNgxIntl(\n NgxLayoutIntl,\n options?.translationsPath ?? 'translations/ngx-layout',\n options?.customIntl ?? NgxLayoutIntl\n );\n","import { ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, inject, Renderer2, type Signal, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\n\nconst buttonGap = 12;\nconst buttonDimensions = 40;\n\n/**\n *\n * @param element\n * @param destroyRef\n * @param box\n * @param defaultSize\n */\nexport const resizeSignal = (\n element: HTMLElement,\n destroyRef: DestroyRef,\n box: ResizeObserverBoxOptions = 'border-box'\n): Signal<ResizeObserverEntry> => {\n const initialValue: ResizeObserverEntry = {\n borderBoxSize: [],\n contentRect: element.getBoundingClientRect(),\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n target: element\n };\n\n const value = signal<ResizeObserverEntry>(initialValue);\n\n const ro = new ResizeObserver(entries => {\n value.set(entries[0] || initialValue);\n });\n\n ro.observe(element, { box });\n\n destroyRef.onDestroy(() => {\n ro.disconnect();\n });\n\n return value;\n};\n\n@Component({\n selector: 'ngx-actions-group',\n templateUrl: './actions-group.component.html',\n styleUrl: './actions-group.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatIcon,\n MatIconButton,\n MatTooltip,\n MatMenuModule\n ]\n})\nexport class NgxActionsGroupComponent {\n protected readonly hiddenActions = computed(() => {\n const maxVisible = this.getMaxVisibleAction(this.hostWidth());\n return this.iconButtons().slice(maxVisible);\n });\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n private readonly iconButtons = contentChildren<MatIconButton, ElementRef<HTMLElement>>(MatIconButton, { read: ElementRef });\n\n private readonly container = viewChild.required<ElementRef<HTMLElement>>('container');\n private readonly hiddenContainer = viewChild.required<ElementRef<HTMLElement>>('hiddenContainer');\n\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly hostSize = resizeSignal(this.hostElement.nativeElement, this.destroyRef);\n private readonly hostWidth = computed(() => this.hostSize().contentRect.width);\n\n private readonly visibleActions = computed(() => {\n const maxVisible = this.getMaxVisibleAction(this.hostWidth());\n return this.iconButtons().slice(0, maxVisible);\n });\n\n public constructor() {\n\n effect(() => {\n const buttons = this.iconButtons();\n\n if (buttons.length === 0) {\n return;\n }\n\n const visibleButtons = this.visibleActions();\n const containerEl = this.container();\n visibleButtons.forEach(button => {\n const element = button.nativeElement;\n containerEl.nativeElement.appendChild(element);\n });\n\n const hiddenButtons = this.hiddenActions();\n const hiddenContainerEl = this.hiddenContainer();\n if (hiddenButtons.length > 0) {\n hiddenButtons.forEach(button => {\n const element = button.nativeElement;\n\n const hasMenu =\n element.classList.contains('mat-mdc-menu-trigger');\n\n if (hasMenu) {\n this.renderer.listen(element, 'click', (event: MouseEvent) => {\n event.stopPropagation();\n });\n }\n\n hiddenContainerEl.nativeElement.appendChild(element);\n });\n }\n });\n }\n\n private getMaxVisibleAction(width: number): number {\n\n const maxNumberOfActions = Math.floor(width / (buttonDimensions + buttonGap));\n\n const maxVisibleActions = Math.max(1, maxNumberOfActions);\n\n const totalButtons = this.iconButtons().length;\n\n if (maxVisibleActions >= totalButtons) {\n return totalButtons;\n }\n\n // -1 => Allows for the more button to be displayed\n return maxVisibleActions - 1;\n }\n}\n","<div #container class=\"container\">\n <ng-content></ng-content>\n @if (hiddenActions().length > 0) {\n <button\n matIconButton\n class=\"more-actions-button\"\n [matMenuTriggerFor]=\"menuActionsGroup\"\n matTooltip=\"{{ intl?.moreActions ?? 'More actions' }}\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n }\n <mat-menu #menuActionsGroup=\"matMenu\" class=\"actions-group-menu\">\n <div #hiddenContainer></div>\n </mat-menu>\n</div>\n","import { ChangeDetectionStrategy, Component, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\n\ntype AppBarMode = 'standard' | 'condensed';\n\n@Component({\n selector: 'ngx-app-bar',\n templateUrl: './app-bar.component.html',\n styleUrl: './app-bar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule, MatButtonModule, MatTooltipModule],\n host: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '[class.condensed]': 'mode()===\"condensed\"'\n }\n})\nexport class NgxAppBarComponent {\n public mode = input<AppBarMode>('standard');\n public title = input.required<string>();\n public subtitle = input<string>();\n public helpUrl = input<string | URL>();\n public withBackIcon = input<boolean>(false);\n\n public readonly goBack = output();\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n private helpPopup: Window | undefined;\n\n protected openHelp(): void {\n const params = [\n `height=${screen.height}`,\n `width=${screen.width}`,\n 'fullscreen=yes'\n ].join(',');\n\n if (this.helpPopup) {\n this.helpPopup.close();\n }\n\n this.helpPopup = window.open(this.helpUrl(), 'help_popup', params) ?? undefined;\n this.helpPopup?.moveTo(0, 0);\n }\n\n protected triggerGoBack(): void {\n this.goBack.emit();\n }\n}\n","@if (withBackIcon()) {\n <button matIconButton matTooltip=\"{{ intl?.back ?? 'Back' }}\" (click)=\"triggerGoBack()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n}\n\n<header class=\"{{ mode() }}\">\n <h1 class=\"title\">{{ title() }}</h1>\n @if (subtitle()) {\n @if (mode() === 'condensed') {\n <mat-icon>chevron_right</mat-icon>\n }\n <h2 class=\"subtitle\">{{ subtitle() }}</h2>\n }\n</header>\n\n<section class=\"actions\">\n <ng-content />\n @if (helpUrl()) {\n <button matIconButton matTooltip=\"{{ intl?.help ?? 'Help' }}\" (click)=\"openHelp()\">\n <mat-icon>help</mat-icon>\n </button>\n }\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n\n@Component({\n selector: 'ngx-layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgxLayoutComponent {\n}\n","<ng-content select=\"ngx-app-bar\"></ng-content>\n<ng-content select=\"ngx-main-bar\"></ng-content>\n<!--\n The ng-content's is not clearly defined yet. The potential use-cases are:\n - Display GPD bars\n - Display warnings\n -->\n<ng-content></ng-content>\n<section class=\"content\">\n <ng-content select=\"ngx-panel\"></ng-content>\n</section>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n\n@Component({\n selector: 'ngx-main-bar',\n templateUrl: './main-bar.component.html',\n styleUrl: './main-bar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgxMainBarComponent { }\n","<ng-content select=\"ngx-actions-group\"></ng-content>\n\n<div class=\"right\">\n <ng-content select=\"ngx-filters-group\"></ng-content>\n <ng-content select=\"ngx-search-bar-container\"></ng-content>\n</div>\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\n\ntype Appearance = 'transparent' | 'default';\ntype ContentPadding = 'none' | 'regular';\n\n@Component({\n selector: 'ngx-panel',\n templateUrl: './panel.component.html',\n styleUrl: './panel.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '[attr.appearance]': 'this.appearance()',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '[attr.content-padding]': 'this.contentPadding()'\n }\n})\nexport class NgxPanelComponent {\n public readonly appearance = input<Appearance | undefined>(undefined);\n public readonly contentPadding = input<ContentPadding | undefined>(undefined, { alias: 'content-padding' });\n}\n","<ng-content select=\"ngx-panel-bar[primary]\"></ng-content>\n<ng-content select=\"ngx-panel-bar\"></ng-content>\n<section class=\"content\">\n <ng-content></ng-content>\n</section>\n","import { Directive, ElementRef, inject, type Signal, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { type FormControl, NgControl } from '@angular/forms';\n\n@Directive({\n selector: 'input[ngx-search-input]',\n /* eslint-disable @typescript-eslint/naming-convention */\n host: {\n '(blur)': 'blurred.set(true);',\n '(focus)': 'blurred.set(false);'\n }\n})\nexport class NgxSearchInputDirective {\n public readonly blurred = signal<boolean>(false);\n public readonly value: Signal<string>;\n\n private readonly ngControl = inject(NgControl);\n private readonly input = inject<ElementRef<HTMLInputElement>>(ElementRef);\n private readonly control = this.ngControl.control as FormControl<string>;\n\n public constructor() {\n this.value = toSignal(this.control.valueChanges, { initialValue: '' });\n }\n\n public focus(): void {\n this.input.nativeElement.focus();\n }\n\n public reset(): void {\n this.control.reset();\n }\n}\n","import { afterRenderEffect, ChangeDetectionStrategy, Component, computed, contentChild, effect, inject, input, signal, untracked, ViewEncapsulation } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\nimport { NgxSearchInputDirective } from './directives/search-input.directive';\n\n// type SearchBarContainerSize = 'medium' | 'small';\n\n@Component({\n selector: 'ngx-search-bar-container',\n templateUrl: './search-bar-container.component.html',\n styleUrl: './search-bar-container.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule, MatButtonModule, MatTooltipModule]\n /*\n host: {\n '[class.small]': 'size()===\"small\"'\n }\n */\n})\nexport class NgxSearchBarContainerComponent {\n // inputs\n public readonly folded = input<boolean>(false);\n\n /*\n protected size = input<SearchBarContainerSize>('medium');\n protected sizeButtonAttributeName = input<string>();\n protected sizeButtonAttributeValue = input<string>();\n */\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n protected readonly manualFoldingState = signal<boolean>(true);\n protected readonly isFolded = computed(() => this.folded() && this.manualFoldingState() && !this.searchText());\n\n protected readonly searchInput = contentChild(NgxSearchInputDirective);\n protected readonly searchText = computed(() => this.searchInput()?.value());\n\n /*\n private hostElement = inject(ElementRef);\n private renderer = inject(Renderer2);\n */\n\n public constructor() {\n\n /*\n afterRender(() => {\n const containerElement = this.hostElement.nativeElement;\n const buttons = containerElement.querySelectorAll('button') as NodeListOf<HTMLElement>;\n\n buttons.forEach((button: HTMLElement) => {\n if (this.sizeButtonAttributeName()?.trim() && this.sizeButtonAttributeValue()?.trim()) {\n this.renderer.setAttribute(button, this.sizeButtonAttributeName(), this.sizeButtonAttributeValue());\n }\n\n });\n });\n */\n\n afterRenderEffect(() => {\n const searchInput = this.searchInput();\n if (!searchInput) {\n return;\n }\n\n if (!this.isFolded()) {\n searchInput.focus();\n }\n });\n\n effect(() => {\n const baseFoldStatus = this.folded();\n\n if (baseFoldStatus) {\n const searchText = untracked(this.searchText);\n const blurred = this.searchInput()?.blurred();\n\n if (blurred && !searchText) {\n this.toggleFolded();\n }\n }\n });\n }\n\n protected toggleFolded(): void {\n this.manualFoldingState.update(folded => !folded);\n }\n\n protected resetInput(): void {\n const searchInput = this.searchInput();\n\n if (!searchInput) {\n return;\n }\n\n searchInput.reset();\n searchInput.focus();\n }\n}\n\n","@if (isFolded()) {\n <button\n matIconButton\n aria-label=\"Open search bar\"\n (click)=\"toggleFolded()\"\n matTooltip=\"{{ intl?.openSearchBar ?? 'Open search bar' }}\">\n <mat-icon>search</mat-icon>\n </button>\n} @else {\n <ng-content select=\"[ngx-search-input]\"></ng-content>\n\n @if (searchText()) {\n <button\n matIconButton\n aria-label=\"Clear button\"\n (click)=\"resetInput()\"\n matTooltip=\"{{ intl?.deleteSearch ?? 'Clear search' }}\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"icon-search-bar\" aria-hidden=\"false\" aria-label=\"Search icon\" fontIcon=\"search\" />\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"hug-ngx-layout.mjs","sources":["../../../projects/layout/src/providers/ngx-layout-intl.ts","../../../projects/layout/src/providers/index.ts","../../../projects/layout/src/actions-group/actions-group.component.ts","../../../projects/layout/src/actions-group/actions-group.component.html","../../../projects/layout/src/app-bar/app-bar.component.ts","../../../projects/layout/src/app-bar/app-bar.component.html","../../../projects/layout/src/filters-group/filter-chip.model.ts","../../../projects/layout/src/filters-group/filter-chip.directive.ts","../../../projects/layout/src/filters-group/filter-toggle.directive.ts","../../../projects/layout/src/filters-group/filters-group.component.ts","../../../projects/layout/src/filters-group/filters-group.component.html","../../../projects/layout/src/layout.component.ts","../../../projects/layout/src/layout.component.html","../../../projects/layout/src/main-bar/main-bar.component.ts","../../../projects/layout/src/main-bar/main-bar.component.html","../../../projects/layout/src/panel/panel.component.ts","../../../projects/layout/src/panel/panel.component.html","../../../projects/layout/src/search-bar-container/directives/search-input.directive.ts","../../../projects/layout/src/search-bar-container/search-bar-container.component.ts","../../../projects/layout/src/search-bar-container/search-bar-container.component.html","../../../projects/layout/src/hug-ngx-layout.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { NgxAbstractIntl } from '@hug/ngx-core';\n/**\n * Data for internationalization\n */\n@Injectable()\nexport class NgxLayoutIntl extends NgxAbstractIntl<NgxLayoutIntl> {\n public help = '';\n public back = '';\n public deleteSearch = '';\n public openSearchBar = '';\n public moreActions = '';\n public allFilters = '';\n public filters = '';\n public actives = '';\n public reset = '';\n}\n","import { EnvironmentProviders } from '@angular/core';\nimport { NgxOptionsIntl, provideNgxIntl } from '@hug/ngx-core';\n\nimport { NgxLayoutIntl } from './ngx-layout-intl';\n\nexport * from './ngx-layout-intl';\n\n/**\n * Provide the component to the application level.\n * @param options - The component's providing options.\n * @param options.translationsPath - The path to the translations files (default: `translations/ngx-layout`).\n * @param options.customIntl - A custom internationalization class to inject.\n */\nexport const provideNgxLayout = (\n options?: NgxOptionsIntl<NgxLayoutIntl>\n): EnvironmentProviders =>\n provideNgxIntl(\n NgxLayoutIntl,\n options?.translationsPath ?? 'translations/ngx-layout',\n options?.customIntl ?? NgxLayoutIntl\n );\n","import { ChangeDetectionStrategy, Component, computed, contentChildren, effect, ElementRef, inject, Renderer2, type Signal, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\n\nconst buttonGap = 12;\nconst buttonDimensions = 40;\n\n/**\n *\n * @param element\n * @param destroyRef\n * @param box\n * @param defaultSize\n */\nconst resizeSignal = (\n element: () => ElementRef<HTMLElement> | undefined,\n box: ResizeObserverBoxOptions = 'border-box'\n): Signal<ResizeObserverEntry | undefined> => {\n\n const value = signal<ResizeObserverEntry | undefined>(undefined);\n\n effect(onCleanup => {\n const el = element()?.nativeElement;\n if (!el) {\n return;\n }\n\n const initialValue: ResizeObserverEntry = {\n borderBoxSize: [],\n contentRect: new DOMRect(),\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n target: el\n };\n\n value.set(initialValue);\n\n const ro = new ResizeObserver(entries => {\n value.set(entries[0] || initialValue);\n });\n\n ro.observe(el, { box });\n onCleanup(() => {\n ro.disconnect();\n });\n });\n\n return value;\n};\n\n@Component({\n selector: 'ngx-actions-group',\n templateUrl: './actions-group.component.html',\n styleUrl: './actions-group.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatIcon,\n MatIconButton,\n MatTooltip,\n MatMenuModule\n ]\n})\nexport class NgxActionsGroupComponent {\n protected readonly hiddenActions = computed(() => {\n const maxVisible = this.getMaxVisibleAction(this.hostWidth());\n return this.iconButtons().slice(maxVisible);\n });\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n private readonly iconButtons = contentChildren<MatIconButton, ElementRef<HTMLElement>>(MatIconButton, { read: ElementRef });\n\n private readonly container = viewChild.required<ElementRef<HTMLElement>>('container');\n private readonly hiddenContainer = viewChild.required<ElementRef<HTMLElement>>('hiddenContainer');\n\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private readonly hostSize = resizeSignal(() => this.hostElement);\n private readonly hostWidth = computed(() => Math.ceil(this.hostSize()?.contentRect.width || 0));\n\n private readonly visibleActions = computed(() => {\n const maxVisible = this.getMaxVisibleAction(this.hostWidth());\n return this.iconButtons().slice(0, maxVisible);\n });\n\n public constructor() {\n\n effect(() => {\n const buttons = this.iconButtons();\n\n if (buttons.length === 0) {\n return;\n }\n\n const visibleButtons = this.visibleActions();\n const containerEl = this.container();\n visibleButtons.forEach(button => {\n const element = button.nativeElement;\n containerEl.nativeElement.appendChild(element);\n });\n\n const hiddenButtons = this.hiddenActions();\n const hiddenContainerEl = this.hiddenContainer();\n if (hiddenButtons.length > 0) {\n hiddenButtons.forEach(button => {\n const element = button.nativeElement;\n\n const hasMenu =\n element.classList.contains('mat-mdc-menu-trigger');\n\n if (hasMenu) {\n this.renderer.listen(element, 'click', (event: MouseEvent) => {\n event.stopPropagation();\n });\n }\n\n hiddenContainerEl.nativeElement.appendChild(element);\n });\n }\n });\n }\n\n private getMaxVisibleAction(width: number): number {\n\n const maxNumberOfActions = Math.floor(width / (buttonDimensions + buttonGap));\n\n const maxVisibleActions = Math.max(1, maxNumberOfActions);\n\n const totalButtons = this.iconButtons().length;\n\n if (maxVisibleActions >= totalButtons) {\n return totalButtons;\n }\n\n // -1 => Allows for the more button to be displayed\n return maxVisibleActions - 1;\n }\n}\n","<div #container class=\"container\">\n <ng-content></ng-content>\n @if (hiddenActions().length > 0) {\n <button\n matIconButton\n class=\"more-actions-button\"\n [matMenuTriggerFor]=\"menuActionsGroup\"\n matTooltip=\"{{ intl?.moreActions ?? 'More actions' }}\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n }\n <mat-menu #menuActionsGroup=\"matMenu\" class=\"actions-group-menu\">\n <div #hiddenContainer></div>\n </mat-menu>\n</div>\n","import { ChangeDetectionStrategy, Component, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\n\ntype AppBarMode = 'standard' | 'condensed';\n\n@Component({\n selector: 'ngx-app-bar',\n templateUrl: './app-bar.component.html',\n styleUrl: './app-bar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule, MatButtonModule, MatTooltipModule],\n host: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '[class.condensed]': 'mode()===\"condensed\"'\n }\n})\nexport class NgxAppBarComponent {\n public mode = input<AppBarMode>('standard');\n public title = input.required<string>();\n public subtitle = input<string>();\n public helpUrl = input<string | URL>();\n public withBackIcon = input<boolean>(false);\n\n public readonly goBack = output();\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n private helpPopup: Window | undefined;\n\n protected openHelp(): void {\n const params = [\n `height=${screen.height}`,\n `width=${screen.width}`,\n 'fullscreen=yes'\n ].join(',');\n\n if (this.helpPopup) {\n this.helpPopup.close();\n }\n\n this.helpPopup = window.open(this.helpUrl(), 'help_popup', params) ?? undefined;\n this.helpPopup?.moveTo(0, 0);\n }\n\n protected triggerGoBack(): void {\n this.goBack.emit();\n }\n}\n","@if (withBackIcon()) {\n <button matIconButton matTooltip=\"{{ intl?.back ?? 'Back' }}\" (click)=\"triggerGoBack()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n}\n\n<header class=\"{{ mode() }}\">\n <h1 class=\"title\">{{ title() }}</h1>\n @if (subtitle()) {\n @if (mode() === 'condensed') {\n <mat-icon>chevron_right</mat-icon>\n }\n <h2 class=\"subtitle\">{{ subtitle() }}</h2>\n }\n</header>\n\n<section class=\"actions\">\n <ng-content />\n @if (helpUrl()) {\n <button matIconButton matTooltip=\"{{ intl?.help ?? 'Help' }}\" (click)=\"openHelp()\">\n <mat-icon>help</mat-icon>\n </button>\n }\n</section>\n","import { InjectionToken, type InputSignal, type ModelSignal, type TemplateRef } from '@angular/core';\n\nexport type FilterType = 'toggle' | 'complex';\n\ninterface NgxBaseFilter {\n readonly label: InputSignal<string>;\n readonly active: InputSignal<boolean>;\n readonly type: FilterType;\n}\n\nexport interface NgxToggleFilter extends NgxBaseFilter {\n readonly type: 'toggle';\n readonly active: ModelSignal<boolean>;\n}\n\nexport interface NgxComplexFilter extends NgxBaseFilter {\n readonly selectedFilterLabel: InputSignal<string>;\n readonly templateRef: TemplateRef<unknown>;\n readonly type: 'complex';\n}\n\nexport type NgxFilter = NgxToggleFilter | NgxComplexFilter;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const FILTER_TOKEN = new InjectionToken<NgxFilter>('FILTER_TOKEN');\n","import { Directive, forwardRef, inject, input, TemplateRef } from '@angular/core';\n\nimport { FILTER_TOKEN, type NgxComplexFilter } from './filter-chip.model';\n\n\n@Directive({\n selector: 'ng-template[ngx-filter]',\n standalone: true,\n providers: [{ provide: FILTER_TOKEN, useExisting: forwardRef(() => NgxFilterDirective) }]\n\n})\nexport class NgxFilterDirective implements NgxComplexFilter {\n public readonly type = 'complex';\n public readonly label = input.required<string>();\n public readonly active = input.required<boolean>();\n public readonly selectedFilterLabel = input('');\n public readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import { Directive, forwardRef, input, model } from '@angular/core';\n\nimport { FILTER_TOKEN, type NgxToggleFilter } from './filter-chip.model';\n\n\n@Directive({\n selector: 'ng-template[ngx-filter-toggle]',\n standalone: true,\n providers: [{ provide: FILTER_TOKEN, useExisting: forwardRef(() => NgxFilterToggleDirective) }]\n})\nexport class NgxFilterToggleDirective implements NgxToggleFilter {\n public readonly type = 'toggle';\n public readonly label = input.required<string>();\n public readonly active = model.required<boolean>();\n}\n","import { CdkConnectedOverlay, CdkOverlayOrigin, type ConnectionPositionPair } from '@angular/cdk/overlay';\nimport { LowerCasePipe, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChildren, effect, ElementRef, inject, input, output, type Signal, signal, type TemplateRef, viewChild, ViewEncapsulation } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\nimport { FILTER_TOKEN } from './filter-chip.model';\n\nconst resizeSignal = (\n element: () => ElementRef<HTMLElement> | undefined,\n box: ResizeObserverBoxOptions = 'border-box'\n): Signal<ResizeObserverEntry | undefined> => {\n\n const value = signal<ResizeObserverEntry | undefined>(undefined);\n\n effect(onCleanup => {\n const el = element()?.nativeElement;\n if (!el) {\n return;\n }\n\n const initialValue: ResizeObserverEntry = {\n borderBoxSize: [],\n contentRect: new DOMRect(),\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n target: el\n };\n\n value.set(initialValue);\n\n const ro = new ResizeObserver(entries => {\n value.set(entries[0] || initialValue);\n });\n\n ro.observe(el, { box });\n onCleanup(() => {\n ro.disconnect();\n });\n });\n\n return value;\n};\n\n@Component({\n selector: 'ngx-filters-group',\n templateUrl: './filters-group.component.html',\n styleUrl: './filters-group.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatIcon,\n MatIconButton,\n MatChipsModule,\n MatTooltip,\n NgTemplateOutlet,\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n MatSlideToggleModule,\n FormsModule,\n MatBadgeModule,\n LowerCasePipe\n ]\n})\nexport class NgxFiltersGroupComponent {\n public readonly resetFilters = output();\n public readonly folded = input<boolean>();\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n // #region Overlay\n protected readonly overlayOrigin = signal<CdkOverlayOrigin | undefined>(undefined);\n protected readonly overlayContent = signal<TemplateRef<unknown> | undefined>(undefined);\n protected readonly overlayOpen = signal<boolean>(false);\n protected readonly moreFiltersOverlay = signal<boolean>(false);\n protected readonly overlayPositions: ConnectionPositionPair[] = [{\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 16\n }, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 16\n }];\n // #endregion\n\n // #region Filters\n protected allFilters = contentChildren(FILTER_TOKEN);\n protected readonly activeFiltersAmount = computed(() => this.invisibleFilters().filter(filter => filter.active()).length);\n\n protected readonly visibleFilters = computed(() => {\n const lastFittingIndex = this.lastFittingIndex();\n if (lastFittingIndex < 0) {\n return [];\n }\n\n return this.allFilters().slice(0, lastFittingIndex);\n });\n\n protected readonly invisibleFilters = computed(() => {\n const lastFittingIndex = this.lastFittingIndex();\n if (lastFittingIndex < 0) {\n return this.allFilters();\n }\n\n return this.allFilters().slice(lastFittingIndex);\n });\n\n private readonly filterContainerRef = viewChild.required<ElementRef<HTMLElement>>('container');\n private readonly filterContainerPadding = computed(() => Number.parseFloat(globalThis.getComputedStyle(this.filterContainerRef().nativeElement).paddingInline));\n\n // #endregion\n\n // #region Host\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly hostSize = resizeSignal(() => this.hostElement);\n private readonly hostWidth = computed(() => Math.ceil(this.hostSize()?.contentRect.width || 0));\n // #endregion\n\n // #region MeasureRow\n private readonly measureRowRef = viewChild<ElementRef<HTMLElement>>('measureRow');\n private readonly measureRowSize = resizeSignal(() => this.measureRowRef());\n private readonly measureRowWidth = computed(() => Math.ceil(this.measureRowSize()?.contentRect.width || 0));\n // #endregion\n\n // #region StaticFields\n private readonly staticFieldsRef = viewChild<ElementRef<HTMLElement>>('static');\n private readonly staticFieldsSize = resizeSignal(() => this.staticFieldsRef());\n private readonly staticFieldsWidth = computed(() => Math.ceil(this.staticFieldsSize()?.contentRect.width || 0));\n // #endregion\n\n private readonly lastFittingIndex = computed(() => {\n const hostWidth = this.hostWidth();\n if (!hostWidth) {\n return -1;\n }\n\n const availableSpace = hostWidth - (this.staticFieldsWidth() + (2 * this.filterContainerPadding()));\n const filters = Array.from(this.measureRowRef()?.nativeElement.querySelectorAll<HTMLElement>('mat-chip-option') ?? []);\n\n if (availableSpace - this.measureRowWidth() >= 0) {\n return filters.length;\n }\n\n return this.getLastFittingIndex(availableSpace, filters);\n });\n\n protected emitResetClicked(): void {\n this.resetFilters.emit();\n }\n\n private getLastFittingIndex(availableSpace: number, elements: readonly HTMLElement[]): number {\n const firstEl = elements[0];\n\n if (!firstEl || availableSpace <= 0 || availableSpace - firstEl.offsetWidth < 0) {\n return -1;\n }\n\n let residualAvailableSpace = availableSpace;\n\n const lastFittingIndex = elements.findIndex(el => {\n residualAvailableSpace -= el.offsetWidth + 16;\n return residualAvailableSpace <= 0;\n });\n\n return lastFittingIndex >= 0 ? lastFittingIndex : elements.length - 1;\n }\n}\n","@if (folded()) {\n <section\n class=\"filter-container\"\n #container\n [matBadge]=\"activeFiltersAmount()\"\n [matBadgeHidden]=\"activeFiltersAmount() <= 0\">\n <button\n mat-icon-button\n aria-label=\"All filters\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(moreFilters);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(true)\n \"\n matTooltip=\"{{ intl?.allFilters ?? 'All filters' }}\">\n <mat-icon>filter_alt</mat-icon>\n </button>\n </section>\n} @else {\n @if (allFilters()) {\n <section #measureRow class=\"measure-row\">\n <mat-chip-set>\n @for (f of allFilters(); track $index) {\n <mat-chip-option [selectable]=\"false\" [selected]=\"f.active()\">\n {{ f.label() }}\n @if (f.type === 'complex' && f.selectedFilterLabel()) {\n <span class=\"selected-label\">: {{ f.selectedFilterLabel() }}</span>\n }\n @if (f.type === 'complex') {\n <mat-icon matChipTrailingIcon>arrow_drop_down</mat-icon>\n }\n </mat-chip-option>\n }\n <mat-chip #overflowMeasure>\n +00 {{ intl?.filters ?? 'Filters' | lowercase }} (00 {{ intl?.actives ?? 'Actives' | lowercase }})\n <mat-icon matChipTrailingIcon>arrow_drop_down</mat-icon>\n </mat-chip>\n </mat-chip-set>\n </section>\n }\n\n <section class=\"filter-container\" #container>\n <mat-chip-set>\n @if (this.visibleFilters().length) {\n @for (f of visibleFilters(); track $index) {\n @if (f.type === 'toggle') {\n <mat-chip-option\n selectable=\"true\"\n [selected]=\"f.active()\"\n (selectionChange)=\"f.active.set($event.selected)\">\n {{ f.label() }}\n </mat-chip-option>\n } @else {\n <mat-chip-option\n [selectable]=\"false\"\n [selected]=\"f.active()\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(f.templateRef);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(false)\n \">\n {{ f.label() }}\n @if (f.selectedFilterLabel()) {\n <span class=\"selected-label\">: {{ f.selectedFilterLabel() }}</span>\n }\n <mat-icon\n [class.is-overlay-open]=\"this.overlayOpen() && this.overlayContent() === f.templateRef\"\n matChipTrailingIcon>\n arrow_drop_down\n </mat-icon>\n </mat-chip-option>\n }\n }\n }\n </mat-chip-set>\n <section class=\"static\" #static>\n @if (invisibleFilters().length; as invisibleFiltersAmount) {\n <mat-chip-set>\n <mat-chip\n cdkOverlayOrigin\n [class.filter-active]=\"activeFiltersAmount()\"\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"\n this.overlayOrigin.set(trigger);\n this.overlayContent.set(moreFilters);\n this.overlayOpen.set(true);\n this.moreFiltersOverlay.set(true)\n \">\n +{{ invisibleFiltersAmount }} {{ intl?.filters ?? 'Filters' | lowercase }} ({{\n activeFiltersAmount()\n }}\n {{ intl?.actives ?? 'Actives' | lowercase }})\n <mat-icon\n [class.is-overlay-open]=\"this.overlayOpen() && this.overlayContent() === moreFilters\"\n matChipTrailingIcon>\n arrow_drop_down\n </mat-icon>\n </mat-chip>\n </mat-chip-set>\n }\n <button\n mat-icon-button\n aria-label=\"Reset filters\"\n (click)=\"emitResetClicked()\"\n matTooltip=\"{{ intl?.reset ?? 'Reset' }}\">\n <mat-icon>settings_backup_restore</mat-icon>\n </button>\n </section>\n </section>\n}\n\n<ng-template #moreFilters>\n @if (allFilters()) {\n @for (f of allFilters(); track $index) {\n @if (f.type === 'toggle') {\n <section class=\"filter\">\n <mat-slide-toggle labelPosition=\"before\" [(ngModel)]=\"f.active\">\n {{ f.label() }}\n </mat-slide-toggle>\n </section>\n } @else {\n <section class=\"filter\">\n <div class=\"title\">\n <span class=\"label\">{{ f.label() }}</span>\n <span class=\"value\">{{ f.selectedFilterLabel() }}</span>\n </div>\n @if (f.templateRef) {\n <ng-container *ngTemplateOutlet=\"f.templateRef\"></ng-container>\n }\n </section>\n }\n }\n }\n</ng-template>\n\n@let overlayOrigin = this.overlayOrigin();\n@let overlayOpen = this.overlayOpen();\n@let overlayContent = this.overlayContent();\n@if (overlayOrigin && overlayOpen && overlayContent) {\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n (detach)=\"this.overlayOpen.set(false)\"\n cdkConnectedOverlayHasBackdrop=\"true\"\n backdrop\n (backdropClick)=\"this.overlayOpen.set(false)\"\n cdkConnectedOverlayPanelClass=\"filter-group--overlay\"\n cdkConnectedOverlayBackdropClass=\"filter-group--overlay--backdrop--transparent\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"32\">\n @if (moreFiltersOverlay()) {\n <div class=\"filters--title\">\n <span>{{ intl?.filters ?? 'Filters' }}</span>\n <button\n mat-icon-button\n aria-label=\"Reset filters\"\n (click)=\"emitResetClicked()\"\n matTooltip=\"{{ intl?.reset ?? 'Reset' }}\">\n <mat-icon>settings_backup_restore</mat-icon>\n </button>\n </div>\n }\n <div class=\"filters--content\">\n <ng-container *ngTemplateOutlet=\"overlayContent\"></ng-container>\n </div>\n </ng-template>\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n\n@Component({\n selector: 'ngx-layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgxLayoutComponent {\n}\n","<ng-content select=\"ngx-app-bar\"></ng-content>\n<ng-content select=\"ngx-main-bar\"></ng-content>\n<!--\n The ng-content's is not clearly defined yet. The potential use-cases are:\n - Display GPD bars\n - Display warnings\n -->\n<ng-content></ng-content>\n<section class=\"content\">\n <ng-content select=\"ngx-panel\"></ng-content>\n</section>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n\n@Component({\n selector: 'ngx-main-bar',\n templateUrl: './main-bar.component.html',\n styleUrl: './main-bar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgxMainBarComponent { }\n","<ng-content select=\"ngx-actions-group\"></ng-content>\n\n<div class=\"right\">\n <ng-content select=\"ngx-filters-group\"></ng-content>\n <ng-content select=\"ngx-search-bar-container\"></ng-content>\n</div>\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\n\ntype Appearance = 'transparent' | 'default';\ntype ContentPadding = 'none' | 'regular';\n\n@Component({\n selector: 'ngx-panel',\n templateUrl: './panel.component.html',\n styleUrl: './panel.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '[attr.appearance]': 'this.appearance()',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '[attr.content-padding]': 'this.contentPadding()'\n }\n})\nexport class NgxPanelComponent {\n public readonly appearance = input<Appearance | undefined>(undefined);\n public readonly contentPadding = input<ContentPadding | undefined>(undefined, { alias: 'content-padding' });\n}\n","<ng-content select=\"ngx-panel-bar[primary]\"></ng-content>\n<ng-content select=\"ngx-panel-bar\"></ng-content>\n<section class=\"content\">\n <ng-content></ng-content>\n</section>\n","import { Directive, ElementRef, inject, type Signal, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { type FormControl, NgControl } from '@angular/forms';\n\n@Directive({\n selector: 'input[ngx-search-input]',\n /* eslint-disable @typescript-eslint/naming-convention */\n host: {\n '(blur)': 'blurred.set(true);',\n '(focus)': 'blurred.set(false);'\n }\n})\nexport class NgxSearchInputDirective {\n public readonly blurred = signal<boolean>(false);\n public readonly value: Signal<string>;\n\n private readonly ngControl = inject(NgControl);\n private readonly input = inject<ElementRef<HTMLInputElement>>(ElementRef);\n private readonly control = this.ngControl.control as FormControl<string>;\n\n public constructor() {\n this.value = toSignal(this.control.valueChanges, { initialValue: '' });\n }\n\n public focus(): void {\n this.input.nativeElement.focus();\n }\n\n public reset(): void {\n this.control.reset();\n }\n}\n","import { afterRenderEffect, ChangeDetectionStrategy, Component, computed, contentChild, effect, inject, input, signal, untracked, ViewEncapsulation } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgxLayoutIntl } from '../providers';\nimport { NgxSearchInputDirective } from './directives/search-input.directive';\n\n// type SearchBarContainerSize = 'medium' | 'small';\n\n@Component({\n selector: 'ngx-search-bar-container',\n templateUrl: './search-bar-container.component.html',\n styleUrl: './search-bar-container.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule, MatButtonModule, MatTooltipModule]\n /*\n host: {\n '[class.small]': 'size()===\"small\"'\n }\n */\n})\nexport class NgxSearchBarContainerComponent {\n // inputs\n public readonly folded = input<boolean>(false);\n\n /*\n protected size = input<SearchBarContainerSize>('medium');\n protected sizeButtonAttributeName = input<string>();\n protected sizeButtonAttributeValue = input<string>();\n */\n\n protected readonly intl = inject(NgxLayoutIntl, { optional: true });\n\n protected readonly manualFoldingState = signal<boolean>(true);\n protected readonly isFolded = computed(() => this.folded() && this.manualFoldingState() && !this.searchText());\n\n protected readonly searchInput = contentChild(NgxSearchInputDirective);\n protected readonly searchText = computed(() => this.searchInput()?.value());\n\n /*\n private hostElement = inject(ElementRef);\n private renderer = inject(Renderer2);\n */\n\n public constructor() {\n\n /*\n afterRender(() => {\n const containerElement = this.hostElement.nativeElement;\n const buttons = containerElement.querySelectorAll('button') as NodeListOf<HTMLElement>;\n\n buttons.forEach((button: HTMLElement) => {\n if (this.sizeButtonAttributeName()?.trim() && this.sizeButtonAttributeValue()?.trim()) {\n this.renderer.setAttribute(button, this.sizeButtonAttributeName(), this.sizeButtonAttributeValue());\n }\n\n });\n });\n */\n\n afterRenderEffect(() => {\n const searchInput = this.searchInput();\n if (!searchInput) {\n return;\n }\n\n if (!this.isFolded()) {\n searchInput.focus();\n }\n });\n\n effect(() => {\n const baseFoldStatus = this.folded();\n\n if (baseFoldStatus) {\n const searchText = untracked(this.searchText);\n const blurred = this.searchInput()?.blurred();\n\n if (blurred && !searchText) {\n this.manualFoldingState.set(true);\n }\n }\n });\n }\n\n protected toggleFolded(): void {\n this.manualFoldingState.update(folded => !folded);\n }\n\n protected resetInput(): void {\n const searchInput = this.searchInput();\n\n if (!searchInput) {\n return;\n }\n\n searchInput.reset();\n searchInput.focus();\n }\n}\n\n","@if (isFolded()) {\n <button\n matIconButton\n aria-label=\"Open search bar\"\n (click)=\"toggleFolded()\"\n matTooltip=\"{{ intl?.openSearchBar ?? 'Open search bar' }}\">\n <mat-icon>search</mat-icon>\n </button>\n} @else {\n <ng-content select=\"[ngx-search-input]\"></ng-content>\n\n @if (searchText()) {\n <button\n matIconButton\n aria-label=\"Clear button\"\n (click)=\"resetInput()\"\n matTooltip=\"{{ intl?.deleteSearch ?? 'Clear search' }}\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"icon-search-bar\" aria-hidden=\"false\" aria-label=\"Search icon\" fontIcon=\"search\" />\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["resizeSignal","i1","i2","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hug/ngx-layout",
3
- "version": "22.0.0-alpha.1",
3
+ "version": "22.0.0-alpha.2",
4
4
  "description": "HUG Angular - layout component",
5
5
  "homepage": "https://github.com/dsi-hug/ngx-components",
6
6
  "license": "GPL-3.0-only",
@@ -3,5 +3,9 @@
3
3
  "back": "Zurück",
4
4
  "deleteSearch": "Suche löschen",
5
5
  "openSearchBar": "Suchleiste öffnen",
6
- "moreActions": "Weitere Aktionen"
6
+ "moreActions": "Weitere Aktionen",
7
+ "allFilters": "Alle Filter",
8
+ "filters": "Filter",
9
+ "actives": "Aktive",
10
+ "reset": "Zurücksetzen"
7
11
  }
@@ -3,5 +3,9 @@
3
3
  "back": "Back",
4
4
  "deleteSearch": "Delete search",
5
5
  "openSearchBar": "Open search bar",
6
- "moreActions": "More actions"
6
+ "moreActions": "More actions",
7
+ "allFilters": "All filters",
8
+ "filters": "Filters",
9
+ "actives": "Actives",
10
+ "reset": "Reset"
7
11
  }
@@ -3,5 +3,9 @@
3
3
  "back": "Retour",
4
4
  "deleteSearch": "Effacer la recherche",
5
5
  "openSearchBar": "Ouvrir la barre de recherche",
6
- "moreActions": "Plus d'actions"
6
+ "moreActions": "Plus d'actions",
7
+ "allFilters": "Tous les filtres",
8
+ "filters": "Filtres",
9
+ "actives": "Actifs",
10
+ "reset": "Réinitialiser"
7
11
  }
@@ -1,6 +1,7 @@
1
- import * as i0 from '@angular/core';
2
- import { EnvironmentProviders, Signal, ElementRef, DestroyRef } from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
+ import { EnvironmentProviders, Signal, ElementRef, InputSignal, TemplateRef, ModelSignal } from '@angular/core';
3
3
  import { NgxAbstractIntl, NgxOptionsIntl } from '@hug/ngx-core';
4
+ import { CdkOverlayOrigin, ConnectionPositionPair } from '@angular/cdk/overlay';
4
5
 
5
6
  /**
6
7
  * Data for internationalization
@@ -11,8 +12,12 @@ declare class NgxLayoutIntl extends NgxAbstractIntl<NgxLayoutIntl> {
11
12
  deleteSearch: string;
12
13
  openSearchBar: string;
13
14
  moreActions: string;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxLayoutIntl, never>;
15
- static ɵprov: i0.ɵɵInjectableDeclaration<NgxLayoutIntl>;
15
+ allFilters: string;
16
+ filters: string;
17
+ actives: string;
18
+ reset: string;
19
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxLayoutIntl, never>;
20
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxLayoutIntl>;
16
21
  }
17
22
 
18
23
  /**
@@ -23,14 +28,6 @@ declare class NgxLayoutIntl extends NgxAbstractIntl<NgxLayoutIntl> {
23
28
  */
24
29
  declare const provideNgxLayout: (options?: NgxOptionsIntl<NgxLayoutIntl>) => EnvironmentProviders;
25
30
 
26
- /**
27
- *
28
- * @param element
29
- * @param destroyRef
30
- * @param box
31
- * @param defaultSize
32
- */
33
- declare const resizeSignal: (element: HTMLElement, destroyRef: DestroyRef, box?: ResizeObserverBoxOptions) => Signal<ResizeObserverEntry>;
34
31
  declare class NgxActionsGroupComponent {
35
32
  protected readonly hiddenActions: Signal<ElementRef<HTMLElement>[]>;
36
33
  protected readonly intl: NgxLayoutIntl | null;
@@ -39,53 +36,118 @@ declare class NgxActionsGroupComponent {
39
36
  private readonly hiddenContainer;
40
37
  private readonly hostElement;
41
38
  private readonly renderer;
42
- private readonly destroyRef;
43
39
  private readonly hostSize;
44
40
  private readonly hostWidth;
45
41
  private readonly visibleActions;
46
42
  constructor();
47
43
  private getMaxVisibleAction;
48
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxActionsGroupComponent, never>;
49
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxActionsGroupComponent, "ngx-actions-group", never, {}, {}, ["iconButtons"], ["*"], true, never>;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxActionsGroupComponent, never>;
45
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxActionsGroupComponent, "ngx-actions-group", never, {}, {}, ["iconButtons"], ["*"], true, never>;
50
46
  }
51
47
 
52
48
  type AppBarMode = 'standard' | 'condensed';
53
49
  declare class NgxAppBarComponent {
54
- mode: i0.InputSignal<AppBarMode>;
55
- title: i0.InputSignal<string>;
56
- subtitle: i0.InputSignal<string | undefined>;
57
- helpUrl: i0.InputSignal<string | URL | undefined>;
58
- withBackIcon: i0.InputSignal<boolean>;
59
- readonly goBack: i0.OutputEmitterRef<void>;
50
+ mode: _angular_core.InputSignal<AppBarMode>;
51
+ title: _angular_core.InputSignal<string>;
52
+ subtitle: _angular_core.InputSignal<string | undefined>;
53
+ helpUrl: _angular_core.InputSignal<string | URL | undefined>;
54
+ withBackIcon: _angular_core.InputSignal<boolean>;
55
+ readonly goBack: _angular_core.OutputEmitterRef<void>;
60
56
  protected readonly intl: NgxLayoutIntl | null;
61
57
  private helpPopup;
62
58
  protected openHelp(): void;
63
59
  protected triggerGoBack(): void;
64
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxAppBarComponent, never>;
65
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxAppBarComponent, "ngx-app-bar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "helpUrl": { "alias": "helpUrl"; "required": false; "isSignal": true; }; "withBackIcon": { "alias": "withBackIcon"; "required": false; "isSignal": true; }; }, { "goBack": "goBack"; }, never, ["*"], true, never>;
60
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxAppBarComponent, never>;
61
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxAppBarComponent, "ngx-app-bar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "helpUrl": { "alias": "helpUrl"; "required": false; "isSignal": true; }; "withBackIcon": { "alias": "withBackIcon"; "required": false; "isSignal": true; }; }, { "goBack": "goBack"; }, never, ["*"], true, never>;
62
+ }
63
+
64
+ type FilterType = 'toggle' | 'complex';
65
+ interface NgxBaseFilter {
66
+ readonly label: InputSignal<string>;
67
+ readonly active: InputSignal<boolean>;
68
+ readonly type: FilterType;
69
+ }
70
+ interface NgxToggleFilter extends NgxBaseFilter {
71
+ readonly type: 'toggle';
72
+ readonly active: ModelSignal<boolean>;
73
+ }
74
+ interface NgxComplexFilter extends NgxBaseFilter {
75
+ readonly selectedFilterLabel: InputSignal<string>;
76
+ readonly templateRef: TemplateRef<unknown>;
77
+ readonly type: 'complex';
78
+ }
79
+ type NgxFilter = NgxToggleFilter | NgxComplexFilter;
80
+
81
+ declare class NgxFilterDirective implements NgxComplexFilter {
82
+ readonly type = "complex";
83
+ readonly label: _angular_core.InputSignal<string>;
84
+ readonly active: _angular_core.InputSignal<boolean>;
85
+ readonly selectedFilterLabel: _angular_core.InputSignal<string>;
86
+ readonly templateRef: TemplateRef<unknown>;
87
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxFilterDirective, never>;
88
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxFilterDirective, "ng-template[ngx-filter]", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "active": { "alias": "active"; "required": true; "isSignal": true; }; "selectedFilterLabel": { "alias": "selectedFilterLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
89
+ }
90
+
91
+ declare class NgxFilterToggleDirective implements NgxToggleFilter {
92
+ readonly type = "toggle";
93
+ readonly label: _angular_core.InputSignal<string>;
94
+ readonly active: _angular_core.ModelSignal<boolean>;
95
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxFilterToggleDirective, never>;
96
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxFilterToggleDirective, "ng-template[ngx-filter-toggle]", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "active": { "alias": "active"; "required": true; "isSignal": true; }; }, { "active": "activeChange"; }, never, never, true, never>;
97
+ }
98
+
99
+ declare class NgxFiltersGroupComponent {
100
+ readonly resetFilters: _angular_core.OutputEmitterRef<void>;
101
+ readonly folded: _angular_core.InputSignal<boolean | undefined>;
102
+ protected readonly intl: NgxLayoutIntl | null;
103
+ protected readonly overlayOrigin: _angular_core.WritableSignal<CdkOverlayOrigin | undefined>;
104
+ protected readonly overlayContent: _angular_core.WritableSignal<TemplateRef<unknown> | undefined>;
105
+ protected readonly overlayOpen: _angular_core.WritableSignal<boolean>;
106
+ protected readonly moreFiltersOverlay: _angular_core.WritableSignal<boolean>;
107
+ protected readonly overlayPositions: ConnectionPositionPair[];
108
+ protected allFilters: Signal<readonly NgxFilter[]>;
109
+ protected readonly activeFiltersAmount: Signal<number>;
110
+ protected readonly visibleFilters: Signal<NgxFilter[]>;
111
+ protected readonly invisibleFilters: Signal<readonly NgxFilter[]>;
112
+ private readonly filterContainerRef;
113
+ private readonly filterContainerPadding;
114
+ private readonly hostElement;
115
+ private readonly hostSize;
116
+ private readonly hostWidth;
117
+ private readonly measureRowRef;
118
+ private readonly measureRowSize;
119
+ private readonly measureRowWidth;
120
+ private readonly staticFieldsRef;
121
+ private readonly staticFieldsSize;
122
+ private readonly staticFieldsWidth;
123
+ private readonly lastFittingIndex;
124
+ protected emitResetClicked(): void;
125
+ private getLastFittingIndex;
126
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxFiltersGroupComponent, never>;
127
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxFiltersGroupComponent, "ngx-filters-group", never, { "folded": { "alias": "folded"; "required": false; "isSignal": true; }; }, { "resetFilters": "resetFilters"; }, ["allFilters"], never, true, never>;
66
128
  }
67
129
 
68
130
  declare class NgxLayoutComponent {
69
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxLayoutComponent, never>;
70
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxLayoutComponent, "ngx-layout", never, {}, {}, never, ["ngx-app-bar", "ngx-main-bar", "*", "ngx-panel"], true, never>;
131
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxLayoutComponent, never>;
132
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxLayoutComponent, "ngx-layout", never, {}, {}, never, ["ngx-app-bar", "ngx-main-bar", "*", "ngx-panel"], true, never>;
71
133
  }
72
134
 
73
135
  declare class NgxMainBarComponent {
74
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxMainBarComponent, never>;
75
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxMainBarComponent, "ngx-main-bar", never, {}, {}, never, ["ngx-actions-group", "ngx-filters-group", "ngx-search-bar-container"], true, never>;
136
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxMainBarComponent, never>;
137
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxMainBarComponent, "ngx-main-bar", never, {}, {}, never, ["ngx-actions-group", "ngx-filters-group", "ngx-search-bar-container"], true, never>;
76
138
  }
77
139
 
78
140
  type Appearance = 'transparent' | 'default';
79
141
  type ContentPadding = 'none' | 'regular';
80
142
  declare class NgxPanelComponent {
81
- readonly appearance: i0.InputSignal<Appearance | undefined>;
82
- readonly contentPadding: i0.InputSignal<ContentPadding | undefined>;
83
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxPanelComponent, never>;
84
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxPanelComponent, "ngx-panel", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "content-padding"; "required": false; "isSignal": true; }; }, {}, never, ["ngx-panel-bar[primary]", "ngx-panel-bar", "*"], true, never>;
143
+ readonly appearance: _angular_core.InputSignal<Appearance | undefined>;
144
+ readonly contentPadding: _angular_core.InputSignal<ContentPadding | undefined>;
145
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPanelComponent, never>;
146
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPanelComponent, "ngx-panel", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "content-padding"; "required": false; "isSignal": true; }; }, {}, never, ["ngx-panel-bar[primary]", "ngx-panel-bar", "*"], true, never>;
85
147
  }
86
148
 
87
149
  declare class NgxSearchInputDirective {
88
- readonly blurred: i0.WritableSignal<boolean>;
150
+ readonly blurred: _angular_core.WritableSignal<boolean>;
89
151
  readonly value: Signal<string>;
90
152
  private readonly ngControl;
91
153
  private readonly input;
@@ -93,22 +155,22 @@ declare class NgxSearchInputDirective {
93
155
  constructor();
94
156
  focus(): void;
95
157
  reset(): void;
96
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxSearchInputDirective, never>;
97
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgxSearchInputDirective, "input[ngx-search-input]", never, {}, {}, never, never, true, never>;
158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxSearchInputDirective, never>;
159
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxSearchInputDirective, "input[ngx-search-input]", never, {}, {}, never, never, true, never>;
98
160
  }
99
161
 
100
162
  declare class NgxSearchBarContainerComponent {
101
- readonly folded: i0.InputSignal<boolean>;
163
+ readonly folded: _angular_core.InputSignal<boolean>;
102
164
  protected readonly intl: NgxLayoutIntl | null;
103
- protected readonly manualFoldingState: i0.WritableSignal<boolean>;
104
- protected readonly isFolded: i0.Signal<boolean>;
105
- protected readonly searchInput: i0.Signal<NgxSearchInputDirective | undefined>;
106
- protected readonly searchText: i0.Signal<string | undefined>;
165
+ protected readonly manualFoldingState: _angular_core.WritableSignal<boolean>;
166
+ protected readonly isFolded: _angular_core.Signal<boolean>;
167
+ protected readonly searchInput: _angular_core.Signal<NgxSearchInputDirective | undefined>;
168
+ protected readonly searchText: _angular_core.Signal<string | undefined>;
107
169
  constructor();
108
170
  protected toggleFolded(): void;
109
171
  protected resetInput(): void;
110
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxSearchBarContainerComponent, never>;
111
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxSearchBarContainerComponent, "ngx-search-bar-container", never, { "folded": { "alias": "folded"; "required": false; "isSignal": true; }; }, {}, ["searchInput"], ["[ngx-search-input]"], true, never>;
172
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxSearchBarContainerComponent, never>;
173
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxSearchBarContainerComponent, "ngx-search-bar-container", never, { "folded": { "alias": "folded"; "required": false; "isSignal": true; }; }, {}, ["searchInput"], ["[ngx-search-input]"], true, never>;
112
174
  }
113
175
 
114
- export { NgxActionsGroupComponent, NgxAppBarComponent, NgxLayoutComponent, NgxLayoutIntl, NgxMainBarComponent, NgxPanelComponent, NgxSearchBarContainerComponent, NgxSearchInputDirective, provideNgxLayout, resizeSignal };
176
+ export { NgxActionsGroupComponent, NgxAppBarComponent, NgxFilterDirective, NgxFilterToggleDirective, NgxFiltersGroupComponent, NgxLayoutComponent, NgxLayoutIntl, NgxMainBarComponent, NgxPanelComponent, NgxSearchBarContainerComponent, NgxSearchInputDirective, provideNgxLayout };