@design-factory/angular 21.0.0-next.1 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,63 @@
1
1
  <h1 align="center">Amadeus Design Factory Angular implementation</h1>
2
2
 
3
- TODO
3
+ ## Description
4
+
5
+ Design Factory Angular is the package containing the Angular components implementing the Amadeus Design System, Design Factory.
6
+
7
+ Design Factory is an InnerSource design system made of:
8
+
9
+ - A UI library for Amadeus external and internal interfaces and applications, based on our four pillars
10
+ - A set of design and coding best practices
11
+ - A cross-functional community from all Amadeus business units
12
+
13
+ If you want to get more information about Design Factory, please contact [Design Factory team](mailto:DesignFactory@amadeus.com).
14
+
15
+ ## Getting started
16
+
17
+ You can easily add Design Factory library in your project thanks our schematics.
18
+ Just run the following:
19
+
20
+ ```bash
21
+ ng add @design-factory/angular
22
+ ```
23
+
24
+ It will install Design Factory for the default application specified in your angular.json. If you have multiple projects and you want to target a specific application, you could specify the --project option
25
+
26
+ ```bash
27
+ ng add @design-factory/angular --project myProject
28
+ ```
29
+
30
+ ## Architecture
31
+
32
+ The Design Factory is composed of multiple projects and you can install the package that fits your requirements.
33
+
34
+ - `@design-factory/tokens` includes the Design Tokens that empower the Design System
35
+ - `@design-factory/styles` includes the styles, composed of utilities and component styles
36
+ - `@design-factory/design-factory` contains Angular components and utilities. They will be migrated to the following package
37
+ - `@design-factory/angular` contains the new SideNav and will grow to include all Design Factory Angular components
38
+
39
+ ### CSS namespace feature
40
+
41
+ For some specific cases, you may have to use the CSS namespace feature which allows you to apply DF styles only under a selector defined by $df-css-namespace-selector variable (by default ==.design-factory-v2==).
42
+ In order to use this feature, just import the following:
43
+
44
+ ```scss
45
+ @import '@design-factory/styles/scss/namespace';
46
+ ```
47
+
48
+ in your styles.scss and add the defined selector in your HTML element where you want to apply DF style.
49
+
50
+ ## Dependencies
51
+
52
+ The dependencies are [Angular](https://angular.io), [Bootstrap 5](https://getbootstrap.com), [Ng-bootstrap](https://ng-bootstrap.github.io), [AgnosUI](https://www.agnosui.dev), [Ng-select](https://ng-select.github.io/ng-select#/data-sources), [Ag-grid](https://www.ag-grid.com/) and [ngx-slider](https://angular-slider.github.io/ngx-slider/).
53
+ The supported versions are:
54
+
55
+ | Design Factory | Angular | Bootstrap CSS | Ng-Bootstrap | Ng-select | Ag-grid | AgnosUI |
56
+ | -------------- | ------- | ------------- | ------------ | --------- | ------- | ------- |
57
+ | 21.0.x | 21.x | 5.3.8 | 20.0.x | 21.x | 35.x | 0.10.x |
58
+
59
+ ## How to work with the icons
60
+
61
+ Icons are a mix of [Font Awesome](https://fontawesome.com/) (FW) and in-house produced pictograms.
62
+
63
+ Since DF 18.0.0 release in-house icons and FW icons are split into different fonts.
@@ -1,31 +1,26 @@
1
1
  import { createDrawer, createSimpleClassTransition, createNavManager, UseDirective, UseMultiDirective } from '@agnos-ui/angular-headless';
2
2
  import { fadeTransition } from '@agnos-ui/core-bootstrap';
3
- import { isPlatformBrowser } from '@angular/common';
4
3
  import * as i0 from '@angular/core';
5
- import { input, model, output, inject, PLATFORM_ID, booleanAttribute, linkedSignal, ChangeDetectionStrategy, Component } from '@angular/core';
6
- import { toSignal } from '@angular/core/rxjs-interop';
4
+ import { input, booleanAttribute, model, output, ChangeDetectionStrategy, Component } from '@angular/core';
7
5
  import { AgnosWidgetDirective, callWidgetFactory } from '@design-factory/angular/internals';
8
- import { DfMedia } from '@design-factory/design-factory';
9
6
 
10
7
  /**
11
- * Utility method to check if the user agent is a mobile device
12
- *
13
- * @param userAgent - The user agent string to check
14
- * @returns `true` if the user agent corresponds to a mobile device, `false` otherwise
8
+ * Enables users to show contextual content via a sliding panel from any screen edge.
9
+ * @experimental
15
10
  */
16
- function isMobileUserAgent(userAgent) {
17
- return /mobile|android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);
18
- }
19
11
  class DfDrawerComponent extends AgnosWidgetDirective {
20
12
  constructor() {
21
13
  const widget = callWidgetFactory(createDrawer, {
22
14
  defaultConfig: {
23
- className: '',
24
- bodyScroll: true,
25
- backdrop: false,
15
+ className: 'inline-start',
16
+ bodyScroll: false,
17
+ backdrop: true,
26
18
  transition: createSimpleClassTransition({
27
19
  showClasses: ['show']
28
20
  }),
21
+ verticalTransition: createSimpleClassTransition({
22
+ showClasses: ['show']
23
+ }),
29
24
  backdropTransition: fadeTransition
30
25
  },
31
26
  events: {
@@ -59,13 +54,13 @@ class DfDrawerComponent extends AgnosWidgetDirective {
59
54
  *
60
55
  * @defaultValue `false`
61
56
  */
62
- this.bodyScroll = input(false, ...(ngDevMode ? [{ debugName: "bodyScroll" }] : []));
57
+ this.bodyScroll = input(false, { ...(ngDevMode ? { debugName: "bodyScroll" } : {}), transform: booleanAttribute });
63
58
  /**
64
59
  * If `true` displays the backdrop element and disables the body scrolling, otherwise the body of the document is navigable
65
60
  *
66
61
  * @defaultValue `true`
67
62
  */
68
- this.backdrop = input(true, ...(ngDevMode ? [{ debugName: "backdrop" }] : []));
63
+ this.backdrop = input(true, { ...(ngDevMode ? { debugName: "backdrop" } : {}), transform: booleanAttribute });
69
64
  /**
70
65
  * Which element should contain the drawer and backdrop DOM elements.
71
66
  * If it is not null, the drawer and backdrop DOM elements are moved to the specified container.
@@ -88,13 +83,20 @@ class DfDrawerComponent extends AgnosWidgetDirective {
88
83
  *
89
84
  * @defaultValue `false`
90
85
  */
91
- this.resizable = input(false, ...(ngDevMode ? [{ debugName: "resizable" }] : []));
86
+ this.resizable = input(false, { ...(ngDevMode ? { debugName: "resizable" } : {}), transform: booleanAttribute });
92
87
  /**
93
88
  * If `true`, the drawer is shown; otherwise, it is hidden.
94
89
  *
95
90
  * @defaultValue `false`
96
91
  */
97
- this.visible = input(false, ...(ngDevMode ? [{ debugName: "visible" }] : []));
92
+ this.visible = input(false, { ...(ngDevMode ? { debugName: "visible" } : {}), transform: booleanAttribute });
93
+ /**
94
+ * If `true`, the drawer element is kept in the DOM when it is not visible.
95
+ * This can be useful to preserve the state of the drawer content when it is hidden.
96
+ *
97
+ * @defaultValue `true`
98
+ */
99
+ this.keepInDom = input(true, { ...(ngDevMode ? { debugName: "keepInDom" } : {}), transform: booleanAttribute });
98
100
  /**
99
101
  * An event emitted when the width is changed.
100
102
  *
@@ -144,6 +146,12 @@ class DfDrawerComponent extends AgnosWidgetDirective {
144
146
  * ```
145
147
  */
146
148
  this.resizingChange = output();
149
+ /**
150
+ * If `true` focuses the drawer when it is opened.
151
+ *
152
+ * @defaultValue `true`
153
+ */
154
+ this.focusOnInit = input(true, { ...(ngDevMode ? { debugName: "focusOnInit" } : {}), transform: booleanAttribute });
147
155
  this.navManager = createNavManager();
148
156
  this.navManagerConfig = {
149
157
  keys: {
@@ -163,77 +171,57 @@ class DfDrawerComponent extends AgnosWidgetDirective {
163
171
  * @defaultValue `null`
164
172
  */
165
173
  this.maxSize = output();
166
- this.isMediumScreen = toSignal(inject(DfMedia).getObservable(['md']), { initialValue: false });
167
- this.isLargeUpScreen = toSignal(inject(DfMedia).getObservable(['lg', 'xl', 'xxl', 'xxxl']), {
168
- initialValue: false
169
- });
170
- this.isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
171
- /**
172
- * Flag to enable mobile device detection for responsive behavior
173
- * @default true
174
- */
175
- this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : {}), transform: booleanAttribute });
176
- /**
177
- * Flag to indicate if the drawer is minimized
178
- */
179
- this.isMinimized = linkedSignal(() => {
180
- // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size
181
- if (this.isMobileDevice) {
182
- return true;
183
- }
184
- // in desktop, we track the large screen signal in order to reset the minimized state
185
- // it allows resizing the window and have a more user-friendly behavior
186
- return !this.isLargeUpScreen();
187
- }, ...(ngDevMode ? [{ debugName: "isMinimized" }] : []));
188
- this.isMobileDevice = (() => {
189
- if (this.isBrowser) {
190
- return this.enableMobile() && isMobileUserAgent(navigator.userAgent);
191
- }
192
- else {
193
- // SSR: try to get request if available
194
- try {
195
- const request = inject(Request, { optional: true });
196
- if (request && 'headers' in request) {
197
- const userAgent = request.headers.get('user-agent') || '';
198
- return this.enableMobile() && isMobileUserAgent(userAgent);
199
- }
200
- }
201
- catch {
202
- // Request token not available or not in SSR context
203
- }
204
- return false;
205
- }
206
- })();
174
+ }
175
+ /**
176
+ * Trigger the opening of the drawer.
177
+ */
178
+ open() {
179
+ this._agnosWidget.api.open();
180
+ }
181
+ /**
182
+ * Trigger the closing of the drawer.
183
+ */
184
+ close() {
185
+ this._agnosWidget.api.close();
207
186
  }
208
187
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DfDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
209
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfDrawerComponent, isStandalone: true, selector: "df-drawer", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, bodyScroll: { classPropertyName: "bodyScroll", publicName: "bodyScroll", isSignal: true, isRequired: false, transformFunction: null }, backdrop: { classPropertyName: "backdrop", publicName: "backdrop", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, enableMobile: { classPropertyName: "enableMobile", publicName: "enableMobile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange", sizeChange: "sizeChange", visibleChange: "visibleChange", minimizedChange: "minimizedChange", maximizedChange: "maximizedChange", resizingChange: "resizingChange", minSize: "minSize", maxSize: "maxSize" }, usesInheritance: true, ngImport: i0, template: `
210
- <div
211
- class="df-drawer d-flex"
212
- [class]="_agnosWidget.state.className()"
213
- [class.show]="_agnosWidget.state.visible()"
214
- [auUseMulti]="[_agnosWidget.directives.drawerPortalDirective, _agnosWidget.directives.drawerDirective]"
215
- [style.--df-drawer-size]="size() !== null ? size() + 'px' : ''"
216
- >
217
- <ng-content />
218
- @if (_agnosWidget.state.resizable()) {
219
- <div class="df-drawer-splitter" tabindex="-1" [auUse]="_agnosWidget.directives.splitterDirective">
220
- <button
221
- #splitterHandle
222
- class="btn btn-outline-primary df-btn-icononly df-drawer-splitter-handle"
223
- [class.df-btn-outline-neutral-mirror]="isMediumScreen() && !isMinimized()"
224
- i18n-aria-label="@@df.drawer.resize.ariaLabel"
225
- aria-label="Resize drawer"
226
- [auUse]="[navManager.directive, navManagerConfig]"
188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfDrawerComponent, isStandalone: true, selector: "df-drawer", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, bodyScroll: { classPropertyName: "bodyScroll", publicName: "bodyScroll", isSignal: true, isRequired: false, transformFunction: null }, backdrop: { classPropertyName: "backdrop", publicName: "backdrop", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, keepInDom: { classPropertyName: "keepInDom", publicName: "keepInDom", isSignal: true, isRequired: false, transformFunction: null }, focusOnInit: { classPropertyName: "focusOnInit", publicName: "focusOnInit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { size: "sizeChange", sizeChange: "sizeChange", visibleChange: "visibleChange", minimizedChange: "minimizedChange", maximizedChange: "maximizedChange", resizingChange: "resizingChange", minSize: "minSize", maxSize: "maxSize" }, usesInheritance: true, ngImport: i0, template: `
189
+ @if (!_agnosWidget.state.hidden() || keepInDom()) {
190
+ <div
191
+ class="df-drawer"
192
+ [class]="_agnosWidget.state.className()"
193
+ [class.show]="_agnosWidget.state.visible()"
194
+ [auUseMulti]="[_agnosWidget.directives.drawerPortalDirective, _agnosWidget.directives.drawerDirective]"
195
+ [style.--df-drawer-size]="size() !== null ? size() + 'px' : ''"
196
+ >
197
+ <ng-content />
198
+ @if (_agnosWidget.state.resizable()) {
199
+ <div
200
+ class="df-drawer-splitter"
201
+ tabindex="-1"
202
+ [auUse]="_agnosWidget.directives.splitterDirective"
203
+ [style.align-items]="!_agnosWidget.state.isVertical() ? 'center' : undefined"
204
+ [style.justify-content]="_agnosWidget.state.isVertical() ? 'center' : undefined"
227
205
  >
228
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 192 512" fill="currentColor">
229
- <path
230
- d="M16 32C7.2 32 0 39.2 0 48L0 464c0 8.8 7.2 16 16 16s16-7.2 16-16L32 48c0-8.8-7.2-16-16-16zm160 0c-8.8 0-16 7.2-16 16l0 416c0 8.8 7.2 16 16 16s16-7.2 16-16l0-416c0-8.8-7.2-16-16-16z"
231
- />
232
- </svg>
233
- </button>
234
- </div>
235
- }
236
- </div>
206
+ <ng-content select="df-drawer-splitter-content">
207
+ <button
208
+ #splitterHandle
209
+ class="btn df-btn-icononly df-btn-tertiary df-drawer-splitter-handle"
210
+ [class]="{
211
+ 'fa-grip-lines-vertical': !_agnosWidget.state.isVertical(),
212
+ 'fa-grip-lines': _agnosWidget.state.isVertical(),
213
+ 'df-btn-outline-neutral-mirror': !_agnosWidget.state.backdropHidden(),
214
+ 'btn-outline-primary': _agnosWidget.state.backdropHidden()
215
+ }"
216
+ i18n-aria-label="@@df.drawer.resize.ariaLabel"
217
+ aria-label="Resize drawer"
218
+ [auUse]="[navManager.directive, navManagerConfig]"
219
+ ></button>
220
+ </ng-content>
221
+ </div>
222
+ }
223
+ </div>
224
+ }
237
225
  @if (!_agnosWidget.state.backdropHidden()) {
238
226
  <div
239
227
  class="df-drawer-backdrop"
@@ -249,33 +237,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
249
237
  selector: 'df-drawer',
250
238
  imports: [UseDirective, UseMultiDirective],
251
239
  template: `
252
- <div
253
- class="df-drawer d-flex"
254
- [class]="_agnosWidget.state.className()"
255
- [class.show]="_agnosWidget.state.visible()"
256
- [auUseMulti]="[_agnosWidget.directives.drawerPortalDirective, _agnosWidget.directives.drawerDirective]"
257
- [style.--df-drawer-size]="size() !== null ? size() + 'px' : ''"
258
- >
259
- <ng-content />
260
- @if (_agnosWidget.state.resizable()) {
261
- <div class="df-drawer-splitter" tabindex="-1" [auUse]="_agnosWidget.directives.splitterDirective">
262
- <button
263
- #splitterHandle
264
- class="btn btn-outline-primary df-btn-icononly df-drawer-splitter-handle"
265
- [class.df-btn-outline-neutral-mirror]="isMediumScreen() && !isMinimized()"
266
- i18n-aria-label="@@df.drawer.resize.ariaLabel"
267
- aria-label="Resize drawer"
268
- [auUse]="[navManager.directive, navManagerConfig]"
240
+ @if (!_agnosWidget.state.hidden() || keepInDom()) {
241
+ <div
242
+ class="df-drawer"
243
+ [class]="_agnosWidget.state.className()"
244
+ [class.show]="_agnosWidget.state.visible()"
245
+ [auUseMulti]="[_agnosWidget.directives.drawerPortalDirective, _agnosWidget.directives.drawerDirective]"
246
+ [style.--df-drawer-size]="size() !== null ? size() + 'px' : ''"
247
+ >
248
+ <ng-content />
249
+ @if (_agnosWidget.state.resizable()) {
250
+ <div
251
+ class="df-drawer-splitter"
252
+ tabindex="-1"
253
+ [auUse]="_agnosWidget.directives.splitterDirective"
254
+ [style.align-items]="!_agnosWidget.state.isVertical() ? 'center' : undefined"
255
+ [style.justify-content]="_agnosWidget.state.isVertical() ? 'center' : undefined"
269
256
  >
270
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 192 512" fill="currentColor">
271
- <path
272
- d="M16 32C7.2 32 0 39.2 0 48L0 464c0 8.8 7.2 16 16 16s16-7.2 16-16L32 48c0-8.8-7.2-16-16-16zm160 0c-8.8 0-16 7.2-16 16l0 416c0 8.8 7.2 16 16 16s16-7.2 16-16l0-416c0-8.8-7.2-16-16-16z"
273
- />
274
- </svg>
275
- </button>
276
- </div>
277
- }
278
- </div>
257
+ <ng-content select="df-drawer-splitter-content">
258
+ <button
259
+ #splitterHandle
260
+ class="btn df-btn-icononly df-btn-tertiary df-drawer-splitter-handle"
261
+ [class]="{
262
+ 'fa-grip-lines-vertical': !_agnosWidget.state.isVertical(),
263
+ 'fa-grip-lines': _agnosWidget.state.isVertical(),
264
+ 'df-btn-outline-neutral-mirror': !_agnosWidget.state.backdropHidden(),
265
+ 'btn-outline-primary': _agnosWidget.state.backdropHidden()
266
+ }"
267
+ i18n-aria-label="@@df.drawer.resize.ariaLabel"
268
+ aria-label="Resize drawer"
269
+ [auUse]="[navManager.directive, navManagerConfig]"
270
+ ></button>
271
+ </ng-content>
272
+ </div>
273
+ }
274
+ </div>
275
+ }
279
276
  @if (!_agnosWidget.state.backdropHidden()) {
280
277
  <div
281
278
  class="df-drawer-backdrop"
@@ -286,7 +283,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
286
283
  `,
287
284
  changeDetection: ChangeDetectionStrategy.OnPush
288
285
  }]
289
- }], ctorParameters: () => [], propDecorators: { className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], bodyScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "bodyScroll", required: false }] }], backdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdrop", required: false }] }], container: [{ type: i0.Input, args: [{ isSignal: true, alias: "container", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], sizeChange: [{ type: i0.Output, args: ["sizeChange"] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }], minimizedChange: [{ type: i0.Output, args: ["minimizedChange"] }], maximizedChange: [{ type: i0.Output, args: ["maximizedChange"] }], resizingChange: [{ type: i0.Output, args: ["resizingChange"] }], minSize: [{ type: i0.Output, args: ["minSize"] }], maxSize: [{ type: i0.Output, args: ["maxSize"] }], enableMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableMobile", required: false }] }] } });
286
+ }], ctorParameters: () => [], propDecorators: { className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], bodyScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "bodyScroll", required: false }] }], backdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdrop", required: false }] }], container: [{ type: i0.Input, args: [{ isSignal: true, alias: "container", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }, { type: i0.Output, args: ["sizeChange"] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], keepInDom: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepInDom", required: false }] }], sizeChange: [{ type: i0.Output, args: ["sizeChange"] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }], minimizedChange: [{ type: i0.Output, args: ["minimizedChange"] }], maximizedChange: [{ type: i0.Output, args: ["maximizedChange"] }], resizingChange: [{ type: i0.Output, args: ["resizingChange"] }], focusOnInit: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusOnInit", required: false }] }], minSize: [{ type: i0.Output, args: ["minSize"] }], maxSize: [{ type: i0.Output, args: ["maxSize"] }] } });
290
287
 
291
288
  /**
292
289
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"design-factory-angular-drawer.mjs","sources":["../../drawer/drawer.ts","../../drawer/design-factory-angular-drawer.ts"],"sourcesContent":["import type { DrawerWidget, NavManagerItemConfig } from '@agnos-ui/angular-headless';\nimport {\n createDrawer,\n createNavManager,\n createSimpleClassTransition,\n UseDirective,\n UseMultiDirective\n} from '@agnos-ui/angular-headless';\nimport { fadeTransition } from '@agnos-ui/core-bootstrap';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n linkedSignal,\n model,\n output,\n PLATFORM_ID\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { AgnosWidgetDirective, callWidgetFactory } from '@design-factory/angular/internals';\nimport { DfMedia } from '@design-factory/design-factory';\n\n/**\n * Utility method to check if the user agent is a mobile device\n *\n * @param userAgent - The user agent string to check\n * @returns `true` if the user agent corresponds to a mobile device, `false` otherwise\n */\nfunction isMobileUserAgent(userAgent: string): boolean {\n return /mobile|android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);\n}\n\n@Component({\n selector: 'df-drawer',\n imports: [UseDirective, UseMultiDirective],\n template: `\n <div\n class=\"df-drawer d-flex\"\n [class]=\"_agnosWidget.state.className()\"\n [class.show]=\"_agnosWidget.state.visible()\"\n [auUseMulti]=\"[_agnosWidget.directives.drawerPortalDirective, _agnosWidget.directives.drawerDirective]\"\n [style.--df-drawer-size]=\"size() !== null ? size() + 'px' : ''\"\n >\n <ng-content />\n @if (_agnosWidget.state.resizable()) {\n <div class=\"df-drawer-splitter\" tabindex=\"-1\" [auUse]=\"_agnosWidget.directives.splitterDirective\">\n <button\n #splitterHandle\n class=\"btn btn-outline-primary df-btn-icononly df-drawer-splitter-handle\"\n [class.df-btn-outline-neutral-mirror]=\"isMediumScreen() && !isMinimized()\"\n i18n-aria-label=\"@@df.drawer.resize.ariaLabel\"\n aria-label=\"Resize drawer\"\n [auUse]=\"[navManager.directive, navManagerConfig]\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 192 512\" fill=\"currentColor\">\n <path\n d=\"M16 32C7.2 32 0 39.2 0 48L0 464c0 8.8 7.2 16 16 16s16-7.2 16-16L32 48c0-8.8-7.2-16-16-16zm160 0c-8.8 0-16 7.2-16 16l0 416c0 8.8 7.2 16 16 16s16-7.2 16-16l0-416c0-8.8-7.2-16-16-16z\"\n />\n </svg>\n </button>\n </div>\n }\n </div>\n @if (!_agnosWidget.state.backdropHidden()) {\n <div\n class=\"df-drawer-backdrop\"\n [class.show]=\"_agnosWidget.state.visible()\"\n [auUseMulti]=\"[_agnosWidget.directives.backdropPortalDirective, _agnosWidget.directives.backdropDirective]\"\n ></div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {\n /**\n * CSS classes to be applied on the widget main container\n *\n * @defaultValue ``\n */\n readonly className = input<string>('');\n /**\n * If `true` allows body scrolling when the drawer is open.\n *\n * @defaultValue `false`\n */\n readonly bodyScroll = input<boolean>(false);\n /**\n * If `true` displays the backdrop element and disables the body scrolling, otherwise the body of the document is navigable\n *\n * @defaultValue `true`\n */\n readonly backdrop = input<boolean>(true);\n /**\n * Which element should contain the drawer and backdrop DOM elements.\n * If it is not null, the drawer and backdrop DOM elements are moved to the specified container.\n * Otherwise, they stay where the widget is located.\n *\n * @defaultValue\n * ```ts\n * typeof window !== 'undefined' ? document.body : null\n * ```\n */\n readonly container = input<HTMLElement | null>(null);\n /**\n * The size of the drawer in pixels.\n *\n * @defaultValue `300`\n */\n readonly size = model<number | null>(300);\n /**\n * If `true`, the drawer can be resized by the user.\n *\n * @defaultValue `false`\n */\n readonly resizable = input<boolean>(false);\n /**\n * If `true`, the drawer is shown; otherwise, it is hidden.\n *\n * @defaultValue `false`\n */\n readonly visible = input<boolean>(false);\n\n /**\n * An event emitted when the width is changed.\n *\n * Event payload is equal to the newly selected width.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly sizeChange = output<number | null>();\n /**\n * Event to be triggered when the visible property changes.\n *\n * @param visible - new value of the visible propery\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly visibleChange = output<boolean>();\n\n /**\n * Event to be triggered when the minimized state changes.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly minimizedChange = output<boolean>();\n\n /**\n * Event to be triggered when the maximized state changes.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly maximizedChange = output<boolean>();\n\n /**\n * Event to be triggered when the user start or stop moving the drawer.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly resizingChange = output<boolean>();\n\n protected readonly navManager = createNavManager();\n\n protected readonly navManagerConfig: NavManagerItemConfig = {\n keys: {\n Home: this.navManager.focusFirst,\n End: this.navManager.focusLast\n }\n };\n\n /**\n * Event to be triggered when the minimum size is reached.\n *\n * @defaultValue `null`\n */\n readonly minSize = output<void>();\n\n /**\n * Event to be triggered when the maximum size is reached.\n *\n * @defaultValue `null`\n */\n readonly maxSize = output<void>();\n\n protected readonly isMediumScreen = toSignal(inject(DfMedia).getObservable(['md']), { initialValue: false });\n protected readonly isLargeUpScreen = toSignal(inject(DfMedia).getObservable(['lg', 'xl', 'xxl', 'xxxl']), {\n initialValue: false\n });\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /**\n * Flag to enable mobile device detection for responsive behavior\n * @default true\n */\n readonly enableMobile = input(true, { transform: booleanAttribute });\n\n /**\n * Flag to indicate if the drawer is minimized\n */\n readonly isMinimized = linkedSignal(() => {\n // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size\n if (this.isMobileDevice) {\n return true;\n }\n // in desktop, we track the large screen signal in order to reset the minimized state\n // it allows resizing the window and have a more user-friendly behavior\n return !this.isLargeUpScreen();\n });\n\n protected readonly isMobileDevice = (() => {\n if (this.isBrowser) {\n return this.enableMobile() && isMobileUserAgent(navigator.userAgent);\n } else {\n // SSR: try to get request if available\n try {\n const request = inject(Request, { optional: true });\n if (request && 'headers' in request) {\n const userAgent = request.headers.get('user-agent') || '';\n return this.enableMobile() && isMobileUserAgent(userAgent);\n }\n } catch {\n // Request token not available or not in SSR context\n }\n return false;\n }\n })();\n\n constructor() {\n const widget = callWidgetFactory(createDrawer, {\n defaultConfig: {\n className: '',\n bodyScroll: true,\n backdrop: false,\n transition: createSimpleClassTransition({\n showClasses: ['show']\n }),\n backdropTransition: fadeTransition\n },\n events: {\n onSizeChange: (size) => {\n this.size.set(size);\n this.sizeChange.emit(size);\n },\n onVisibleChange: (visible) => {\n this.visibleChange.emit(visible);\n },\n onMinimizedChange: (isMinimized) => {\n this.minimizedChange.emit(isMinimized);\n },\n onMaximizedChange: (isMaximized) => {\n this.maximizedChange.emit(isMaximized);\n },\n onResizingChange: (isResizing) => {\n this.resizingChange.emit(isResizing);\n }\n }\n });\n super(widget);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"design-factory-angular-drawer.mjs","sources":["../../drawer/drawer.ts","../../drawer/design-factory-angular-drawer.ts"],"sourcesContent":["import type { DrawerWidget, NavManagerItemConfig } from '@agnos-ui/angular-headless';\nimport {\n createDrawer,\n createNavManager,\n createSimpleClassTransition,\n UseDirective,\n UseMultiDirective\n} from '@agnos-ui/angular-headless';\nimport { fadeTransition } from '@agnos-ui/core-bootstrap';\nimport { booleanAttribute, ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\nimport { AgnosWidgetDirective, callWidgetFactory } from '@design-factory/angular/internals';\n\n/**\n * Possible values for the drawer positions.\n */\nexport type DrawerPositions = 'inline-start' | 'inline-end' | 'block-start' | 'block-end';\n\n/**\n * Enables users to show contextual content via a sliding panel from any screen edge.\n * @experimental\n */\n@Component({\n selector: 'df-drawer',\n imports: [UseDirective, UseMultiDirective],\n template: `\n @if (!_agnosWidget.state.hidden() || keepInDom()) {\n <div\n class=\"df-drawer\"\n [class]=\"_agnosWidget.state.className()\"\n [class.show]=\"_agnosWidget.state.visible()\"\n [auUseMulti]=\"[_agnosWidget.directives.drawerPortalDirective, _agnosWidget.directives.drawerDirective]\"\n [style.--df-drawer-size]=\"size() !== null ? size() + 'px' : ''\"\n >\n <ng-content />\n @if (_agnosWidget.state.resizable()) {\n <div\n class=\"df-drawer-splitter\"\n tabindex=\"-1\"\n [auUse]=\"_agnosWidget.directives.splitterDirective\"\n [style.align-items]=\"!_agnosWidget.state.isVertical() ? 'center' : undefined\"\n [style.justify-content]=\"_agnosWidget.state.isVertical() ? 'center' : undefined\"\n >\n <ng-content select=\"df-drawer-splitter-content\">\n <button\n #splitterHandle\n class=\"btn df-btn-icononly df-btn-tertiary df-drawer-splitter-handle\"\n [class]=\"{\n 'fa-grip-lines-vertical': !_agnosWidget.state.isVertical(),\n 'fa-grip-lines': _agnosWidget.state.isVertical(),\n 'df-btn-outline-neutral-mirror': !_agnosWidget.state.backdropHidden(),\n 'btn-outline-primary': _agnosWidget.state.backdropHidden()\n }\"\n i18n-aria-label=\"@@df.drawer.resize.ariaLabel\"\n aria-label=\"Resize drawer\"\n [auUse]=\"[navManager.directive, navManagerConfig]\"\n ></button>\n </ng-content>\n </div>\n }\n </div>\n }\n @if (!_agnosWidget.state.backdropHidden()) {\n <div\n class=\"df-drawer-backdrop\"\n [class.show]=\"_agnosWidget.state.visible()\"\n [auUseMulti]=\"[_agnosWidget.directives.backdropPortalDirective, _agnosWidget.directives.backdropDirective]\"\n ></div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {\n /**\n * CSS classes to be applied on the widget main container\n *\n * @defaultValue ``\n */\n readonly className = input<string>('');\n /**\n * If `true` allows body scrolling when the drawer is open.\n *\n * @defaultValue `false`\n */\n readonly bodyScroll = input(false, { transform: booleanAttribute });\n /**\n * If `true` displays the backdrop element and disables the body scrolling, otherwise the body of the document is navigable\n *\n * @defaultValue `true`\n */\n readonly backdrop = input(true, { transform: booleanAttribute });\n /**\n * Which element should contain the drawer and backdrop DOM elements.\n * If it is not null, the drawer and backdrop DOM elements are moved to the specified container.\n * Otherwise, they stay where the widget is located.\n *\n * @defaultValue\n * ```ts\n * typeof window !== 'undefined' ? document.body : null\n * ```\n */\n readonly container = input<HTMLElement | null>(null);\n /**\n * The size of the drawer in pixels.\n *\n * @defaultValue `300`\n */\n readonly size = model<number | null>(300);\n /**\n * If `true`, the drawer can be resized by the user.\n *\n * @defaultValue `false`\n */\n readonly resizable = input(false, { transform: booleanAttribute });\n /**\n * If `true`, the drawer is shown; otherwise, it is hidden.\n *\n * @defaultValue `false`\n */\n readonly visible = input(false, { transform: booleanAttribute });\n\n /**\n * If `true`, the drawer element is kept in the DOM when it is not visible.\n * This can be useful to preserve the state of the drawer content when it is hidden.\n *\n * @defaultValue `true`\n */\n readonly keepInDom = input(true, { transform: booleanAttribute });\n\n /**\n * An event emitted when the width is changed.\n *\n * Event payload is equal to the newly selected width.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly sizeChange = output<number | null>();\n /**\n * Event to be triggered when the visible property changes.\n *\n * @param visible - new value of the visible propery\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly visibleChange = output<boolean>();\n\n /**\n * Event to be triggered when the minimized state changes.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly minimizedChange = output<boolean>();\n\n /**\n * Event to be triggered when the maximized state changes.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly maximizedChange = output<boolean>();\n\n /**\n * Event to be triggered when the user start or stop moving the drawer.\n *\n * @defaultValue\n * ```ts\n * () => {}\n * ```\n */\n readonly resizingChange = output<boolean>();\n\n /**\n * If `true` focuses the drawer when it is opened.\n *\n * @defaultValue `true`\n */\n readonly focusOnInit = input(true, { transform: booleanAttribute });\n\n protected readonly navManager = createNavManager();\n\n protected readonly navManagerConfig: NavManagerItemConfig = {\n keys: {\n Home: this.navManager.focusFirst,\n End: this.navManager.focusLast\n }\n };\n\n /**\n * Event to be triggered when the minimum size is reached.\n *\n * @defaultValue `null`\n */\n readonly minSize = output<void>();\n\n /**\n * Event to be triggered when the maximum size is reached.\n *\n * @defaultValue `null`\n */\n readonly maxSize = output<void>();\n\n constructor() {\n const widget = callWidgetFactory(createDrawer, {\n defaultConfig: {\n className: 'inline-start',\n bodyScroll: false,\n backdrop: true,\n transition: createSimpleClassTransition({\n showClasses: ['show']\n }),\n verticalTransition: createSimpleClassTransition({\n showClasses: ['show']\n }),\n backdropTransition: fadeTransition\n },\n events: {\n onSizeChange: (size) => {\n this.size.set(size);\n this.sizeChange.emit(size);\n },\n onVisibleChange: (visible) => {\n this.visibleChange.emit(visible);\n },\n onMinimizedChange: (isMinimized) => {\n this.minimizedChange.emit(isMinimized);\n },\n onMaximizedChange: (isMaximized) => {\n this.maximizedChange.emit(isMaximized);\n },\n onResizingChange: (isResizing) => {\n this.resizingChange.emit(isResizing);\n }\n }\n });\n super(widget);\n }\n\n /**\n * Trigger the opening of the drawer.\n */\n public open(): void {\n this._agnosWidget.api.open();\n }\n\n /**\n * Trigger the closing of the drawer.\n */\n public close(): void {\n this._agnosWidget.api.close();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -725,7 +725,7 @@ class DfSidenavLinkComponent {
725
725
  this.sidenav = inject(DfSidenavComponent);
726
726
  }
727
727
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DfSidenavLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
728
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfSidenavLinkComponent, isStandalone: true, selector: "df-sidenav-link", inputs: { linkPath: { classPropertyName: "linkPath", publicName: "linkPath", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, properties: { "class.mobile": "sidenav['isMobileDevice']" }, classAttribute: "d-block" }, queries: [{ propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavLinkDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavLinkMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
728
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfSidenavLinkComponent, isStandalone: true, selector: "df-sidenav-link", inputs: { linkPath: { classPropertyName: "linkPath", publicName: "linkPath", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, properties: { "class.mobile": "sidenav['isMobileDevice']()" }, classAttribute: "d-block" }, queries: [{ propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavLinkDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavLinkMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
729
729
  <ng-template #iconSlot>
730
730
  <ng-content select="[dfSidenavIcon]" />
731
731
  </ng-template>
@@ -733,7 +733,7 @@ class DfSidenavLinkComponent {
733
733
  <ng-content />
734
734
  </ng-template>
735
735
 
736
- @if (sidenav['isMobileDevice']) {
736
+ @if (sidenav['isMobileDevice']()) {
737
737
  <df-sidenav-link-mobile
738
738
  [linkPath]="linkPath()"
739
739
  [label]="label()"
@@ -771,7 +771,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
771
771
  <ng-content />
772
772
  </ng-template>
773
773
 
774
- @if (sidenav['isMobileDevice']) {
774
+ @if (sidenav['isMobileDevice']()) {
775
775
  <df-sidenav-link-mobile
776
776
  [linkPath]="linkPath()"
777
777
  [label]="label()"
@@ -799,7 +799,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
799
799
  host: {
800
800
  role: 'listitem',
801
801
  class: 'd-block',
802
- '[class.mobile]': "sidenav['isMobileDevice']"
802
+ '[class.mobile]': "sidenav['isMobileDevice']()"
803
803
  }
804
804
  }]
805
805
  }], propDecorators: { linkPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPath", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], desktopInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavLinkDesktopComponent), { isSignal: true }] }], mobileInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavLinkMobileComponent), { isSignal: true }] }], iconContentQuery: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DfSidenavIconDirective), { isSignal: true }] }] } });
@@ -851,7 +851,7 @@ class DfSidenavItemComponent {
851
851
  this.sidenav = inject(DfSidenavComponent);
852
852
  }
853
853
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DfSidenavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
854
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfSidenavItemComponent, isStandalone: true, selector: "df-sidenav-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { attributes: { "role": "listitem" }, properties: { "class.mobile": "sidenav['isMobileDevice']" }, classAttribute: "d-block" }, queries: [{ propertyName: "childrenItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }, { propertyName: "childrenLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavItemDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavItemMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
854
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfSidenavItemComponent, isStandalone: true, selector: "df-sidenav-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { attributes: { "role": "listitem" }, properties: { "class.mobile": "sidenav['isMobileDevice']()" }, classAttribute: "d-block" }, queries: [{ propertyName: "childrenItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }, { propertyName: "childrenLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavItemDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavItemMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
855
855
  <ng-template #iconSlot>
856
856
  <ng-content select="[dfSidenavIcon]" />
857
857
  </ng-template>
@@ -859,7 +859,7 @@ class DfSidenavItemComponent {
859
859
  <ng-content />
860
860
  </ng-template>
861
861
 
862
- @if (sidenav['isMobileDevice']) {
862
+ @if (sidenav['isMobileDevice']()) {
863
863
  <df-sidenav-item-mobile
864
864
  [label]="label()"
865
865
  [(collapsed)]="collapsed"
@@ -895,7 +895,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
895
895
  <ng-content />
896
896
  </ng-template>
897
897
 
898
- @if (sidenav['isMobileDevice']) {
898
+ @if (sidenav['isMobileDevice']()) {
899
899
  <df-sidenav-item-mobile
900
900
  [label]="label()"
901
901
  [(collapsed)]="collapsed"
@@ -921,7 +921,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
921
921
  host: {
922
922
  role: 'listitem',
923
923
  class: 'd-block',
924
- '[class.mobile]': "sidenav['isMobileDevice']"
924
+ '[class.mobile]': "sidenav['isMobileDevice']()"
925
925
  }
926
926
  }]
927
927
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }, { type: i0.Output, args: ["collapsedChange"] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], childrenItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavItemComponent), { ...{ descendants: true }, isSignal: true }] }], childrenLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavLinkComponent), { ...{ descendants: true }, isSignal: true }] }], desktopInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavItemDesktopComponent), { isSignal: true }] }], mobileInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavItemMobileComponent), { isSignal: true }] }], iconContentQuery: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DfSidenavIconDirective), { isSignal: true }] }] } });
@@ -946,11 +946,6 @@ class DfSidenavComponent {
946
946
  * @default true
947
947
  */
948
948
  this.searchable = input(true, { ...(ngDevMode ? { debugName: "searchable" } : {}), transform: booleanAttribute });
949
- /**
950
- * The container element for the sidenav (null for body)
951
- * @default null
952
- */
953
- this.container = input(null, ...(ngDevMode ? [{ debugName: "container" }] : []));
954
949
  /**
955
950
  * Flag whether the sidenav should be resizable
956
951
  * @default true
@@ -962,13 +957,13 @@ class DfSidenavComponent {
962
957
  */
963
958
  this.collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : {}), transform: booleanAttribute });
964
959
  /**
965
- * Flag to enable mobile device detection for responsive behavior
960
+ * Flag to enable the mobile sidenav display of the items.
966
961
  * @default true
967
962
  */
968
963
  this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : {}), transform: booleanAttribute });
969
964
  this._isMinimized = linkedSignal(() => {
970
965
  // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size
971
- if (this.isMobileDevice) {
966
+ if (this.isMobileDevice()) {
972
967
  return true;
973
968
  }
974
969
  // in desktop, we track the large screen signal in order to reset the minimized state
@@ -982,7 +977,7 @@ class DfSidenavComponent {
982
977
  this.hostRef = inject((ElementRef));
983
978
  this.scrollableContainer = viewChild.required('scrollableContainer');
984
979
  this.isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
985
- this.isMobileDevice = (() => {
980
+ this.isMobileDevice = computed(() => {
986
981
  if (this.isBrowser) {
987
982
  return this.enableMobile() && isMobileUserAgent(navigator.userAgent);
988
983
  }
@@ -1000,7 +995,7 @@ class DfSidenavComponent {
1000
995
  }
1001
996
  return false;
1002
997
  }
1003
- })();
998
+ }, ...(ngDevMode ? [{ debugName: "isMobileDevice" }] : []));
1004
999
  this.searchInput = viewChild('textInput', ...(ngDevMode ? [{ debugName: "searchInput" }] : []));
1005
1000
  // Query all links to find active ones
1006
1001
  this.allLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "allLinks" } : {}), descendants: true });
@@ -1036,7 +1031,7 @@ class DfSidenavComponent {
1036
1031
  useDirectiveForHost(this.navManager.directive, this.navManagerConfig);
1037
1032
  afterRenderEffect(() => {
1038
1033
  if (this.isBrowser) {
1039
- if (this.isMobileDevice && !this._isMinimized()) {
1034
+ if (this.isMobileDevice() && !this._isMinimized()) {
1040
1035
  // Delay to ensure DOM and contentChildren queries are ready
1041
1036
  this.navigateToActiveItem();
1042
1037
  }
@@ -1183,7 +1178,7 @@ class DfSidenavComponent {
1183
1178
  }
1184
1179
  }
1185
1180
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DfSidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1186
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfSidenavComponent, isStandalone: true, selector: "df-sidenav", inputs: { searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, enableMobile: { classPropertyName: "enableMobile", publicName: "enableMobile", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.df-sidenav-lg": "isLargeUpScreen()", "class.df-sidenav-withicon": "contentHasIcons()", "class.d-none": "isSmallScreen() && _isMinimized()", "class.df-sidenav-drawer": "isMediumScreen() && !_isMinimized()" }, classAttribute: "df-sidenav" }, queries: [{ propertyName: "allLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "allItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollableContainer", first: true, predicate: ["scrollableContainer"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["textInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1181
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DfSidenavComponent, isStandalone: true, selector: "df-sidenav", inputs: { searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, enableMobile: { classPropertyName: "enableMobile", publicName: "enableMobile", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.df-sidenav-lg": "isLargeUpScreen()", "class.df-sidenav-withicon": "contentHasIcons()", "class.d-none": "isSmallScreen() && _isMinimized()", "class.df-sidenav-drawer": "isMediumScreen() && !_isMinimized()" }, classAttribute: "df-sidenav" }, queries: [{ propertyName: "allLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "allItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollableContainer", first: true, predicate: ["scrollableContainer"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["textInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1187
1182
  <df-drawer
1188
1183
  #drawer
1189
1184
  className="inline-start {{ isSmallScreen() ? 'df-sidenav-mobile-drawer' : '' }}"
@@ -1196,6 +1191,8 @@ class DfSidenavComponent {
1196
1191
  [(size)]="width"
1197
1192
  [container]="isSmallScreen() ? null : hostRef.nativeElement"
1198
1193
  [resizable]="resizable() && !isSmallScreen()"
1194
+ [focusOnInit]="false"
1195
+ [keepInDom]="true"
1199
1196
  >
1200
1197
  <nav class="d-flex flex-column w-100 h-100 p-5 pb-3">
1201
1198
  <div class="df-sidenav-header flex-shrink-0" [class.df-sidenav-header-minimized]="_isMinimized()">
@@ -1259,7 +1256,7 @@ class DfSidenavComponent {
1259
1256
  }
1260
1257
  </nav>
1261
1258
  </df-drawer>
1262
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DfDrawerComponent, selector: "df-drawer", inputs: ["className", "bodyScroll", "backdrop", "container", "size", "resizable", "visible", "enableMobile"], outputs: ["sizeChange", "visibleChange", "minimizedChange", "maximizedChange", "resizingChange", "minSize", "maxSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1259
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DfDrawerComponent, selector: "df-drawer", inputs: ["className", "bodyScroll", "backdrop", "container", "size", "resizable", "visible", "keepInDom", "focusOnInit"], outputs: ["sizeChange", "visibleChange", "minimizedChange", "maximizedChange", "resizingChange", "minSize", "maxSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1263
1260
  }
1264
1261
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DfSidenavComponent, decorators: [{
1265
1262
  type: Component,
@@ -1279,6 +1276,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
1279
1276
  [(size)]="width"
1280
1277
  [container]="isSmallScreen() ? null : hostRef.nativeElement"
1281
1278
  [resizable]="resizable() && !isSmallScreen()"
1279
+ [focusOnInit]="false"
1280
+ [keepInDom]="true"
1282
1281
  >
1283
1282
  <nav class="d-flex flex-column w-100 h-100 p-5 pb-3">
1284
1283
  <div class="df-sidenav-header flex-shrink-0" [class.df-sidenav-header-minimized]="_isMinimized()">
@@ -1352,7 +1351,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
1352
1351
  '[class.df-sidenav-drawer]': 'isMediumScreen() && !_isMinimized()'
1353
1352
  }
1354
1353
  }]
1355
- }], ctorParameters: () => [], propDecorators: { searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], container: [{ type: i0.Input, args: [{ isSignal: true, alias: "container", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], enableMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableMobile", required: false }] }], scrollableContainer: [{ type: i0.ViewChild, args: ['scrollableContainer', { isSignal: true }] }], searchInput: [{ type: i0.ViewChild, args: ['textInput', { isSignal: true }] }], allLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavLinkComponent), { ...{ descendants: true }, isSignal: true }] }], allItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavItemComponent), { ...{ descendants: true }, isSignal: true }] }] } });
1354
+ }], ctorParameters: () => [], propDecorators: { searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], enableMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableMobile", required: false }] }], scrollableContainer: [{ type: i0.ViewChild, args: ['scrollableContainer', { isSignal: true }] }], searchInput: [{ type: i0.ViewChild, args: ['textInput', { isSignal: true }] }], allLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavLinkComponent), { ...{ descendants: true }, isSignal: true }] }], allItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavItemComponent), { ...{ descendants: true }, isSignal: true }] }] } });
1356
1355
 
1357
1356
  /**
1358
1357
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"design-factory-angular-sidenav.mjs","sources":["../../sidenav/sidenav-item/sidenav-item-base.component.ts","../../sidenav/sidenav-item/sidenav-item-desktop.component.ts","../../sidenav/sidenav-item/sidenav-item-mobile.component.ts","../../sidenav/sidenav-link/sidenav-link-base.component.ts","../../sidenav/sidenav-link/sidenav-link-desktop.component.ts","../../sidenav/sidenav-link/sidenav-link-mobile.component.ts","../../sidenav/sidenav-icon.directive.ts","../../sidenav/sidenav-link/sidenav-link.component.ts","../../sidenav/sidenav-item/sidenav-item.component.ts","../../sidenav/sidenav.ts","../../sidenav/design-factory-angular-sidenav.ts"],"sourcesContent":["import { computed, contentChild, Directive, inject, input, model, Signal } from '@angular/core';\nimport { DfSidenavLinkBaseComponent } from '../sidenav-link/sidenav-link-base.component';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavItemComponent } from './sidenav-item.component';\n\n/**\n * Base item class that is extended by desktop and mobile item components\n * The item represents a container which can hold other items or links\n * Handles collapsed state\n * @internal\n */\n@Directive()\nexport abstract class DfSidenavItemBaseComponent {\n /**\n * The label of the item\n */\n readonly label = input.required();\n /**\n * Collapsed state of the item\n * Only used for the desktop version\n * @default false\n */\n readonly collapsed = model(false);\n /**\n * The icon class name or inline content (e.g., font awesome class)\n * @default ''\n */\n readonly icon = input('');\n /**\n * Whether the wrapper component has icon content (internally used)\n * @default false\n */\n readonly wrapperHasIconContent = input(false);\n\n protected readonly sidenav = inject(DfSidenavComponent);\n protected readonly wrapperInstance = inject(DfSidenavItemComponent);\n\n // check for the parent item to determine nesting level\n protected readonly parentItem = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n protected readonly isFirstLevel = this.parentItem?.['parentWrapper'] === null;\n\n protected readonly iconContent = contentChild('dfSidenavIcon');\n\n protected abstract childLinks: Signal<readonly (DfSidenavLinkBaseComponent | undefined)[]>;\n protected abstract childItems: Signal<readonly (DfSidenavItemBaseComponent | undefined)[]>;\n\n protected readonly hasActiveLinks = computed(() => this.childLinks().some((link) => link?.isActiveLink()));\n protected readonly hasActiveItems = computed(() => this.childItems().some((item) => item?.hasActiveLinks()));\n protected readonly hasActiveChildren = computed(() => this.hasActiveLinks() || this.hasActiveItems());\n\n /**\n * Computed signal indicating if the item has visible children\n */\n protected readonly hasVisibleChildren = computed(() => this.childLinks().some((link) => link?.['isVisible']()));\n\n /**\n * Method to toggle the collapsed state of the item\n * If the sidenav is minimized, it will expand it and uncollapse the item\n */\n toggleCollapse() {\n if (this.sidenav.isMinimized()) {\n this.sidenav.toggleMinimize(false);\n this.collapsed.set(false);\n } else {\n this.collapsed.set(!this.collapsed());\n }\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect } from '@angular/core';\nimport { DfSidenavItemBaseComponent } from './sidenav-item-base.component';\n\n/**\n * Component representing an item in the sidenav for desktop devices\n * The item represents a container which can hold other items or links\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-item-desktop',\n template: `\n <button\n class=\"btn df-sidenav-button d-flex gap-3\"\n [class.df-sidenav-active-level]=\"sidenav.isMinimized() && hasActiveChildren() && isFirstLevel\"\n [class.df-sidenav-active]=\"hasActiveChildren()\"\n [class.w-100]=\"!sidenav.isMinimized()\"\n (click)=\"toggleCollapse()\"\n [attr.aria-expanded]=\"!collapsed()\"\n [class.justify-content-start]=\"!sidenav.isMinimized()\"\n [attr.aria-label]=\"label()\"\n >\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n @if (!sidenav.isMinimized()) {\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n <span\n [class.expanded]=\"!collapsed()\"\n class=\"fa-light df-sidenav-collapse-toggle fa-chevron-down ms-auto\"\n ></span>\n }\n </button>\n\n <div [class.d-none]=\"collapsed()\" role=\"list\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </div>\n <ng-template #content>\n <ng-content />\n </ng-template>\n `,\n host: {\n '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'\n },\n imports: [NgTemplateOutlet]\n})\nexport class DfSidenavItemDesktopComponent extends DfSidenavItemBaseComponent {\n protected override readonly childLinks = computed(() =>\n this.wrapperInstance['childrenLinks']().map((link) => link['desktopInstance']())\n );\n protected override readonly childItems = computed(() =>\n this.wrapperInstance['childrenItems']().map((item) => item['desktopInstance']())\n );\n\n protected readonly isVisible = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return true;\n }\n return this.childLinks().some((link) => link?.['isVisible']());\n });\n\n constructor() {\n super();\n // Automatically collapse when minimized\n effect(() => {\n if (this.sidenav.isMinimized()) {\n this.collapsed.set(true);\n }\n });\n\n // Auto-expand when searching and has visible children\n effect(() => {\n if (this.sidenav['searchTerm']().trim() && this.hasVisibleChildren()) {\n this.collapsed.set(false);\n }\n });\n\n // Auto-expand when the child is active and sidenav is not minimized\n effect(() => {\n if (this.hasActiveChildren() && !this.sidenav.isMinimized()) {\n this.collapsed.set(false);\n }\n });\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { DfSidenavItemBaseComponent } from './sidenav-item-base.component';\n\n/**\n * Component representing an item in the sidenav for mobile devices\n * The item represents a container which can hold other items or links\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-item-mobile',\n template: `\n @if (shouldShowMobileHeader()) {\n <div class=\"df-sidenav-mobile-header mobile mb-2\" role=\"listitem\">\n <button\n class=\"btn w-100 d-flex gap-0 align-items-center justify-content-start df-sidenav-button\"\n (click)=\"handleBackClick()\"\n [class.df-sidenav-active]=\"hasActiveChildren()\"\n >\n <span class=\"fa-light df-sidenav-mobile-header-back-arrow fa-arrow-left me-4\"></span>\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <span class=\"ms-3 sidenav-label\">{{ label() }}</span>\n </button>\n </div>\n }\n\n <!-- Regular item button (hidden when it's the active mobile panel) -->\n @if (isVisibleInList()) {\n <!-- Mobile search: Show as breadcrumb/path (non-clickable) -->\n @if (isSearching()) {\n <div class=\"btn w-100 d-flex gap-3 justify-content-start text-muted disabled pe-none\">\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n <span class=\"fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto\"></span>\n </div>\n } @else {\n <!-- Regular clickable button -->\n <button\n class=\"btn w-100 d-flex gap-3 justify-content-start df-sidenav-button\"\n (click)=\"handleItemClick()\"\n [class.df-sidenav-active]=\"hasActiveChildren()\"\n >\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n <!-- Mobile: Show forward arrow for items with children -->\n <span class=\"fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto\"></span>\n </button>\n }\n }\n\n <!-- Children container - rendered separately from the button -->\n @if (shouldShowChildren()) {\n <div role=\"list\" class=\"mobile\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </div>\n }\n\n <ng-template #content>\n <ng-content />\n </ng-template>\n `,\n host: {\n class: 'mobile',\n '[class.d-none]': 'shouldHideComponent() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'\n },\n imports: [NgTemplateOutlet]\n})\nexport class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {\n protected override readonly childLinks = computed(() =>\n this.wrapperInstance['childrenLinks']().map((link) => link['mobileInstance']())\n );\n protected override readonly childItems = computed(() =>\n this.wrapperInstance['childrenItems']().map((item) => item['mobileInstance']())\n );\n protected readonly isSearching = computed(() => !!this.sidenav['searchTerm']().trim());\n\n // Check if this item is in the navigation path (is an ancestor of current panel)\n private readonly isInNavigationPath = computed(() =>\n this.sidenav['mobileNavigationStack']().includes(this.wrapperInstance)\n );\n\n // Check if this item should show as mobile header\n protected readonly shouldShowMobileHeader = computed(() => {\n // Don't show header when searching\n if (this.isSearching()) {\n return false;\n }\n return this.sidenav['currentMobilePanel']() === this.wrapperInstance;\n });\n\n // Determine if this item's children should be visible\n protected readonly shouldShowChildren = computed(() => {\n // Mobile with search: show children to display matching links\n if (this.isSearching()) {\n return this.hasMatchingChildren();\n }\n // Mobile without search: show if this item is in the navigation path\n return this.isInNavigationPath();\n });\n\n // Determine if this item should be visible in the list\n protected readonly isVisibleInList = computed(() => {\n // Mobile with search: don't show items, only links (items just provide structure)\n if (this.isSearching()) {\n return false;\n }\n\n // Mobile without search: use navigation levels\n const currentPanel = this.sidenav['currentMobilePanel']();\n\n if (currentPanel === null) {\n // Root level: show only first-level items\n return this.isFirstLevel && this.isVisible();\n } else if (currentPanel === this.parentItem) {\n // This is the active panel, don't show it in the list (it's in the header)\n return false;\n } else {\n // Show items whose parent matches the current panel\n const parentMobile = this.parentItem?.['parentWrapper'];\n return parentMobile === currentPanel && this.isVisible();\n }\n });\n\n // Determine if the entire component should be hidden\n protected readonly shouldHideComponent = computed(() => {\n // Don't hide if this is the current mobile panel showing its children\n if (this.shouldShowMobileHeader()) {\n return false;\n }\n // Otherwise, use the regular visibility logic\n return !this.isVisibleInList() && !this.shouldShowChildren();\n });\n\n private readonly isVisible = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return true;\n }\n\n // Check if this item's label matches\n return String(this.label()).toLowerCase().includes(search);\n });\n\n // Check if this item has any matching children (for showing the container)\n private readonly hasMatchingChildren = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return false;\n }\n return this.childLinks().some((link) => link?.['isVisible']());\n });\n\n /**\n * Handle click event on the item\n */\n protected handleItemClick() {\n this.sidenav.navigateToChildren(this.wrapperInstance);\n }\n\n /**\n * Handle click event on the header back button\n */\n protected handleBackClick() {\n this.sidenav.navigateBack();\n }\n}\n","import { computed, contentChild, Directive, inject, input, signal } from '@angular/core';\nimport { IsActiveMatchOptions } from '@angular/router';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavItemComponent } from '../sidenav-item/sidenav-item.component';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DfMedia } from '@design-factory/design-factory';\n\n/**\n * Base link class that is extended by desktop and mobile link components\n * @internal\n */\n@Directive()\nexport abstract class DfSidenavLinkBaseComponent {\n /**\n * The router link path for to the link\n */\n readonly linkPath = input.required<string>();\n /**\n * The label of the link\n */\n readonly label = input.required<string>();\n /**\n * The icon class name or inline content (e.g., font awesome class)\n */\n readonly icon = input('');\n /**\n * Whether the wrapper component has icon content (internally used)\n */\n readonly wrapperHasIconContent = input(false);\n /**\n * Indicates if the link is currently active based on the Router state\n */\n readonly isActiveLink = signal(false);\n /**\n * Options to determine when the router link is considered active\n */\n readonly routerLinkActiveOptions = input<IsActiveMatchOptions | { exact: boolean }>({ exact: false });\n\n protected readonly isSmallScreen = toSignal(inject(DfMedia).getObservable(['sm', 'xs']), { initialValue: false });\n\n protected readonly sidenav = inject(DfSidenavComponent);\n protected readonly parentItem = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n protected readonly isFirstLevel = this.parentItem === null;\n protected readonly iconContent = contentChild('dfSidenavIcon');\n\n /**\n * Computed signal indicating if the link is visible based on search term\n */\n protected readonly isVisible = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return true;\n }\n return this.label().toLowerCase().includes(search);\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, viewChild } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { DfSidenavLinkBaseComponent } from './sidenav-link-base.component';\n\n/**\n * Component representing a leaf in the sidenav for desktop devices\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-link-desktop',\n template: `\n <a\n class=\"btn df-sidenav-button d-flex gap-3\"\n [class.w-100]=\"!sidenav.isMinimized()\"\n routerLinkActive=\"df-sidenav-active-level\"\n ariaCurrentWhenActive=\"page\"\n (isActiveChange)=\"isActiveLink.set($event)\"\n [routerLink]=\"linkPath()\"\n [class.justify-content-start]=\"!sidenav.isMinimized()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n [attr.aria-label]=\"label()\"\n (click)=\"isSmallScreen() && sidenav.toggleMinimize()\"\n #anchor\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n <ng-template #content>\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n @if (!sidenav.isMinimized()) {\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n }\n </ng-template>\n `,\n host: {\n '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',\n class: 'd-flex'\n },\n imports: [RouterModule, NgTemplateOutlet]\n})\nexport class DfSidenavLinkDesktopComponent extends DfSidenavLinkBaseComponent {\n protected readonly anchor = viewChild.required<ElementRef<HTMLAnchorElement>>('anchor');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { DfSidenavLinkBaseComponent } from './sidenav-link-base.component';\nimport { DfSidenavLinkComponent } from './sidenav-link.component';\n\n/**\n * Component representing a leaf in the sidenav for mobile devices\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-link-mobile',\n template: `\n <a\n class=\"btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button\"\n routerLinkActive=\"df-sidenav-active-level\"\n ariaCurrentWhenActive=\"page\"\n (isActiveChange)=\"isActiveLink.set($event)\"\n [routerLink]=\"linkPath()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (click)=\"isSmallScreen() && sidenav.toggleMinimize()\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n <ng-template #content>\n <div class=\"d-flex gap-3 w-100\">\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <div class=\"d-flex flex-column align-items-start\">\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n @if (isSearching() && breadcrumbPath().length > 0) {\n <small class=\"d-flex align-items-center gap-1\" [class.text-muted]=\"!isActiveLink()\">\n @for (item of breadcrumbPath(); track $index) {\n <span>{{ item }}</span>\n @if (!$last) {\n <span class=\"fa-arrow-right\"></span>\n }\n }\n </small>\n }\n </div>\n </div>\n </ng-template>\n `,\n host: {\n '[class.d-none]': '!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',\n class: 'd-flex'\n },\n imports: [RouterModule, NgTemplateOutlet]\n})\nexport class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {\n // Inject link wrapper to get parent wrapper reference\n private readonly linkWrapper = inject(DfSidenavLinkComponent);\n\n private readonly currentMobilePanel = computed(() => this.sidenav['currentMobilePanel']() ?? null);\n protected readonly isSearching = computed(() => !!this.sidenav['searchTerm']().trim());\n\n protected readonly isVisibleInList = computed(() => {\n const currentPanel = this.currentMobilePanel();\n const parentWrapper = this.linkWrapper['parentWrapper'];\n // Mobile with search: show all matching links regardless of level\n if (this.isSearching()) {\n return this.isVisible();\n }\n\n // Mobile without search: use navigation levels\n if (currentPanel === null) {\n // Root level: show only first-level links\n return this.isFirstLevel && this.isVisible();\n } else {\n // Show links whose parent item wrapper matches the current panel\n return parentWrapper === currentPanel && this.isVisible();\n }\n });\n\n // Build breadcrumb path for mobile search view\n protected readonly breadcrumbPath = computed(() => {\n const path: string[] = [];\n let currentItem = this.parentItem;\n // Walk up the parent chain\n while (currentItem?.label()) {\n path.unshift(String(currentItem.label()));\n const grandParent = currentItem?.['parentWrapper'];\n currentItem = grandParent || null;\n }\n return path;\n });\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Utility directive for marking icon content in sidenav items and links.\n * Needed for identification of the projected icon content.\n * Use in case if there is no icon provided with font-awesome.\n * @since 21.0.0\n */\n@Directive({\n selector: '[dfSidenavIcon]'\n})\nexport class DfSidenavIconDirective {}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, inject, input, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavItemComponent } from '../sidenav-item/sidenav-item.component';\nimport { DfSidenavLinkDesktopComponent } from './sidenav-link-desktop.component';\nimport { DfSidenavLinkMobileComponent } from './sidenav-link-mobile.component';\nimport { DfSidenavIconDirective } from '../sidenav-icon.directive';\nimport { IsActiveMatchOptions } from '@angular/router';\n\n/**\n * Sidenav link that can be used inside <df-sidenav-item> or directly inside the <df-sidenav>\n * @since 21.0.0\n */\n@Component({\n selector: 'df-sidenav-link',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template #iconSlot>\n <ng-content select=\"[dfSidenavIcon]\" />\n </ng-template>\n <ng-template #defaultContent>\n <ng-content />\n </ng-template>\n\n @if (sidenav['isMobileDevice']) {\n <df-sidenav-link-mobile\n [linkPath]=\"linkPath()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"defaultContent\" />\n </df-sidenav-link-mobile>\n } @else {\n <df-sidenav-link-desktop\n [linkPath]=\"linkPath()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"defaultContent\" />\n </df-sidenav-link-desktop>\n }\n `,\n imports: [DfSidenavLinkDesktopComponent, DfSidenavLinkMobileComponent, NgTemplateOutlet],\n host: {\n role: 'listitem',\n class: 'd-block',\n '[class.mobile]': \"sidenav['isMobileDevice']\"\n }\n})\nexport class DfSidenavLinkComponent {\n /**\n * The router link path for to the link\n */\n readonly linkPath = input.required<string>();\n /**\n * The label of the link\n */\n readonly label = input.required<string>();\n /**\n * The icon class name or inline content (e.g., font awesome class)\n */\n readonly icon = input('');\n /**\n * Options to determine when the router link is considered active\n */\n readonly routerLinkActiveOptions = input<IsActiveMatchOptions | { exact: boolean }>({ exact: false });\n /**\n * The parent wrapper item component (if any)\n */\n protected readonly parentWrapper = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n /**\n * Reference to the desktop link component instance\n */\n protected readonly desktopInstance = viewChild(DfSidenavLinkDesktopComponent);\n /**\n * Reference to the mobile link component instance\n */\n protected readonly mobileInstance = viewChild(DfSidenavLinkMobileComponent);\n\n private readonly iconContentQuery = contentChild(DfSidenavIconDirective);\n protected readonly wrapperHasIconContent = computed(\n () => this.icon() !== '' || this.iconContentQuery() !== undefined\n );\n protected readonly sidenav = inject(DfSidenavComponent);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n inject,\n input,\n model,\n viewChild\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DfSidenavItemDesktopComponent } from './sidenav-item-desktop.component';\nimport { DfSidenavItemMobileComponent } from './sidenav-item-mobile.component';\nimport { DfSidenavLinkComponent } from '../sidenav-link/sidenav-link.component';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavIconDirective } from '../sidenav-icon.directive';\n\n/**\n * Sidenav element that should be nested inside <df-sidenav> or <df-sidenav-item>\n * @since 21.0.0\n */\n@Component({\n selector: 'df-sidenav-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template #iconSlot>\n <ng-content select=\"[dfSidenavIcon]\" />\n </ng-template>\n <ng-template #content>\n <ng-content />\n </ng-template>\n\n @if (sidenav['isMobileDevice']) {\n <df-sidenav-item-mobile\n [label]=\"label()\"\n [(collapsed)]=\"collapsed\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"content\" />\n </df-sidenav-item-mobile>\n } @else {\n <df-sidenav-item-desktop\n [label]=\"label()\"\n [(collapsed)]=\"collapsed\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"content\" />\n </df-sidenav-item-desktop>\n }\n `,\n imports: [DfSidenavItemDesktopComponent, DfSidenavItemMobileComponent, NgTemplateOutlet],\n host: {\n role: 'listitem',\n class: 'd-block',\n '[class.mobile]': \"sidenav['isMobileDevice']\"\n }\n})\nexport class DfSidenavItemComponent {\n /**\n * Label of the sidenav item\n */\n readonly label = input.required();\n /**\n * Flag whether the sidenav item is collapsed\n * @default false\n */\n readonly collapsed = model(false);\n /**\n * Optional icon class for the sidenav item\n */\n readonly icon = input('');\n /**\n * Reference to the parent element containing this item\n */\n protected readonly parentWrapper = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n /**\n * Child sidenav items nested inside this item\n */\n protected readonly childrenItems = contentChildren(DfSidenavItemComponent, { descendants: true });\n /**\n * Child sidenav links nested inside this item\n */\n protected readonly childrenLinks = contentChildren(DfSidenavLinkComponent, { descendants: true });\n /**\n * Reference to the desktop instance of the sidenav item\n */\n protected readonly desktopInstance = viewChild(DfSidenavItemDesktopComponent);\n /**\n * Reference to the mobile instance of the sidenav item\n */\n protected readonly mobileInstance = viewChild(DfSidenavItemMobileComponent);\n private readonly iconContentQuery = contentChild(DfSidenavIconDirective);\n protected readonly wrapperHasIconContent = computed(\n () => this.icon() !== '' || this.iconContentQuery() !== undefined\n );\n protected readonly sidenav = inject(DfSidenavComponent);\n}\n","import { createNavManager, NavManagerItemConfig, useDirectiveForHost } from '@agnos-ui/angular-headless';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AfterContentInit,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n PLATFORM_ID,\n Signal,\n signal,\n viewChild\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { DfDrawerComponent } from '@design-factory/angular/drawer';\nimport { DfMedia } from '@design-factory/design-factory';\nimport { DfSidenavItemComponent } from './sidenav-item/sidenav-item.component';\nimport { DfSidenavLinkComponent } from './sidenav-link/sidenav-link.component';\n\n/**\n * Utility method to check if the user agent is a mobile device\n *\n * @param userAgent - The user agent string to check\n * @returns `true` if the user agent corresponds to a mobile device, `false` otherwise\n */\nfunction isMobileUserAgent(userAgent: string): boolean {\n return /mobile|android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);\n}\n\n/**\n * SideNav is a component to provide navigation feature with a panel on the side of your page\n * @since 21.0.0\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav',\n template: `\n <df-drawer\n #drawer\n className=\"inline-start {{ isSmallScreen() ? 'df-sidenav-mobile-drawer' : '' }}\"\n [visible]=\"!_isMinimized()\"\n (visibleChange)=\"visibleChangeHandler($event)\"\n (minimizedChange)=\"_isMinimized.set($event)\"\n (resizingChange)=\"resizingChangeHandler($event)\"\n [bodyScroll]=\"true\"\n [backdrop]=\"backdrop()\"\n [(size)]=\"width\"\n [container]=\"isSmallScreen() ? null : hostRef.nativeElement\"\n [resizable]=\"resizable() && !isSmallScreen()\"\n >\n <nav class=\"d-flex flex-column w-100 h-100 p-5 pb-3\">\n <div class=\"df-sidenav-header flex-shrink-0\" [class.df-sidenav-header-minimized]=\"_isMinimized()\">\n @if (searchable()) {\n @if (_isMinimized()) {\n <button\n class=\"btn btn-outline-neutral df-btn-icononly mb-3 w-100 fa-search\"\n [class.df-sidenav-search-minimized]=\"!contentHasIcons()\"\n type=\"button\"\n (click)=\"focusSearch()\"\n i18n-aria-label=\"@@df.sidenav.search.ariaLabel\"\n aria-label=\"Search\"\n ></button>\n } @else {\n <div class=\"input-group mb-3\">\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text fa-light fa-search\"></span>\n </div>\n <input\n type=\"search\"\n class=\"form-control df-input-withicon\"\n i18n-placeholder=\"@@df.sidenav.search.placeholder\"\n placeholder=\"Search\"\n i18n-aria-label=\"@@df.sidenav.search.ariaLabel\"\n aria-label=\"Search\"\n [(ngModel)]=\"searchTerm\"\n #textInput\n />\n <div class=\"input-group-append\">\n <button\n class=\"input-group-text fa-light fa-times\"\n [class.df-sidenav-search-empty]=\"searchTerm() === ''\"\n (click)=\"searchTerm.set(''); textInput.focus()\"\n >\n <span class=\"visually-hidden\" i18n=\"@@df.sidenav.search.clearText\">Clear text</span>\n </button>\n </div>\n </div>\n }\n }\n </div>\n\n <div role=\"list\" class=\"sidenav-body flex-grow-1 overflow-y-auto\" #scrollableContainer>\n <ng-content />\n </div>\n @if (collapsible() && !isSmallScreen()) {\n <div class=\"d-flex sidenav-footer flex-shrink-0 py-3\">\n <button\n class=\"btn btn-outline-primary df-btn-icononly df-sidenav-toggle-minimized\"\n (click)=\"toggleMinimize()\"\n i18n-aria-label=\"@@df.sidenav.toggleMinimize.ariaLabel\"\n aria-label=\"Toggle minimized sidenav\"\n >\n @if (isMinimized()) {\n <span class=\"fa-arrow-right-to-line\"></span>\n } @else {\n <span class=\"fa-arrow-left-to-line\"></span>\n }\n </button>\n </div>\n }\n </nav>\n </df-drawer>\n `,\n imports: [FormsModule, DfDrawerComponent],\n host: {\n class: 'df-sidenav',\n '[class.df-sidenav-lg]': 'isLargeUpScreen()',\n '[class.df-sidenav-withicon]': 'contentHasIcons()',\n '[class.d-none]': 'isSmallScreen() && _isMinimized()',\n '[class.df-sidenav-drawer]': 'isMediumScreen() && !_isMinimized()'\n }\n})\nexport class DfSidenavComponent implements AfterContentInit {\n /**\n * Flag whether the sidenav includes a search input\n * @default true\n */\n readonly searchable = input(true, { transform: booleanAttribute });\n /**\n * The container element for the sidenav (null for body)\n * @default null\n */\n readonly container = input<HTMLElement | null>(null);\n /**\n * Flag whether the sidenav should be resizable\n * @default true\n */\n readonly resizable = input(true, { transform: booleanAttribute });\n /**\n * Flag whether the sidenav should have the collapse button\n * @default true\n */\n readonly collapsible = input(true, { transform: booleanAttribute });\n /**\n * Flag to enable mobile device detection for responsive behavior\n * @default true\n */\n readonly enableMobile = input(true, { transform: booleanAttribute });\n\n protected readonly _isMinimized = linkedSignal(() => {\n // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size\n if (this.isMobileDevice) {\n return true;\n }\n // in desktop, we track the large screen signal in order to reset the minimized state\n // it allows resizing the window and have a more user-friendly behavior\n return !this.isLargeUpScreen();\n });\n\n /**\n * Flag to indicate if the sidenav is minimized\n */\n readonly isMinimized = computed(() => this._isMinimized());\n\n protected readonly hostRef = inject(ElementRef<HTMLElement>);\n\n private readonly scrollableContainer = viewChild.required<ElementRef<HTMLElement>>('scrollableContainer');\n\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n protected readonly isMobileDevice = (() => {\n if (this.isBrowser) {\n return this.enableMobile() && isMobileUserAgent(navigator.userAgent);\n } else {\n // SSR: try to get request if available\n try {\n const request = inject(Request, { optional: true });\n if (request && 'headers' in request) {\n const userAgent = request.headers.get('user-agent') || '';\n return this.enableMobile() && isMobileUserAgent(userAgent);\n }\n } catch {\n // Request token not available or not in SSR context\n }\n return false;\n }\n })();\n\n protected readonly searchInput = viewChild<ElementRef>('textInput');\n // Query all links to find active ones\n private readonly allLinks = contentChildren(DfSidenavLinkComponent, { descendants: true });\n private readonly allItems = contentChildren(DfSidenavItemComponent, { descendants: true });\n\n protected readonly width = signal(null as number | null);\n private savedWidth: number | null = null;\n\n protected readonly searchTerm = signal('');\n\n // Mobile navigation stack - tracks which item's children are currently displayed\n // Using component references instead of labels for uniqueness\n protected readonly mobileNavigationStack = signal<(DfSidenavItemComponent | null | undefined)[]>([]);\n protected readonly currentMobilePanel: Signal<DfSidenavItemComponent | null | undefined> = computed(() => {\n const stack = this.mobileNavigationStack();\n return stack.length > 0 ? stack[stack.length - 1] : null;\n });\n\n protected readonly isSmallScreen = toSignal(inject(DfMedia).getObservable(['sm', 'xs']), { initialValue: false });\n protected readonly isMediumScreen = toSignal(inject(DfMedia).getObservable(['md']), { initialValue: false });\n protected readonly isLargeUpScreen = toSignal(inject(DfMedia).getObservable(['lg', 'xl', 'xxl', 'xxxl']), {\n initialValue: false\n });\n protected readonly isMobileOrSmallScreen = computed(() => this.isSmallScreen() || this.isMediumScreen());\n\n protected readonly backdrop = computed(() => this.isMediumScreen());\n\n protected readonly navManager = createNavManager();\n\n protected readonly navManagerConfig: NavManagerItemConfig = {\n selector: (node) => node.querySelectorAll<HTMLElement>('input, button, a'),\n keys: {\n Home: this.navManager.focusFirst,\n End: this.navManager.focusLast\n }\n };\n\n private readonly injector = inject(Injector);\n\n constructor() {\n useDirectiveForHost(this.navManager.directive, this.navManagerConfig);\n afterRenderEffect(() => {\n if (this.isBrowser) {\n if (this.isMobileDevice && !this._isMinimized()) {\n // Delay to ensure DOM and contentChildren queries are ready\n this.navigateToActiveItem();\n }\n\n // Keep track of the screen size changes to reset width\n if (this.isMediumScreen() || this.isSmallScreen() || this.isLargeUpScreen()) {\n this.width.set(null);\n }\n }\n });\n }\n\n ngAfterContentInit() {\n if (!this.isMobileDevice && this.isBrowser && this.isLargeUpScreen()) {\n void this.initializeDesktopNavigation();\n }\n }\n\n /**\n * This method allows to center and show the active link, when the sidenav is used in desktop and a large screen.\n * It collapses all items and expands only the parents of the active link.\n * Also, it scrolls to the active link to make it visible.\n */\n private async initializeDesktopNavigation() {\n // RouterLinkActive queues two microtasks, so we wait for them to complete\n await Promise.resolve();\n await Promise.resolve();\n // Find the first active link\n const activeLink = this.allLinks()\n .find((link) => link['desktopInstance']()?.isActiveLink())\n ?.['desktopInstance']?.();\n if (activeLink) {\n this.allItems().forEach((item) => {\n item.collapsed.set(true);\n });\n let currentParent = activeLink['parentItem'];\n while (currentParent) {\n currentParent.collapsed.set(false);\n currentParent = currentParent['parentWrapper'];\n }\n\n // We need a render to make sure the getBoundingClientRect calls will be correct AFTER the collapse of the items.\n afterNextRender(\n {\n read: () => {\n const anchorElement = activeLink['anchor']().nativeElement;\n const containerElement = this.scrollableContainer().nativeElement;\n const heightPx =\n anchorElement.getBoundingClientRect().top +\n anchorElement.clientHeight / 2 -\n containerElement.getBoundingClientRect().top -\n containerElement.clientHeight / 3;\n containerElement.scrollTo({ top: heightPx, behavior: 'instant' });\n }\n },\n { injector: this.injector }\n );\n }\n }\n\n /**\n * Toggles the minimized state of the sidenav\n *\n * @param minimized - Optional parameter to explicitly set the minimized state\n *\n */\n toggleMinimize(minimized = !this._isMinimized()) {\n if (minimized) {\n this.savedWidth = this.width();\n this.width.set(0);\n } else {\n this.width.set(this.savedWidth);\n }\n this._isMinimized.set(minimized);\n }\n\n /**\n * Handles visibility changes of the sidenav component to handle the component state accordingly.\n *\n * @param isVisible - Boolean indicating whether the sidenav is currently visible\n */\n visibleChangeHandler(isVisible: boolean) {\n if (!isVisible) {\n this.width.set(0);\n }\n this._isMinimized.set(!isVisible);\n }\n\n /**\n * Handles changes when the sidenav is resized, to handle the state accordingly.\n *\n * @param isResizing - Whether the sidenav is currently being resized\n */\n resizingChangeHandler(isResizing: boolean) {\n if (isResizing) {\n this._isMinimized.set(false);\n } else {\n if (this._isMinimized()) {\n this.width.set(0);\n } else {\n this.savedWidth = this.width();\n }\n }\n }\n\n // utility to transfer focus from the button when minimized to the search input when uncollapsed\n protected focusSearch() {\n this.toggleMinimize(false);\n setTimeout(() => {\n this.searchInput()?.nativeElement.focus();\n });\n }\n\n /**\n * Method to add the given item to the mobile navigation stack\n * @param itemRef item to be added to the navigation stack\n */\n navigateToChildren(itemRef: DfSidenavItemComponent | null | undefined) {\n const stack = this.mobileNavigationStack();\n this.mobileNavigationStack.set([...stack, itemRef]);\n }\n\n /**\n * Method to navigate back in the mobile navigation stack\n */\n navigateBack() {\n const stack = this.mobileNavigationStack();\n if (stack.length > 0) {\n this.mobileNavigationStack.set(stack.slice(0, -1));\n }\n }\n\n /**\n * Navigates to the active item in the sidenav\n * Expands parent items (desktop) and sets up mobile navigation stack\n */\n private navigateToActiveItem() {\n if (!this.isBrowser) {\n return;\n }\n\n // Find the first active link\n const activeLink = this.allLinks()\n .find((link) => link['mobileInstance']()?.isActiveLink())\n ?.['mobileInstance']();\n if (activeLink && activeLink['parentItem']) {\n // Build the path from root to the active link's parent (inclusive)\n const navigationPath: DfSidenavItemComponent[] = [];\n let current: DfSidenavItemComponent | null = activeLink['parentItem'];\n while (current) {\n navigationPath.unshift(current); // Add to beginning to build path from root\n current = current['parentWrapper'];\n }\n this.mobileNavigationStack.set(navigationPath);\n } else if (activeLink && !activeLink['parentItem']) {\n // Clear navigation stack to show root level\n this.mobileNavigationStack.set([]);\n }\n }\n\n protected readonly contentHasIcons = computed(\n () =>\n this.allItems().some((item) => item['wrapperHasIconContent']()) ||\n this.allLinks().some((link) => link['wrapperHasIconContent']())\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"design-factory-angular-sidenav.mjs","sources":["../../sidenav/sidenav-item/sidenav-item-base.component.ts","../../sidenav/sidenav-item/sidenav-item-desktop.component.ts","../../sidenav/sidenav-item/sidenav-item-mobile.component.ts","../../sidenav/sidenav-link/sidenav-link-base.component.ts","../../sidenav/sidenav-link/sidenav-link-desktop.component.ts","../../sidenav/sidenav-link/sidenav-link-mobile.component.ts","../../sidenav/sidenav-icon.directive.ts","../../sidenav/sidenav-link/sidenav-link.component.ts","../../sidenav/sidenav-item/sidenav-item.component.ts","../../sidenav/sidenav.ts","../../sidenav/design-factory-angular-sidenav.ts"],"sourcesContent":["import { computed, contentChild, Directive, inject, input, model, Signal } from '@angular/core';\nimport { DfSidenavLinkBaseComponent } from '../sidenav-link/sidenav-link-base.component';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavItemComponent } from './sidenav-item.component';\n\n/**\n * Base item class that is extended by desktop and mobile item components\n * The item represents a container which can hold other items or links\n * Handles collapsed state\n * @internal\n */\n@Directive()\nexport abstract class DfSidenavItemBaseComponent {\n /**\n * The label of the item\n */\n readonly label = input.required();\n /**\n * Collapsed state of the item\n * Only used for the desktop version\n * @default false\n */\n readonly collapsed = model(false);\n /**\n * The icon class name or inline content (e.g., font awesome class)\n * @default ''\n */\n readonly icon = input('');\n /**\n * Whether the wrapper component has icon content (internally used)\n * @default false\n */\n readonly wrapperHasIconContent = input(false);\n\n protected readonly sidenav = inject(DfSidenavComponent);\n protected readonly wrapperInstance = inject(DfSidenavItemComponent);\n\n // check for the parent item to determine nesting level\n protected readonly parentItem = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n protected readonly isFirstLevel = this.parentItem?.['parentWrapper'] === null;\n\n protected readonly iconContent = contentChild('dfSidenavIcon');\n\n protected abstract childLinks: Signal<readonly (DfSidenavLinkBaseComponent | undefined)[]>;\n protected abstract childItems: Signal<readonly (DfSidenavItemBaseComponent | undefined)[]>;\n\n protected readonly hasActiveLinks = computed(() => this.childLinks().some((link) => link?.isActiveLink()));\n protected readonly hasActiveItems = computed(() => this.childItems().some((item) => item?.hasActiveLinks()));\n protected readonly hasActiveChildren = computed(() => this.hasActiveLinks() || this.hasActiveItems());\n\n /**\n * Computed signal indicating if the item has visible children\n */\n protected readonly hasVisibleChildren = computed(() => this.childLinks().some((link) => link?.['isVisible']()));\n\n /**\n * Method to toggle the collapsed state of the item\n * If the sidenav is minimized, it will expand it and uncollapse the item\n */\n toggleCollapse() {\n if (this.sidenav.isMinimized()) {\n this.sidenav.toggleMinimize(false);\n this.collapsed.set(false);\n } else {\n this.collapsed.set(!this.collapsed());\n }\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect } from '@angular/core';\nimport { DfSidenavItemBaseComponent } from './sidenav-item-base.component';\n\n/**\n * Component representing an item in the sidenav for desktop devices\n * The item represents a container which can hold other items or links\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-item-desktop',\n template: `\n <button\n class=\"btn df-sidenav-button d-flex gap-3\"\n [class.df-sidenav-active-level]=\"sidenav.isMinimized() && hasActiveChildren() && isFirstLevel\"\n [class.df-sidenav-active]=\"hasActiveChildren()\"\n [class.w-100]=\"!sidenav.isMinimized()\"\n (click)=\"toggleCollapse()\"\n [attr.aria-expanded]=\"!collapsed()\"\n [class.justify-content-start]=\"!sidenav.isMinimized()\"\n [attr.aria-label]=\"label()\"\n >\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n @if (!sidenav.isMinimized()) {\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n <span\n [class.expanded]=\"!collapsed()\"\n class=\"fa-light df-sidenav-collapse-toggle fa-chevron-down ms-auto\"\n ></span>\n }\n </button>\n\n <div [class.d-none]=\"collapsed()\" role=\"list\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </div>\n <ng-template #content>\n <ng-content />\n </ng-template>\n `,\n host: {\n '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'\n },\n imports: [NgTemplateOutlet]\n})\nexport class DfSidenavItemDesktopComponent extends DfSidenavItemBaseComponent {\n protected override readonly childLinks = computed(() =>\n this.wrapperInstance['childrenLinks']().map((link) => link['desktopInstance']())\n );\n protected override readonly childItems = computed(() =>\n this.wrapperInstance['childrenItems']().map((item) => item['desktopInstance']())\n );\n\n protected readonly isVisible = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return true;\n }\n return this.childLinks().some((link) => link?.['isVisible']());\n });\n\n constructor() {\n super();\n // Automatically collapse when minimized\n effect(() => {\n if (this.sidenav.isMinimized()) {\n this.collapsed.set(true);\n }\n });\n\n // Auto-expand when searching and has visible children\n effect(() => {\n if (this.sidenav['searchTerm']().trim() && this.hasVisibleChildren()) {\n this.collapsed.set(false);\n }\n });\n\n // Auto-expand when the child is active and sidenav is not minimized\n effect(() => {\n if (this.hasActiveChildren() && !this.sidenav.isMinimized()) {\n this.collapsed.set(false);\n }\n });\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { DfSidenavItemBaseComponent } from './sidenav-item-base.component';\n\n/**\n * Component representing an item in the sidenav for mobile devices\n * The item represents a container which can hold other items or links\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-item-mobile',\n template: `\n @if (shouldShowMobileHeader()) {\n <div class=\"df-sidenav-mobile-header mobile mb-2\" role=\"listitem\">\n <button\n class=\"btn w-100 d-flex gap-0 align-items-center justify-content-start df-sidenav-button\"\n (click)=\"handleBackClick()\"\n [class.df-sidenav-active]=\"hasActiveChildren()\"\n >\n <span class=\"fa-light df-sidenav-mobile-header-back-arrow fa-arrow-left me-4\"></span>\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <span class=\"ms-3 sidenav-label\">{{ label() }}</span>\n </button>\n </div>\n }\n\n <!-- Regular item button (hidden when it's the active mobile panel) -->\n @if (isVisibleInList()) {\n <!-- Mobile search: Show as breadcrumb/path (non-clickable) -->\n @if (isSearching()) {\n <div class=\"btn w-100 d-flex gap-3 justify-content-start text-muted disabled pe-none\">\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n <span class=\"fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto\"></span>\n </div>\n } @else {\n <!-- Regular clickable button -->\n <button\n class=\"btn w-100 d-flex gap-3 justify-content-start df-sidenav-button\"\n (click)=\"handleItemClick()\"\n [class.df-sidenav-active]=\"hasActiveChildren()\"\n >\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n <!-- Mobile: Show forward arrow for items with children -->\n <span class=\"fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto\"></span>\n </button>\n }\n }\n\n <!-- Children container - rendered separately from the button -->\n @if (shouldShowChildren()) {\n <div role=\"list\" class=\"mobile\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </div>\n }\n\n <ng-template #content>\n <ng-content />\n </ng-template>\n `,\n host: {\n class: 'mobile',\n '[class.d-none]': 'shouldHideComponent() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'\n },\n imports: [NgTemplateOutlet]\n})\nexport class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {\n protected override readonly childLinks = computed(() =>\n this.wrapperInstance['childrenLinks']().map((link) => link['mobileInstance']())\n );\n protected override readonly childItems = computed(() =>\n this.wrapperInstance['childrenItems']().map((item) => item['mobileInstance']())\n );\n protected readonly isSearching = computed(() => !!this.sidenav['searchTerm']().trim());\n\n // Check if this item is in the navigation path (is an ancestor of current panel)\n private readonly isInNavigationPath = computed(() =>\n this.sidenav['mobileNavigationStack']().includes(this.wrapperInstance)\n );\n\n // Check if this item should show as mobile header\n protected readonly shouldShowMobileHeader = computed(() => {\n // Don't show header when searching\n if (this.isSearching()) {\n return false;\n }\n return this.sidenav['currentMobilePanel']() === this.wrapperInstance;\n });\n\n // Determine if this item's children should be visible\n protected readonly shouldShowChildren = computed(() => {\n // Mobile with search: show children to display matching links\n if (this.isSearching()) {\n return this.hasMatchingChildren();\n }\n // Mobile without search: show if this item is in the navigation path\n return this.isInNavigationPath();\n });\n\n // Determine if this item should be visible in the list\n protected readonly isVisibleInList = computed(() => {\n // Mobile with search: don't show items, only links (items just provide structure)\n if (this.isSearching()) {\n return false;\n }\n\n // Mobile without search: use navigation levels\n const currentPanel = this.sidenav['currentMobilePanel']();\n\n if (currentPanel === null) {\n // Root level: show only first-level items\n return this.isFirstLevel && this.isVisible();\n } else if (currentPanel === this.parentItem) {\n // This is the active panel, don't show it in the list (it's in the header)\n return false;\n } else {\n // Show items whose parent matches the current panel\n const parentMobile = this.parentItem?.['parentWrapper'];\n return parentMobile === currentPanel && this.isVisible();\n }\n });\n\n // Determine if the entire component should be hidden\n protected readonly shouldHideComponent = computed(() => {\n // Don't hide if this is the current mobile panel showing its children\n if (this.shouldShowMobileHeader()) {\n return false;\n }\n // Otherwise, use the regular visibility logic\n return !this.isVisibleInList() && !this.shouldShowChildren();\n });\n\n private readonly isVisible = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return true;\n }\n\n // Check if this item's label matches\n return String(this.label()).toLowerCase().includes(search);\n });\n\n // Check if this item has any matching children (for showing the container)\n private readonly hasMatchingChildren = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return false;\n }\n return this.childLinks().some((link) => link?.['isVisible']());\n });\n\n /**\n * Handle click event on the item\n */\n protected handleItemClick() {\n this.sidenav.navigateToChildren(this.wrapperInstance);\n }\n\n /**\n * Handle click event on the header back button\n */\n protected handleBackClick() {\n this.sidenav.navigateBack();\n }\n}\n","import { computed, contentChild, Directive, inject, input, signal } from '@angular/core';\nimport { IsActiveMatchOptions } from '@angular/router';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavItemComponent } from '../sidenav-item/sidenav-item.component';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DfMedia } from '@design-factory/design-factory';\n\n/**\n * Base link class that is extended by desktop and mobile link components\n * @internal\n */\n@Directive()\nexport abstract class DfSidenavLinkBaseComponent {\n /**\n * The router link path for to the link\n */\n readonly linkPath = input.required<string>();\n /**\n * The label of the link\n */\n readonly label = input.required<string>();\n /**\n * The icon class name or inline content (e.g., font awesome class)\n */\n readonly icon = input('');\n /**\n * Whether the wrapper component has icon content (internally used)\n */\n readonly wrapperHasIconContent = input(false);\n /**\n * Indicates if the link is currently active based on the Router state\n */\n readonly isActiveLink = signal(false);\n /**\n * Options to determine when the router link is considered active\n */\n readonly routerLinkActiveOptions = input<IsActiveMatchOptions | { exact: boolean }>({ exact: false });\n\n protected readonly isSmallScreen = toSignal(inject(DfMedia).getObservable(['sm', 'xs']), { initialValue: false });\n\n protected readonly sidenav = inject(DfSidenavComponent);\n protected readonly parentItem = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n protected readonly isFirstLevel = this.parentItem === null;\n protected readonly iconContent = contentChild('dfSidenavIcon');\n\n /**\n * Computed signal indicating if the link is visible based on search term\n */\n protected readonly isVisible = computed(() => {\n const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';\n if (!search) {\n return true;\n }\n return this.label().toLowerCase().includes(search);\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, viewChild } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { DfSidenavLinkBaseComponent } from './sidenav-link-base.component';\n\n/**\n * Component representing a leaf in the sidenav for desktop devices\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-link-desktop',\n template: `\n <a\n class=\"btn df-sidenav-button d-flex gap-3\"\n [class.w-100]=\"!sidenav.isMinimized()\"\n routerLinkActive=\"df-sidenav-active-level\"\n ariaCurrentWhenActive=\"page\"\n (isActiveChange)=\"isActiveLink.set($event)\"\n [routerLink]=\"linkPath()\"\n [class.justify-content-start]=\"!sidenav.isMinimized()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n [attr.aria-label]=\"label()\"\n (click)=\"isSmallScreen() && sidenav.toggleMinimize()\"\n #anchor\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n <ng-template #content>\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n @if (!sidenav.isMinimized()) {\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n }\n </ng-template>\n `,\n host: {\n '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',\n class: 'd-flex'\n },\n imports: [RouterModule, NgTemplateOutlet]\n})\nexport class DfSidenavLinkDesktopComponent extends DfSidenavLinkBaseComponent {\n protected readonly anchor = viewChild.required<ElementRef<HTMLAnchorElement>>('anchor');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { DfSidenavLinkBaseComponent } from './sidenav-link-base.component';\nimport { DfSidenavLinkComponent } from './sidenav-link.component';\n\n/**\n * Component representing a leaf in the sidenav for mobile devices\n * @internal\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav-link-mobile',\n template: `\n <a\n class=\"btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button\"\n routerLinkActive=\"df-sidenav-active-level\"\n ariaCurrentWhenActive=\"page\"\n (isActiveChange)=\"isActiveLink.set($event)\"\n [routerLink]=\"linkPath()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (click)=\"isSmallScreen() && sidenav.toggleMinimize()\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n <ng-template #content>\n <div class=\"d-flex gap-3 w-100\">\n <ng-content select=\"[dfSidenavIcon]\" />\n @if (icon()) {\n <span class=\"{{ icon() }}\"></span>\n }\n <div class=\"d-flex flex-column align-items-start\">\n <span class=\"sidenav-label\" [title]=\"label()\">{{ label() }}</span>\n @if (isSearching() && breadcrumbPath().length > 0) {\n <small class=\"d-flex align-items-center gap-1\" [class.text-muted]=\"!isActiveLink()\">\n @for (item of breadcrumbPath(); track $index) {\n <span>{{ item }}</span>\n @if (!$last) {\n <span class=\"fa-arrow-right\"></span>\n }\n }\n </small>\n }\n </div>\n </div>\n </ng-template>\n `,\n host: {\n '[class.d-none]': '!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',\n class: 'd-flex'\n },\n imports: [RouterModule, NgTemplateOutlet]\n})\nexport class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {\n // Inject link wrapper to get parent wrapper reference\n private readonly linkWrapper = inject(DfSidenavLinkComponent);\n\n private readonly currentMobilePanel = computed(() => this.sidenav['currentMobilePanel']() ?? null);\n protected readonly isSearching = computed(() => !!this.sidenav['searchTerm']().trim());\n\n protected readonly isVisibleInList = computed(() => {\n const currentPanel = this.currentMobilePanel();\n const parentWrapper = this.linkWrapper['parentWrapper'];\n // Mobile with search: show all matching links regardless of level\n if (this.isSearching()) {\n return this.isVisible();\n }\n\n // Mobile without search: use navigation levels\n if (currentPanel === null) {\n // Root level: show only first-level links\n return this.isFirstLevel && this.isVisible();\n } else {\n // Show links whose parent item wrapper matches the current panel\n return parentWrapper === currentPanel && this.isVisible();\n }\n });\n\n // Build breadcrumb path for mobile search view\n protected readonly breadcrumbPath = computed(() => {\n const path: string[] = [];\n let currentItem = this.parentItem;\n // Walk up the parent chain\n while (currentItem?.label()) {\n path.unshift(String(currentItem.label()));\n const grandParent = currentItem?.['parentWrapper'];\n currentItem = grandParent || null;\n }\n return path;\n });\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Utility directive for marking icon content in sidenav items and links.\n * Needed for identification of the projected icon content.\n * Use in case if there is no icon provided with font-awesome.\n * @since 21.0.0\n */\n@Directive({\n selector: '[dfSidenavIcon]'\n})\nexport class DfSidenavIconDirective {}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, inject, input, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavItemComponent } from '../sidenav-item/sidenav-item.component';\nimport { DfSidenavLinkDesktopComponent } from './sidenav-link-desktop.component';\nimport { DfSidenavLinkMobileComponent } from './sidenav-link-mobile.component';\nimport { DfSidenavIconDirective } from '../sidenav-icon.directive';\nimport { IsActiveMatchOptions } from '@angular/router';\n\n/**\n * Sidenav link that can be used inside <df-sidenav-item> or directly inside the <df-sidenav>\n * @since 21.0.0\n */\n@Component({\n selector: 'df-sidenav-link',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template #iconSlot>\n <ng-content select=\"[dfSidenavIcon]\" />\n </ng-template>\n <ng-template #defaultContent>\n <ng-content />\n </ng-template>\n\n @if (sidenav['isMobileDevice']()) {\n <df-sidenav-link-mobile\n [linkPath]=\"linkPath()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"defaultContent\" />\n </df-sidenav-link-mobile>\n } @else {\n <df-sidenav-link-desktop\n [linkPath]=\"linkPath()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"defaultContent\" />\n </df-sidenav-link-desktop>\n }\n `,\n imports: [DfSidenavLinkDesktopComponent, DfSidenavLinkMobileComponent, NgTemplateOutlet],\n host: {\n role: 'listitem',\n class: 'd-block',\n '[class.mobile]': \"sidenav['isMobileDevice']()\"\n }\n})\nexport class DfSidenavLinkComponent {\n /**\n * The router link path for to the link\n */\n readonly linkPath = input.required<string>();\n /**\n * The label of the link\n */\n readonly label = input.required<string>();\n /**\n * The icon class name or inline content (e.g., font awesome class)\n */\n readonly icon = input('');\n /**\n * Options to determine when the router link is considered active\n */\n readonly routerLinkActiveOptions = input<IsActiveMatchOptions | { exact: boolean }>({ exact: false });\n /**\n * The parent wrapper item component (if any)\n */\n protected readonly parentWrapper = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n /**\n * Reference to the desktop link component instance\n */\n protected readonly desktopInstance = viewChild(DfSidenavLinkDesktopComponent);\n /**\n * Reference to the mobile link component instance\n */\n protected readonly mobileInstance = viewChild(DfSidenavLinkMobileComponent);\n\n private readonly iconContentQuery = contentChild(DfSidenavIconDirective);\n protected readonly wrapperHasIconContent = computed(\n () => this.icon() !== '' || this.iconContentQuery() !== undefined\n );\n protected readonly sidenav = inject(DfSidenavComponent);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n inject,\n input,\n model,\n viewChild\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DfSidenavItemDesktopComponent } from './sidenav-item-desktop.component';\nimport { DfSidenavItemMobileComponent } from './sidenav-item-mobile.component';\nimport { DfSidenavLinkComponent } from '../sidenav-link/sidenav-link.component';\nimport { DfSidenavComponent } from '../sidenav';\nimport { DfSidenavIconDirective } from '../sidenav-icon.directive';\n\n/**\n * Sidenav element that should be nested inside <df-sidenav> or <df-sidenav-item>\n * @since 21.0.0\n */\n@Component({\n selector: 'df-sidenav-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template #iconSlot>\n <ng-content select=\"[dfSidenavIcon]\" />\n </ng-template>\n <ng-template #content>\n <ng-content />\n </ng-template>\n\n @if (sidenav['isMobileDevice']()) {\n <df-sidenav-item-mobile\n [label]=\"label()\"\n [(collapsed)]=\"collapsed\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"content\" />\n </df-sidenav-item-mobile>\n } @else {\n <df-sidenav-item-desktop\n [label]=\"label()\"\n [(collapsed)]=\"collapsed\"\n [icon]=\"icon()\"\n [wrapperHasIconContent]=\"wrapperHasIconContent()\"\n >\n <ng-container [ngTemplateOutlet]=\"iconSlot\" ngProjectAs=\"[dfSidenavIcon]\" />\n <ng-container [ngTemplateOutlet]=\"content\" />\n </df-sidenav-item-desktop>\n }\n `,\n imports: [DfSidenavItemDesktopComponent, DfSidenavItemMobileComponent, NgTemplateOutlet],\n host: {\n role: 'listitem',\n class: 'd-block',\n '[class.mobile]': \"sidenav['isMobileDevice']()\"\n }\n})\nexport class DfSidenavItemComponent {\n /**\n * Label of the sidenav item\n */\n readonly label = input.required();\n /**\n * Flag whether the sidenav item is collapsed\n * @default false\n */\n readonly collapsed = model(false);\n /**\n * Optional icon class for the sidenav item\n */\n readonly icon = input('');\n /**\n * Reference to the parent element containing this item\n */\n protected readonly parentWrapper = inject(DfSidenavItemComponent, {\n optional: true,\n skipSelf: true\n });\n /**\n * Child sidenav items nested inside this item\n */\n protected readonly childrenItems = contentChildren(DfSidenavItemComponent, { descendants: true });\n /**\n * Child sidenav links nested inside this item\n */\n protected readonly childrenLinks = contentChildren(DfSidenavLinkComponent, { descendants: true });\n /**\n * Reference to the desktop instance of the sidenav item\n */\n protected readonly desktopInstance = viewChild(DfSidenavItemDesktopComponent);\n /**\n * Reference to the mobile instance of the sidenav item\n */\n protected readonly mobileInstance = viewChild(DfSidenavItemMobileComponent);\n private readonly iconContentQuery = contentChild(DfSidenavIconDirective);\n protected readonly wrapperHasIconContent = computed(\n () => this.icon() !== '' || this.iconContentQuery() !== undefined\n );\n protected readonly sidenav = inject(DfSidenavComponent);\n}\n","import { createNavManager, NavManagerItemConfig, useDirectiveForHost } from '@agnos-ui/angular-headless';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AfterContentInit,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n PLATFORM_ID,\n Signal,\n signal,\n viewChild\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { DfDrawerComponent } from '@design-factory/angular/drawer';\nimport { DfMedia } from '@design-factory/design-factory';\nimport { DfSidenavItemComponent } from './sidenav-item/sidenav-item.component';\nimport { DfSidenavLinkComponent } from './sidenav-link/sidenav-link.component';\n\n/**\n * Utility method to check if the user agent is a mobile device\n *\n * @param userAgent - The user agent string to check\n * @returns `true` if the user agent corresponds to a mobile device, `false` otherwise\n */\nfunction isMobileUserAgent(userAgent: string): boolean {\n return /mobile|android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);\n}\n\n/**\n * SideNav is a component to provide navigation feature with a panel on the side of your page\n * @since 21.0.0\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'df-sidenav',\n template: `\n <df-drawer\n #drawer\n className=\"inline-start {{ isSmallScreen() ? 'df-sidenav-mobile-drawer' : '' }}\"\n [visible]=\"!_isMinimized()\"\n (visibleChange)=\"visibleChangeHandler($event)\"\n (minimizedChange)=\"_isMinimized.set($event)\"\n (resizingChange)=\"resizingChangeHandler($event)\"\n [bodyScroll]=\"true\"\n [backdrop]=\"backdrop()\"\n [(size)]=\"width\"\n [container]=\"isSmallScreen() ? null : hostRef.nativeElement\"\n [resizable]=\"resizable() && !isSmallScreen()\"\n [focusOnInit]=\"false\"\n [keepInDom]=\"true\"\n >\n <nav class=\"d-flex flex-column w-100 h-100 p-5 pb-3\">\n <div class=\"df-sidenav-header flex-shrink-0\" [class.df-sidenav-header-minimized]=\"_isMinimized()\">\n @if (searchable()) {\n @if (_isMinimized()) {\n <button\n class=\"btn btn-outline-neutral df-btn-icononly mb-3 w-100 fa-search\"\n [class.df-sidenav-search-minimized]=\"!contentHasIcons()\"\n type=\"button\"\n (click)=\"focusSearch()\"\n i18n-aria-label=\"@@df.sidenav.search.ariaLabel\"\n aria-label=\"Search\"\n ></button>\n } @else {\n <div class=\"input-group mb-3\">\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text fa-light fa-search\"></span>\n </div>\n <input\n type=\"search\"\n class=\"form-control df-input-withicon\"\n i18n-placeholder=\"@@df.sidenav.search.placeholder\"\n placeholder=\"Search\"\n i18n-aria-label=\"@@df.sidenav.search.ariaLabel\"\n aria-label=\"Search\"\n [(ngModel)]=\"searchTerm\"\n #textInput\n />\n <div class=\"input-group-append\">\n <button\n class=\"input-group-text fa-light fa-times\"\n [class.df-sidenav-search-empty]=\"searchTerm() === ''\"\n (click)=\"searchTerm.set(''); textInput.focus()\"\n >\n <span class=\"visually-hidden\" i18n=\"@@df.sidenav.search.clearText\">Clear text</span>\n </button>\n </div>\n </div>\n }\n }\n </div>\n\n <div role=\"list\" class=\"sidenav-body flex-grow-1 overflow-y-auto\" #scrollableContainer>\n <ng-content />\n </div>\n @if (collapsible() && !isSmallScreen()) {\n <div class=\"d-flex sidenav-footer flex-shrink-0 py-3\">\n <button\n class=\"btn btn-outline-primary df-btn-icononly df-sidenav-toggle-minimized\"\n (click)=\"toggleMinimize()\"\n i18n-aria-label=\"@@df.sidenav.toggleMinimize.ariaLabel\"\n aria-label=\"Toggle minimized sidenav\"\n >\n @if (isMinimized()) {\n <span class=\"fa-arrow-right-to-line\"></span>\n } @else {\n <span class=\"fa-arrow-left-to-line\"></span>\n }\n </button>\n </div>\n }\n </nav>\n </df-drawer>\n `,\n imports: [FormsModule, DfDrawerComponent],\n host: {\n class: 'df-sidenav',\n '[class.df-sidenav-lg]': 'isLargeUpScreen()',\n '[class.df-sidenav-withicon]': 'contentHasIcons()',\n '[class.d-none]': 'isSmallScreen() && _isMinimized()',\n '[class.df-sidenav-drawer]': 'isMediumScreen() && !_isMinimized()'\n }\n})\nexport class DfSidenavComponent implements AfterContentInit {\n /**\n * Flag whether the sidenav includes a search input\n * @default true\n */\n readonly searchable = input(true, { transform: booleanAttribute });\n /**\n * Flag whether the sidenav should be resizable\n * @default true\n */\n readonly resizable = input(true, { transform: booleanAttribute });\n /**\n * Flag whether the sidenav should have the collapse button\n * @default true\n */\n readonly collapsible = input(true, { transform: booleanAttribute });\n /**\n * Flag to enable the mobile sidenav display of the items.\n * @default true\n */\n readonly enableMobile = input(true, { transform: booleanAttribute });\n\n protected readonly _isMinimized = linkedSignal(() => {\n // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size\n if (this.isMobileDevice()) {\n return true;\n }\n // in desktop, we track the large screen signal in order to reset the minimized state\n // it allows resizing the window and have a more user-friendly behavior\n return !this.isLargeUpScreen();\n });\n\n /**\n * Flag to indicate if the sidenav is minimized\n */\n readonly isMinimized = computed(() => this._isMinimized());\n\n protected readonly hostRef = inject(ElementRef<HTMLElement>);\n\n private readonly scrollableContainer = viewChild.required<ElementRef<HTMLElement>>('scrollableContainer');\n\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n protected readonly isMobileDevice = computed(() => {\n if (this.isBrowser) {\n return this.enableMobile() && isMobileUserAgent(navigator.userAgent);\n } else {\n // SSR: try to get request if available\n try {\n const request = inject(Request, { optional: true });\n if (request && 'headers' in request) {\n const userAgent = request.headers.get('user-agent') || '';\n return this.enableMobile() && isMobileUserAgent(userAgent);\n }\n } catch {\n // Request token not available or not in SSR context\n }\n return false;\n }\n });\n\n protected readonly searchInput = viewChild<ElementRef>('textInput');\n // Query all links to find active ones\n private readonly allLinks = contentChildren(DfSidenavLinkComponent, { descendants: true });\n private readonly allItems = contentChildren(DfSidenavItemComponent, { descendants: true });\n\n protected readonly width = signal(null as number | null);\n private savedWidth: number | null = null;\n\n protected readonly searchTerm = signal('');\n\n // Mobile navigation stack - tracks which item's children are currently displayed\n // Using component references instead of labels for uniqueness\n protected readonly mobileNavigationStack = signal<(DfSidenavItemComponent | null | undefined)[]>([]);\n protected readonly currentMobilePanel: Signal<DfSidenavItemComponent | null | undefined> = computed(() => {\n const stack = this.mobileNavigationStack();\n return stack.length > 0 ? stack[stack.length - 1] : null;\n });\n\n protected readonly isSmallScreen = toSignal(inject(DfMedia).getObservable(['sm', 'xs']), { initialValue: false });\n protected readonly isMediumScreen = toSignal(inject(DfMedia).getObservable(['md']), { initialValue: false });\n protected readonly isLargeUpScreen = toSignal(inject(DfMedia).getObservable(['lg', 'xl', 'xxl', 'xxxl']), {\n initialValue: false\n });\n protected readonly isMobileOrSmallScreen = computed(() => this.isSmallScreen() || this.isMediumScreen());\n\n protected readonly backdrop = computed(() => this.isMediumScreen());\n\n protected readonly navManager = createNavManager();\n\n protected readonly navManagerConfig: NavManagerItemConfig = {\n selector: (node) => node.querySelectorAll<HTMLElement>('input, button, a'),\n keys: {\n Home: this.navManager.focusFirst,\n End: this.navManager.focusLast\n }\n };\n\n private readonly injector = inject(Injector);\n\n constructor() {\n useDirectiveForHost(this.navManager.directive, this.navManagerConfig);\n afterRenderEffect(() => {\n if (this.isBrowser) {\n if (this.isMobileDevice() && !this._isMinimized()) {\n // Delay to ensure DOM and contentChildren queries are ready\n this.navigateToActiveItem();\n }\n\n // Keep track of the screen size changes to reset width\n if (this.isMediumScreen() || this.isSmallScreen() || this.isLargeUpScreen()) {\n this.width.set(null);\n }\n }\n });\n }\n\n ngAfterContentInit() {\n if (!this.isMobileDevice && this.isBrowser && this.isLargeUpScreen()) {\n void this.initializeDesktopNavigation();\n }\n }\n\n /**\n * This method allows to center and show the active link, when the sidenav is used in desktop and a large screen.\n * It collapses all items and expands only the parents of the active link.\n * Also, it scrolls to the active link to make it visible.\n */\n private async initializeDesktopNavigation() {\n // RouterLinkActive queues two microtasks, so we wait for them to complete\n await Promise.resolve();\n await Promise.resolve();\n // Find the first active link\n const activeLink = this.allLinks()\n .find((link) => link['desktopInstance']()?.isActiveLink())\n ?.['desktopInstance']?.();\n if (activeLink) {\n this.allItems().forEach((item) => {\n item.collapsed.set(true);\n });\n let currentParent = activeLink['parentItem'];\n while (currentParent) {\n currentParent.collapsed.set(false);\n currentParent = currentParent['parentWrapper'];\n }\n\n // We need a render to make sure the getBoundingClientRect calls will be correct AFTER the collapse of the items.\n afterNextRender(\n {\n read: () => {\n const anchorElement = activeLink['anchor']().nativeElement;\n const containerElement = this.scrollableContainer().nativeElement;\n const heightPx =\n anchorElement.getBoundingClientRect().top +\n anchorElement.clientHeight / 2 -\n containerElement.getBoundingClientRect().top -\n containerElement.clientHeight / 3;\n containerElement.scrollTo({ top: heightPx, behavior: 'instant' });\n }\n },\n { injector: this.injector }\n );\n }\n }\n\n /**\n * Toggles the minimized state of the sidenav\n *\n * @param minimized - Optional parameter to explicitly set the minimized state\n *\n */\n toggleMinimize(minimized = !this._isMinimized()) {\n if (minimized) {\n this.savedWidth = this.width();\n this.width.set(0);\n } else {\n this.width.set(this.savedWidth);\n }\n this._isMinimized.set(minimized);\n }\n\n /**\n * Handles visibility changes of the sidenav component to handle the component state accordingly.\n *\n * @param isVisible - Boolean indicating whether the sidenav is currently visible\n */\n visibleChangeHandler(isVisible: boolean) {\n if (!isVisible) {\n this.width.set(0);\n }\n this._isMinimized.set(!isVisible);\n }\n\n /**\n * Handles changes when the sidenav is resized, to handle the state accordingly.\n *\n * @param isResizing - Whether the sidenav is currently being resized\n */\n resizingChangeHandler(isResizing: boolean) {\n if (isResizing) {\n this._isMinimized.set(false);\n } else {\n if (this._isMinimized()) {\n this.width.set(0);\n } else {\n this.savedWidth = this.width();\n }\n }\n }\n\n // utility to transfer focus from the button when minimized to the search input when uncollapsed\n protected focusSearch() {\n this.toggleMinimize(false);\n setTimeout(() => {\n this.searchInput()?.nativeElement.focus();\n });\n }\n\n /**\n * Method to add the given item to the mobile navigation stack\n * @param itemRef item to be added to the navigation stack\n */\n navigateToChildren(itemRef: DfSidenavItemComponent | null | undefined) {\n const stack = this.mobileNavigationStack();\n this.mobileNavigationStack.set([...stack, itemRef]);\n }\n\n /**\n * Method to navigate back in the mobile navigation stack\n */\n navigateBack() {\n const stack = this.mobileNavigationStack();\n if (stack.length > 0) {\n this.mobileNavigationStack.set(stack.slice(0, -1));\n }\n }\n\n /**\n * Navigates to the active item in the sidenav\n * Expands parent items (desktop) and sets up mobile navigation stack\n */\n private navigateToActiveItem() {\n if (!this.isBrowser) {\n return;\n }\n\n // Find the first active link\n const activeLink = this.allLinks()\n .find((link) => link['mobileInstance']()?.isActiveLink())\n ?.['mobileInstance']();\n if (activeLink && activeLink['parentItem']) {\n // Build the path from root to the active link's parent (inclusive)\n const navigationPath: DfSidenavItemComponent[] = [];\n let current: DfSidenavItemComponent | null = activeLink['parentItem'];\n while (current) {\n navigationPath.unshift(current); // Add to beginning to build path from root\n current = current['parentWrapper'];\n }\n this.mobileNavigationStack.set(navigationPath);\n } else if (activeLink && !activeLink['parentItem']) {\n // Clear navigation stack to show root level\n this.mobileNavigationStack.set([]);\n }\n }\n\n protected readonly contentHasIcons = computed(\n () =>\n this.allItems().some((item) => item['wrapperHasIconContent']()) ||\n this.allLinks().some((link) => link['wrapperHasIconContent']())\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,19 +2,19 @@
2
2
  "name": "@design-factory/angular",
3
3
  "description": "Amadeus design system Angular implementation",
4
4
  "license": "BSD-3-Clause",
5
- "version": "21.0.0-next.1",
5
+ "version": "21.0.0",
6
6
  "dependencies": {
7
7
  "tslib": "^2.0.0"
8
8
  },
9
9
  "peerDependencies": {
10
- "@agnos-ui/angular-headless": "~0.10.0-next.4",
11
- "@agnos-ui/core-bootstrap": "~0.10.0-next.4",
10
+ "@agnos-ui/angular-headless": "~0.10.0",
11
+ "@agnos-ui/core-bootstrap": "~0.10.0",
12
12
  "@angular/common": "^21.0.0",
13
13
  "@angular/core": "^21.0.0",
14
14
  "@angular/localize": "^21.0.0",
15
15
  "@angular/router": "^21.0.0",
16
- "@design-factory/design-factory": "21.0.0-next.1",
17
- "@design-factory/styles": "21.0.0-next.1"
16
+ "@design-factory/design-factory": "21.0.0",
17
+ "@design-factory/styles": "21.0.0"
18
18
  },
19
19
  "peerDependenciesMeta": {
20
20
  "@angular/router": {
@@ -3,6 +3,14 @@ import { DrawerWidget, NavManagerItemConfig } from '@agnos-ui/angular-headless';
3
3
  import * as _angular_core from '@angular/core';
4
4
  import { AgnosWidgetDirective } from '@design-factory/angular/internals';
5
5
 
6
+ /**
7
+ * Possible values for the drawer positions.
8
+ */
9
+ type DrawerPositions = 'inline-start' | 'inline-end' | 'block-start' | 'block-end';
10
+ /**
11
+ * Enables users to show contextual content via a sliding panel from any screen edge.
12
+ * @experimental
13
+ */
6
14
  declare class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {
7
15
  /**
8
16
  * CSS classes to be applied on the widget main container
@@ -15,13 +23,13 @@ declare class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {
15
23
  *
16
24
  * @defaultValue `false`
17
25
  */
18
- readonly bodyScroll: _angular_core.InputSignal<boolean>;
26
+ readonly bodyScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
19
27
  /**
20
28
  * If `true` displays the backdrop element and disables the body scrolling, otherwise the body of the document is navigable
21
29
  *
22
30
  * @defaultValue `true`
23
31
  */
24
- readonly backdrop: _angular_core.InputSignal<boolean>;
32
+ readonly backdrop: _angular_core.InputSignalWithTransform<boolean, unknown>;
25
33
  /**
26
34
  * Which element should contain the drawer and backdrop DOM elements.
27
35
  * If it is not null, the drawer and backdrop DOM elements are moved to the specified container.
@@ -44,13 +52,20 @@ declare class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {
44
52
  *
45
53
  * @defaultValue `false`
46
54
  */
47
- readonly resizable: _angular_core.InputSignal<boolean>;
55
+ readonly resizable: _angular_core.InputSignalWithTransform<boolean, unknown>;
48
56
  /**
49
57
  * If `true`, the drawer is shown; otherwise, it is hidden.
50
58
  *
51
59
  * @defaultValue `false`
52
60
  */
53
- readonly visible: _angular_core.InputSignal<boolean>;
61
+ readonly visible: _angular_core.InputSignalWithTransform<boolean, unknown>;
62
+ /**
63
+ * If `true`, the drawer element is kept in the DOM when it is not visible.
64
+ * This can be useful to preserve the state of the drawer content when it is hidden.
65
+ *
66
+ * @defaultValue `true`
67
+ */
68
+ readonly keepInDom: _angular_core.InputSignalWithTransform<boolean, unknown>;
54
69
  /**
55
70
  * An event emitted when the width is changed.
56
71
  *
@@ -100,6 +115,12 @@ declare class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {
100
115
  * ```
101
116
  */
102
117
  readonly resizingChange: _angular_core.OutputEmitterRef<boolean>;
118
+ /**
119
+ * If `true` focuses the drawer when it is opened.
120
+ *
121
+ * @defaultValue `true`
122
+ */
123
+ readonly focusOnInit: _angular_core.InputSignalWithTransform<boolean, unknown>;
103
124
  protected readonly navManager: _agnos_ui_angular_headless.NavManager<unknown>;
104
125
  protected readonly navManagerConfig: NavManagerItemConfig;
105
126
  /**
@@ -114,22 +135,18 @@ declare class DfDrawerComponent extends AgnosWidgetDirective<DrawerWidget> {
114
135
  * @defaultValue `null`
115
136
  */
116
137
  readonly maxSize: _angular_core.OutputEmitterRef<void>;
117
- protected readonly isMediumScreen: _angular_core.Signal<boolean>;
118
- protected readonly isLargeUpScreen: _angular_core.Signal<boolean>;
119
- private readonly isBrowser;
138
+ constructor();
120
139
  /**
121
- * Flag to enable mobile device detection for responsive behavior
122
- * @default true
140
+ * Trigger the opening of the drawer.
123
141
  */
124
- readonly enableMobile: _angular_core.InputSignalWithTransform<boolean, unknown>;
142
+ open(): void;
125
143
  /**
126
- * Flag to indicate if the drawer is minimized
144
+ * Trigger the closing of the drawer.
127
145
  */
128
- readonly isMinimized: _angular_core.WritableSignal<boolean>;
129
- protected readonly isMobileDevice: boolean;
130
- constructor();
146
+ close(): void;
131
147
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DfDrawerComponent, never>;
132
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DfDrawerComponent, "df-drawer", never, { "className": { "alias": "className"; "required": false; "isSignal": true; }; "bodyScroll": { "alias": "bodyScroll"; "required": false; "isSignal": true; }; "backdrop": { "alias": "backdrop"; "required": false; "isSignal": true; }; "container": { "alias": "container"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "enableMobile": { "alias": "enableMobile"; "required": false; "isSignal": true; }; }, { "size": "sizeChange"; "sizeChange": "sizeChange"; "visibleChange": "visibleChange"; "minimizedChange": "minimizedChange"; "maximizedChange": "maximizedChange"; "resizingChange": "resizingChange"; "minSize": "minSize"; "maxSize": "maxSize"; }, never, ["*"], true, never>;
148
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DfDrawerComponent, "df-drawer", never, { "className": { "alias": "className"; "required": false; "isSignal": true; }; "bodyScroll": { "alias": "bodyScroll"; "required": false; "isSignal": true; }; "backdrop": { "alias": "backdrop"; "required": false; "isSignal": true; }; "container": { "alias": "container"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "keepInDom": { "alias": "keepInDom"; "required": false; "isSignal": true; }; "focusOnInit": { "alias": "focusOnInit"; "required": false; "isSignal": true; }; }, { "size": "sizeChange"; "sizeChange": "sizeChange"; "visibleChange": "visibleChange"; "minimizedChange": "minimizedChange"; "maximizedChange": "maximizedChange"; "resizingChange": "resizingChange"; "minSize": "minSize"; "maxSize": "maxSize"; }, never, ["*", "df-drawer-splitter-content"], true, never>;
133
149
  }
134
150
 
135
151
  export { DfDrawerComponent };
152
+ export type { DrawerPositions };
@@ -261,11 +261,6 @@ declare class DfSidenavComponent implements AfterContentInit {
261
261
  * @default true
262
262
  */
263
263
  readonly searchable: _angular_core.InputSignalWithTransform<boolean, unknown>;
264
- /**
265
- * The container element for the sidenav (null for body)
266
- * @default null
267
- */
268
- readonly container: _angular_core.InputSignal<HTMLElement | null>;
269
264
  /**
270
265
  * Flag whether the sidenav should be resizable
271
266
  * @default true
@@ -277,7 +272,7 @@ declare class DfSidenavComponent implements AfterContentInit {
277
272
  */
278
273
  readonly collapsible: _angular_core.InputSignalWithTransform<boolean, unknown>;
279
274
  /**
280
- * Flag to enable mobile device detection for responsive behavior
275
+ * Flag to enable the mobile sidenav display of the items.
281
276
  * @default true
282
277
  */
283
278
  readonly enableMobile: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -289,7 +284,7 @@ declare class DfSidenavComponent implements AfterContentInit {
289
284
  protected readonly hostRef: ElementRef<any>;
290
285
  private readonly scrollableContainer;
291
286
  private readonly isBrowser;
292
- protected readonly isMobileDevice: boolean;
287
+ protected readonly isMobileDevice: Signal<boolean>;
293
288
  protected readonly searchInput: Signal<ElementRef<any> | undefined>;
294
289
  private readonly allLinks;
295
290
  private readonly allItems;
@@ -350,7 +345,7 @@ declare class DfSidenavComponent implements AfterContentInit {
350
345
  private navigateToActiveItem;
351
346
  protected readonly contentHasIcons: Signal<boolean>;
352
347
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DfSidenavComponent, never>;
353
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DfSidenavComponent, "df-sidenav", never, { "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "container": { "alias": "container"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "enableMobile": { "alias": "enableMobile"; "required": false; "isSignal": true; }; }, {}, ["allLinks", "allItems"], ["*"], true, never>;
348
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DfSidenavComponent, "df-sidenav", never, { "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "enableMobile": { "alias": "enableMobile"; "required": false; "isSignal": true; }; }, {}, ["allLinks", "allItems"], ["*"], true, never>;
354
349
  }
355
350
 
356
351
  /**