@edsis/ui 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/empty/README.md +1 -1
  2. package/fesm2022/edsis-ui-accordion.mjs +15 -15
  3. package/fesm2022/edsis-ui-alert-dialog.mjs +27 -27
  4. package/fesm2022/edsis-ui-alert.mjs +12 -12
  5. package/fesm2022/edsis-ui-aspect-ratio.mjs +3 -3
  6. package/fesm2022/edsis-ui-avatar.mjs +18 -18
  7. package/fesm2022/edsis-ui-badge.mjs +3 -3
  8. package/fesm2022/edsis-ui-breadcrumb.mjs +21 -21
  9. package/fesm2022/edsis-ui-button-group.mjs +9 -9
  10. package/fesm2022/edsis-ui-button.mjs +3 -3
  11. package/fesm2022/edsis-ui-calendar.mjs +3 -3
  12. package/fesm2022/edsis-ui-card.mjs +21 -21
  13. package/fesm2022/edsis-ui-carousel.mjs +18 -18
  14. package/fesm2022/edsis-ui-chart.mjs +80 -78
  15. package/fesm2022/edsis-ui-chart.mjs.map +1 -1
  16. package/fesm2022/edsis-ui-checkbox.mjs +3 -3
  17. package/fesm2022/edsis-ui-collapsible.mjs +12 -12
  18. package/fesm2022/edsis-ui-combobox.mjs +3 -3
  19. package/fesm2022/edsis-ui-command.mjs +41 -35
  20. package/fesm2022/edsis-ui-command.mjs.map +1 -1
  21. package/fesm2022/edsis-ui-composer.mjs +21 -21
  22. package/fesm2022/edsis-ui-context-menu.mjs +13 -7
  23. package/fesm2022/edsis-ui-context-menu.mjs.map +1 -1
  24. package/fesm2022/edsis-ui-date-picker.mjs +3 -3
  25. package/fesm2022/edsis-ui-dialog.mjs +27 -23
  26. package/fesm2022/edsis-ui-dialog.mjs.map +1 -1
  27. package/fesm2022/edsis-ui-dropdown-menu.mjs +58 -46
  28. package/fesm2022/edsis-ui-dropdown-menu.mjs.map +1 -1
  29. package/fesm2022/edsis-ui-editor.mjs +22 -20
  30. package/fesm2022/edsis-ui-editor.mjs.map +1 -1
  31. package/fesm2022/edsis-ui-empty.mjs +18 -18
  32. package/fesm2022/edsis-ui-form.mjs +38 -38
  33. package/fesm2022/edsis-ui-form.mjs.map +1 -1
  34. package/fesm2022/edsis-ui-hover-card.mjs +34 -13
  35. package/fesm2022/edsis-ui-hover-card.mjs.map +1 -1
  36. package/fesm2022/edsis-ui-input-group.mjs +18 -18
  37. package/fesm2022/edsis-ui-input-otp.mjs +15 -15
  38. package/fesm2022/edsis-ui-input.mjs +3 -3
  39. package/fesm2022/edsis-ui-item.mjs +30 -30
  40. package/fesm2022/edsis-ui-kanban.mjs +27 -27
  41. package/fesm2022/edsis-ui-kbd.mjs +6 -6
  42. package/fesm2022/edsis-ui-label.mjs +3 -3
  43. package/fesm2022/edsis-ui-layout-services.mjs +6 -0
  44. package/fesm2022/edsis-ui-layout-services.mjs.map +1 -0
  45. package/fesm2022/edsis-ui-layout-types.mjs +6 -0
  46. package/fesm2022/edsis-ui-layout-types.mjs.map +1 -0
  47. package/fesm2022/edsis-ui-layout.mjs +572 -0
  48. package/fesm2022/edsis-ui-layout.mjs.map +1 -0
  49. package/fesm2022/edsis-ui-menubar.mjs +22 -16
  50. package/fesm2022/edsis-ui-menubar.mjs.map +1 -1
  51. package/fesm2022/edsis-ui-native-select.mjs +9 -9
  52. package/fesm2022/edsis-ui-nav-service.mjs +343 -0
  53. package/fesm2022/edsis-ui-nav-service.mjs.map +1 -0
  54. package/fesm2022/edsis-ui-nav.mjs +2340 -0
  55. package/fesm2022/edsis-ui-nav.mjs.map +1 -0
  56. package/fesm2022/edsis-ui-navigation-menu.mjs +30 -24
  57. package/fesm2022/edsis-ui-navigation-menu.mjs.map +1 -1
  58. package/fesm2022/edsis-ui-page.mjs +397 -0
  59. package/fesm2022/edsis-ui-page.mjs.map +1 -0
  60. package/fesm2022/edsis-ui-pagination.mjs +3 -3
  61. package/fesm2022/edsis-ui-pillbox.mjs +16 -16
  62. package/fesm2022/edsis-ui-pillbox.mjs.map +1 -1
  63. package/fesm2022/edsis-ui-popover.mjs +16 -10
  64. package/fesm2022/edsis-ui-popover.mjs.map +1 -1
  65. package/fesm2022/edsis-ui-progress.mjs +3 -3
  66. package/fesm2022/edsis-ui-radio.mjs +6 -6
  67. package/fesm2022/edsis-ui-resizable.mjs +12 -12
  68. package/fesm2022/edsis-ui-scroll-area.mjs +3 -3
  69. package/fesm2022/edsis-ui-select.mjs +6 -6
  70. package/fesm2022/edsis-ui-separator.mjs +3 -3
  71. package/fesm2022/edsis-ui-sheet.mjs +27 -23
  72. package/fesm2022/edsis-ui-sheet.mjs.map +1 -1
  73. package/fesm2022/edsis-ui-skeleton.mjs +3 -3
  74. package/fesm2022/edsis-ui-slider.mjs +6 -6
  75. package/fesm2022/edsis-ui-spinner.mjs +3 -3
  76. package/fesm2022/edsis-ui-switch.mjs +3 -3
  77. package/fesm2022/edsis-ui-table.mjs +24 -24
  78. package/fesm2022/edsis-ui-tabs.mjs +18 -18
  79. package/fesm2022/edsis-ui-textarea.mjs +3 -3
  80. package/fesm2022/edsis-ui-theme.mjs +209 -0
  81. package/fesm2022/edsis-ui-theme.mjs.map +1 -0
  82. package/fesm2022/edsis-ui-timeline.mjs +18 -18
  83. package/fesm2022/edsis-ui-toast.mjs +3 -3
  84. package/fesm2022/edsis-ui-toggle-group.mjs +9 -9
  85. package/fesm2022/edsis-ui-toggle.mjs +3 -3
  86. package/fesm2022/edsis-ui-tooltip.mjs +12 -12
  87. package/layout/README.md +454 -0
  88. package/nav/README.md +96 -0
  89. package/package.json +31 -2
  90. package/page/README.md +46 -0
  91. package/types/edsis-ui-command.d.ts +4 -1
  92. package/types/edsis-ui-context-menu.d.ts +2 -1
  93. package/types/edsis-ui-dropdown-menu.d.ts +5 -2
  94. package/types/edsis-ui-editor.d.ts +1 -0
  95. package/types/edsis-ui-hover-card.d.ts +3 -1
  96. package/types/edsis-ui-layout-services.d.ts +1 -0
  97. package/types/edsis-ui-layout-types.d.ts +1 -0
  98. package/types/edsis-ui-layout.d.ts +153 -0
  99. package/types/edsis-ui-menubar.d.ts +2 -0
  100. package/types/edsis-ui-nav-service.d.ts +138 -0
  101. package/types/edsis-ui-nav.d.ts +205 -0
  102. package/types/edsis-ui-navigation-menu.d.ts +2 -0
  103. package/types/edsis-ui-page.d.ts +137 -0
  104. package/types/edsis-ui-popover.d.ts +2 -1
  105. package/types/edsis-ui-theme.d.ts +71 -0
@@ -0,0 +1,2340 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, TemplateRef, Directive, signal, computed, Injectable, DestroyRef, effect, input, ChangeDetectionStrategy, Component, output, ElementRef, InjectionToken, booleanAttribute, model, contentChild, forwardRef, ViewContainerRef } from '@angular/core';
3
+ import { cn } from '@edsis/ui/utils';
4
+ import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { Router, NavigationEnd, RouterLink, RouterLinkActive } from '@angular/router';
7
+
8
+ class NavIconDirective {
9
+ template = inject(TemplateRef);
10
+ static ngTemplateContextGuard(_directive, context) {
11
+ return true;
12
+ }
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
14
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.15", type: NavIconDirective, isStandalone: true, selector: "ng-template[uiNavIcon]", ngImport: i0 });
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavIconDirective, decorators: [{
17
+ type: Directive,
18
+ args: [{
19
+ selector: 'ng-template[uiNavIcon]',
20
+ }]
21
+ }] });
22
+
23
+ const DEFAULT_NAV_ID = 'default';
24
+ const DEFAULT_VERTICAL_APPEARANCE = 'sidebar';
25
+ const DEFAULT_HORIZONTAL_APPEARANCE = 'navbar';
26
+ const DEFAULT_POSITION = 'left';
27
+ const DEFAULT_DOCKBAR_MODE = 'sticky';
28
+ const VERTICAL_APPEARANCE_STORAGE_KEY = 'nav-vertical-appearance';
29
+ const HORIZONTAL_APPEARANCE_STORAGE_KEY = 'nav-horizontal-appearance';
30
+ class NavService {
31
+ documentRef = inject(DOCUMENT, { optional: true });
32
+ router = inject(Router, { optional: true });
33
+ routerUrl = signal(this.router?.url ?? '/', ...(ngDevMode ? [{ debugName: "routerUrl" }] : /* istanbul ignore next */ []));
34
+ states = signal({}, ...(ngDevMode ? [{ debugName: "states" }] : /* istanbul ignore next */ []));
35
+ openPanelKeys = signal({}, ...(ngDevMode ? [{ debugName: "openPanelKeys" }] : /* istanbul ignore next */ []));
36
+ drawerOpenState = signal({}, ...(ngDevMode ? [{ debugName: "drawerOpenState" }] : /* istanbul ignore next */ []));
37
+ openPanelKey = computed(() => this.openPanelKeys()[DEFAULT_NAV_ID] ?? null, ...(ngDevMode ? [{ debugName: "openPanelKey" }] : /* istanbul ignore next */ []));
38
+ exactMatchOptions = {
39
+ paths: 'exact',
40
+ queryParams: 'exact',
41
+ fragment: 'exact',
42
+ matrixParams: 'exact',
43
+ };
44
+ subsetMatchOptions = {
45
+ paths: 'subset',
46
+ queryParams: 'subset',
47
+ fragment: 'ignored',
48
+ matrixParams: 'ignored',
49
+ };
50
+ constructor() {
51
+ this.ensureAppearanceDefaults();
52
+ this.router?.events.pipe(takeUntilDestroyed()).subscribe((event) => {
53
+ if (event instanceof NavigationEnd) {
54
+ this.routerUrl.set(event.urlAfterRedirects);
55
+ }
56
+ });
57
+ }
58
+ register(input) {
59
+ this.ensureAppearanceDefaults();
60
+ const state = this.resolveState(input);
61
+ this.states.update((states) => ({ ...states, [state.id]: state }));
62
+ this.persistState(state);
63
+ return state;
64
+ }
65
+ unregister(id) {
66
+ const navId = this.normalizeId(id);
67
+ this.states.update((states) => this.withoutKey(states, navId));
68
+ this.openPanelKeys.update((state) => this.withoutKey(state, navId));
69
+ this.drawerOpenState.update((state) => this.withoutKey(state, navId));
70
+ }
71
+ state(id) {
72
+ const navId = this.normalizeId(id);
73
+ return computed(() => this.states()[navId] ?? null);
74
+ }
75
+ currentState(id) {
76
+ return this.states()[this.normalizeId(id)] ?? null;
77
+ }
78
+ currentPanelKey(id) {
79
+ return this.openPanelKeys()[this.normalizeId(id)] ?? null;
80
+ }
81
+ update(id, patch) {
82
+ const navId = this.normalizeId(id);
83
+ const current = this.states()[navId] ?? this.resolveState({ id: navId, orientation: patch.orientation ?? 'vertical' });
84
+ return this.register({
85
+ id: navId,
86
+ orientation: patch.orientation ?? current.orientation,
87
+ appearance: patch.appearance ?? current.appearance,
88
+ position: patch.position ?? current.position,
89
+ collapsed: patch.collapsed ?? current.collapsed,
90
+ dockbarMode: patch.dockbarMode ?? current.dockbarMode,
91
+ });
92
+ }
93
+ setAppearance(id, appearance) {
94
+ return this.update(id, { appearance });
95
+ }
96
+ setPosition(id, position) {
97
+ return this.update(id, { position });
98
+ }
99
+ setCollapsed(id, collapsed) {
100
+ return this.update(id, { collapsed });
101
+ }
102
+ toggleCollapsed(id) {
103
+ const navId = this.normalizeId(id);
104
+ const current = this.states()[navId] ?? this.resolveState({ id: navId, orientation: 'vertical' });
105
+ return this.setCollapsed(navId, !current.collapsed);
106
+ }
107
+ setDockbarMode(id, mode) {
108
+ return this.update(id, { dockbarMode: mode });
109
+ }
110
+ isRouterItem(item) {
111
+ return !!item.link && !item.externalLink;
112
+ }
113
+ hrefFor(item) {
114
+ if (item.href) {
115
+ return item.href;
116
+ }
117
+ if (item.externalLink && typeof item.link === 'string') {
118
+ return item.link;
119
+ }
120
+ return null;
121
+ }
122
+ relFor(item) {
123
+ if (item.rel) {
124
+ return item.rel;
125
+ }
126
+ return item.target === '_blank' || item.externalLink ? 'noopener noreferrer' : null;
127
+ }
128
+ routerLinkActiveOptions(item) {
129
+ return item.isActiveMatchOptions ?? (item.exactMatch ? this.exactMatchOptions : this.subsetMatchOptions);
130
+ }
131
+ itemRole(orientation, level) {
132
+ return orientation === 'horizontal' || level > 0 ? 'menuitem' : null;
133
+ }
134
+ compactLabel(item, compact) {
135
+ return compact ? (item.tooltip ?? item.title ?? null) : null;
136
+ }
137
+ titleFor(item, compact) {
138
+ return item.tooltip ?? (compact ? (item.title ?? null) : null);
139
+ }
140
+ compactFallback(item) {
141
+ return (item.title ?? item.id ?? '?').trim().slice(0, 2);
142
+ }
143
+ iconContext(item, active, level, orientation) {
144
+ return {
145
+ $implicit: item.icon ?? '',
146
+ icon: item.icon ?? '',
147
+ item: item.source,
148
+ active,
149
+ orientation,
150
+ level,
151
+ };
152
+ }
153
+ isItemActive(item, activeIds, explicitActiveUrl) {
154
+ if (item.active || activeIds.has(item.stateId) || activeIds.has(item.key)) {
155
+ return true;
156
+ }
157
+ if (this.matchesActiveUrl(item, explicitActiveUrl)) {
158
+ return true;
159
+ }
160
+ return item.children.some((child) => this.isItemActive(child, activeIds, explicitActiveUrl));
161
+ }
162
+ isPanelOpen(navIdOrItem, item) {
163
+ const { navId, navItem } = this.resolvePanelArgs(navIdOrItem, item);
164
+ return this.openPanelKeys()[navId] === navItem.key;
165
+ }
166
+ openPanel(navIdOrItem, item) {
167
+ const { navId, navItem } = this.resolvePanelArgs(navIdOrItem, item);
168
+ if (navItem.disabled) {
169
+ return;
170
+ }
171
+ this.openPanelKeys.update((state) => ({ ...state, [navId]: navItem.key }));
172
+ }
173
+ togglePanel(navIdOrItem, item) {
174
+ const { navId, navItem } = this.resolvePanelArgs(navIdOrItem, item);
175
+ if (navItem.disabled) {
176
+ return;
177
+ }
178
+ this.openPanelKeys.update((state) => ({
179
+ ...state,
180
+ [navId]: state[navId] === navItem.key ? null : navItem.key,
181
+ }));
182
+ }
183
+ closePanel(id = DEFAULT_NAV_ID) {
184
+ const navId = this.normalizeId(id);
185
+ this.openPanelKeys.update((state) => ({ ...state, [navId]: null }));
186
+ }
187
+ isDrawerOpen(id) {
188
+ return this.drawerOpenState()[this.normalizeId(id)] ?? false;
189
+ }
190
+ openDrawer(id) {
191
+ const navId = this.normalizeId(id);
192
+ this.drawerOpenState.update((state) => ({ ...state, [navId]: true }));
193
+ }
194
+ toggleDrawer(id) {
195
+ const navId = this.normalizeId(id);
196
+ this.drawerOpenState.update((state) => ({ ...state, [navId]: !(state[navId] ?? false) }));
197
+ }
198
+ closeDrawer(id) {
199
+ const navId = this.normalizeId(id);
200
+ this.drawerOpenState.update((state) => ({ ...state, [navId]: false }));
201
+ }
202
+ matchesActiveUrl(item, explicitActiveUrl) {
203
+ if (!item.link || item.externalLink || typeof item.link !== 'string') {
204
+ return false;
205
+ }
206
+ const activeUrl = explicitActiveUrl ?? this.routerUrl();
207
+ const link = item.link;
208
+ if (link === '/') {
209
+ return activeUrl === '/';
210
+ }
211
+ if (item.exactMatch || item.isActiveMatchOptions?.paths === 'exact') {
212
+ return activeUrl === link;
213
+ }
214
+ return activeUrl === link || activeUrl.startsWith(`${link}/`) || activeUrl.startsWith(`${link}?`);
215
+ }
216
+ resolveState(input) {
217
+ const id = this.normalizeId(input.id);
218
+ const orientation = input.orientation;
219
+ return {
220
+ id,
221
+ orientation,
222
+ appearance: this.resolveAppearance(id, orientation, input.appearance),
223
+ position: this.resolvePosition(id, input.position),
224
+ collapsed: this.resolveCollapsed(id, input.collapsed),
225
+ dockbarMode: this.resolveDockbarMode(id, input.dockbarMode),
226
+ };
227
+ }
228
+ resolveAppearance(id, orientation, appearance) {
229
+ if (this.isAppearanceForOrientation(appearance, orientation)) {
230
+ return appearance;
231
+ }
232
+ const stored = this.readStorage(this.instanceStorageKey(id, 'appearance'));
233
+ if (this.isAppearanceForOrientation(stored, orientation)) {
234
+ return stored;
235
+ }
236
+ return this.readOrientationAppearance(orientation);
237
+ }
238
+ resolvePosition(id, position) {
239
+ if (this.isPosition(position)) {
240
+ return position;
241
+ }
242
+ const stored = this.readStorage(this.instanceStorageKey(id, 'position'));
243
+ return this.isPosition(stored) ? stored : DEFAULT_POSITION;
244
+ }
245
+ resolveCollapsed(id, collapsed) {
246
+ if (typeof collapsed === 'boolean') {
247
+ return collapsed;
248
+ }
249
+ const stored = this.readStorage(this.instanceStorageKey(id, 'collapsed'));
250
+ if (stored === 'true') {
251
+ return true;
252
+ }
253
+ if (stored === 'false') {
254
+ return false;
255
+ }
256
+ return false;
257
+ }
258
+ resolveDockbarMode(id, mode) {
259
+ if (this.isDockbarMode(mode)) {
260
+ return mode;
261
+ }
262
+ const stored = this.readStorage(this.instanceStorageKey(id, 'dockbar-mode'));
263
+ return this.isDockbarMode(stored) ? stored : DEFAULT_DOCKBAR_MODE;
264
+ }
265
+ persistState(state) {
266
+ this.writeStorage(this.instanceStorageKey(state.id, 'orientation'), state.orientation);
267
+ this.writeStorage(this.instanceStorageKey(state.id, 'appearance'), state.appearance);
268
+ this.writeStorage(this.instanceStorageKey(state.id, 'position'), state.position);
269
+ this.writeStorage(this.instanceStorageKey(state.id, 'collapsed'), String(state.collapsed));
270
+ this.writeStorage(this.instanceStorageKey(state.id, 'dockbar-mode'), state.dockbarMode);
271
+ }
272
+ readOrientationAppearance(orientation) {
273
+ const key = orientation === 'vertical' ? VERTICAL_APPEARANCE_STORAGE_KEY : HORIZONTAL_APPEARANCE_STORAGE_KEY;
274
+ const fallback = orientation === 'vertical' ? DEFAULT_VERTICAL_APPEARANCE : DEFAULT_HORIZONTAL_APPEARANCE;
275
+ const stored = this.readStorage(key);
276
+ if (this.isAppearanceForOrientation(stored, orientation)) {
277
+ return stored;
278
+ }
279
+ this.writeStorage(key, fallback);
280
+ return fallback;
281
+ }
282
+ ensureAppearanceDefaults() {
283
+ if (!this.isVerticalAppearance(this.readStorage(VERTICAL_APPEARANCE_STORAGE_KEY))) {
284
+ this.writeStorage(VERTICAL_APPEARANCE_STORAGE_KEY, DEFAULT_VERTICAL_APPEARANCE);
285
+ }
286
+ if (!this.isHorizontalAppearance(this.readStorage(HORIZONTAL_APPEARANCE_STORAGE_KEY))) {
287
+ this.writeStorage(HORIZONTAL_APPEARANCE_STORAGE_KEY, DEFAULT_HORIZONTAL_APPEARANCE);
288
+ }
289
+ }
290
+ storage() {
291
+ try {
292
+ return this.documentRef?.defaultView?.localStorage ?? null;
293
+ }
294
+ catch {
295
+ return null;
296
+ }
297
+ }
298
+ readStorage(key) {
299
+ try {
300
+ return this.storage()?.getItem(key) ?? null;
301
+ }
302
+ catch {
303
+ return null;
304
+ }
305
+ }
306
+ writeStorage(key, value) {
307
+ try {
308
+ this.storage()?.setItem(key, value);
309
+ }
310
+ catch {
311
+ return;
312
+ }
313
+ }
314
+ instanceStorageKey(id, property) {
315
+ return `nav:${id}:${property}`;
316
+ }
317
+ normalizeId(id) {
318
+ return id.trim() || DEFAULT_NAV_ID;
319
+ }
320
+ withoutKey(record, key) {
321
+ const next = { ...record };
322
+ delete next[key];
323
+ return next;
324
+ }
325
+ resolvePanelArgs(navIdOrItem, item) {
326
+ if (typeof navIdOrItem === 'string') {
327
+ return { navId: this.normalizeId(navIdOrItem), navItem: item };
328
+ }
329
+ return { navId: DEFAULT_NAV_ID, navItem: navIdOrItem };
330
+ }
331
+ isAppearanceForOrientation(value, orientation) {
332
+ return orientation === 'vertical' ? this.isVerticalAppearance(value) : this.isHorizontalAppearance(value);
333
+ }
334
+ isVerticalAppearance(value) {
335
+ return value === 'sidebar' || value === 'dockbar';
336
+ }
337
+ isHorizontalAppearance(value) {
338
+ return value === 'navbar' || value === 'flyout';
339
+ }
340
+ isPosition(value) {
341
+ return value === 'left' || value === 'right';
342
+ }
343
+ isDockbarMode(value) {
344
+ return value === 'drawer' || value === 'sticky';
345
+ }
346
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
347
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavService, providedIn: 'root' });
348
+ }
349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavService, decorators: [{
350
+ type: Injectable,
351
+ args: [{ providedIn: 'root' }]
352
+ }], ctorParameters: () => [] });
353
+
354
+ function normalizeType(type, hasChildren) {
355
+ if (type === 'divider' || type === 'spacer' || type === 'group' || type === 'mega') {
356
+ return type;
357
+ }
358
+ if (type === 'collapsible' || type === 'collapsable') {
359
+ return 'collapsible';
360
+ }
361
+ if (type === 'aside' && hasChildren) {
362
+ return 'collapsible';
363
+ }
364
+ if (!type && hasChildren) {
365
+ return 'collapsible';
366
+ }
367
+ return 'item';
368
+ }
369
+ function toKeyPart(value) {
370
+ return value
371
+ .toLowerCase()
372
+ .replace(/[^a-z0-9_-]+/g, '-')
373
+ .replace(/^-+|-+$/g, '');
374
+ }
375
+ function itemFallbackKey(item, index) {
376
+ return toKeyPart(item.title ?? item.link?.toString() ?? item.href ?? `item-${index}`) || `item-${index}`;
377
+ }
378
+ function normalizeItem(item, index, path) {
379
+ if (item.isHidden?.(item)) {
380
+ return null;
381
+ }
382
+ const children = (item.children ?? [])
383
+ .map((child, childIndex) => normalizeItem(child, childIndex, `${path}-${childIndex}`))
384
+ .filter((child) => child !== null);
385
+ const hasChildren = children.length > 0;
386
+ const key = item.id ?? `${path}-${itemFallbackKey(item, index)}`;
387
+ return {
388
+ ...item,
389
+ key,
390
+ stateId: item.id ?? key,
391
+ panelId: `ui-nav-panel-${toKeyPart(key) || index}`,
392
+ type: normalizeType(item.type, hasChildren),
393
+ source: item,
394
+ children,
395
+ };
396
+ }
397
+ function normalizeUiNavItems(items) {
398
+ return items
399
+ .map((item, index) => normalizeItem(item, index, `ui-nav-${index}`))
400
+ .filter((item) => item !== null);
401
+ }
402
+
403
+ function injectUiNavController(inputs) {
404
+ const nav = inject(NavService);
405
+ const destroyRef = inject(DestroyRef);
406
+ const registeredState = signal(null, ...(ngDevMode ? [{ debugName: "registeredState" }] : /* istanbul ignore next */ []));
407
+ let previousRegisteredId = null;
408
+ const normalizedNavId = computed(() => normalizeId(inputs.navId()), ...(ngDevMode ? [{ debugName: "normalizedNavId" }] : /* istanbul ignore next */ []));
409
+ const collapsedPreference = computed(() => inputs.collapsed() ?? (inputs.compact() ? true : null), ...(ngDevMode ? [{ debugName: "collapsedPreference" }] : /* istanbul ignore next */ []));
410
+ const normalizedItems = computed(() => {
411
+ const data = inputs.data();
412
+ return normalizeUiNavItems(data.length > 0 ? data : inputs.items());
413
+ }, ...(ngDevMode ? [{ debugName: "normalizedItems" }] : /* istanbul ignore next */ []));
414
+ const fallbackState = computed(() => ({
415
+ id: normalizedNavId(),
416
+ orientation: inputs.orientation(),
417
+ appearance: fallbackAppearance(inputs.orientation(), inputs.appearance()),
418
+ position: inputs.position() ?? 'left',
419
+ collapsed: collapsedPreference() ?? false,
420
+ dockbarMode: inputs.dockbarMode() ?? 'sticky',
421
+ }), ...(ngDevMode ? [{ debugName: "fallbackState" }] : /* istanbul ignore next */ []));
422
+ const resolvedState = computed(() => nav.currentState(normalizedNavId()) ?? registeredState() ?? fallbackState(), ...(ngDevMode ? [{ debugName: "resolvedState" }] : /* istanbul ignore next */ []));
423
+ const activeIdSet = computed(() => {
424
+ const ids = inputs.activeIds();
425
+ if (!ids) {
426
+ return new Set();
427
+ }
428
+ return ids instanceof Set ? new Set(ids) : new Set(ids);
429
+ }, ...(ngDevMode ? [{ debugName: "activeIdSet" }] : /* istanbul ignore next */ []));
430
+ effect(() => {
431
+ const nextState = nav.register({
432
+ id: normalizedNavId(),
433
+ orientation: inputs.orientation(),
434
+ appearance: inputs.appearance(),
435
+ position: inputs.position(),
436
+ collapsed: collapsedPreference(),
437
+ dockbarMode: inputs.dockbarMode(),
438
+ });
439
+ if (previousRegisteredId && previousRegisteredId !== nextState.id) {
440
+ nav.unregister(previousRegisteredId);
441
+ }
442
+ previousRegisteredId = nextState.id;
443
+ registeredState.set(nextState);
444
+ });
445
+ destroyRef.onDestroy(() => {
446
+ if (previousRegisteredId) {
447
+ nav.unregister(previousRegisteredId);
448
+ }
449
+ });
450
+ return {
451
+ normalizedNavId,
452
+ normalizedItems,
453
+ resolvedState,
454
+ activeIdSet,
455
+ toggleCollapsed: () => nav.toggleCollapsed(normalizedNavId()),
456
+ };
457
+ }
458
+ function normalizeId(value) {
459
+ return value.trim() || 'default';
460
+ }
461
+ function fallbackAppearance(orientation, appearance) {
462
+ if (orientation === 'vertical' && (appearance === 'sidebar' || appearance === 'dockbar')) {
463
+ return appearance;
464
+ }
465
+ if (orientation === 'horizontal' && (appearance === 'navbar' || appearance === 'flyout')) {
466
+ return appearance;
467
+ }
468
+ return orientation === 'horizontal' ? 'navbar' : 'sidebar';
469
+ }
470
+
471
+ class NavItemContentComponent {
472
+ nav = inject(NavService);
473
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
474
+ active = input(false, ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
475
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
476
+ orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
477
+ level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
478
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
479
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
480
+ iconSlotClasses = computed(() => cn('relative z-10 inline-flex shrink-0 items-center justify-center transition-[border-color,background-color,color,box-shadow] duration-200', this.orientation() === 'vertical'
481
+ ? this.compact()
482
+ ? 'h-8 w-8 rounded-full border'
483
+ : 'h-7 w-7 rounded-full border'
484
+ : 'h-5 w-5 rounded-full border border-transparent', this.usesStraightVerticalSurface() && 'overflow-hidden bg-background/85 backdrop-blur-sm border-transparent', this.active() && !this.usesStraightVerticalSurface() ? 'border-primary text-current' : 'border-transparent', this.active() && this.usesStraightVerticalSurface() && 'text-current', this.compact() && 'mx-auto'), ...(ngDevMode ? [{ debugName: "iconSlotClasses" }] : /* istanbul ignore next */ []));
485
+ titleClasses = computed(() => cn('block truncate', this.active() && 'font-semibold text-foreground', this.item().classes?.title), ...(ngDevMode ? [{ debugName: "titleClasses" }] : /* istanbul ignore next */ []));
486
+ showSubtitle = computed(() => !!this.item().subtitle && !(this.orientation() === 'horizontal' && this.level() === 0), ...(ngDevMode ? [{ debugName: "showSubtitle" }] : /* istanbul ignore next */ []));
487
+ subtitleClasses = computed(() => cn('block truncate text-xs font-normal text-muted-foreground', this.item().classes?.subtitle), ...(ngDevMode ? [{ debugName: "subtitleClasses" }] : /* istanbul ignore next */ []));
488
+ compactFallbackClasses = computed(() => cn('inline-flex h-5 min-w-5 items-center justify-center text-xs font-semibold uppercase'), ...(ngDevMode ? [{ debugName: "compactFallbackClasses" }] : /* istanbul ignore next */ []));
489
+ defaultBadgeClasses = computed(() => cn('ml-auto inline-flex h-5 shrink-0 items-center rounded-full px-2 text-xs font-medium', this.active() ? 'bg-background text-foreground' : 'bg-muted text-muted-foreground'), ...(ngDevMode ? [{ debugName: "defaultBadgeClasses" }] : /* istanbul ignore next */ []));
490
+ defaultIconClasses = computed(() => cn('inline-flex h-4 w-4 shrink-0 rounded-full border', this.usesStraightVerticalSurface()
491
+ ? 'border-transparent bg-transparent'
492
+ : this.active()
493
+ ? 'border-primary'
494
+ : 'border-border bg-muted', this.item().classes?.icon), ...(ngDevMode ? [{ debugName: "defaultIconClasses" }] : /* istanbul ignore next */ []));
495
+ iconContext = computed(() => this.nav.iconContext(this.item(), this.active(), this.level(), this.orientation()), ...(ngDevMode ? [{ debugName: "iconContext" }] : /* istanbul ignore next */ []));
496
+ compactFallback() {
497
+ return this.nav.compactFallback(this.item());
498
+ }
499
+ usesStraightVerticalSurface() {
500
+ return this.orientation() === 'vertical' && !this.compact() && this.collapseTree() === 'straight';
501
+ }
502
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavItemContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
503
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: NavItemContentComponent, isStandalone: true, selector: "ui-nav-item-content", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
504
+ @if (item().icon) {
505
+ <span data-ui-nav-icon-slot="true" [class]="iconSlotClasses()">
506
+ @if (iconTemplate(); as customIcon) {
507
+ <ng-container [ngTemplateOutlet]="customIcon.template" [ngTemplateOutletContext]="iconContext()" />
508
+ } @else {
509
+ <span aria-hidden="true" [class]="defaultIconClasses()" [attr.data-icon]="item().icon"></span>
510
+ }
511
+ </span>
512
+ }
513
+
514
+ @if (!compact()) {
515
+ <span class="min-w-0 flex-1">
516
+ <span [class]="titleClasses()">{{ item().title }}</span>
517
+ @if (showSubtitle()) {
518
+ <span [class]="subtitleClasses()">{{ item().subtitle }}</span>
519
+ }
520
+ </span>
521
+
522
+ @if (item().badge; as badge) {
523
+ <span [class]="badge.classes ?? defaultBadgeClasses()">{{ badge.title }}</span>
524
+ }
525
+ }
526
+
527
+ @if (compact() && !item().icon) {
528
+ <span aria-hidden="true" [class]="compactFallbackClasses()">{{ compactFallback() }}</span>
529
+ }
530
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
531
+ }
532
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavItemContentComponent, decorators: [{
533
+ type: Component,
534
+ args: [{
535
+ selector: 'ui-nav-item-content',
536
+ changeDetection: ChangeDetectionStrategy.OnPush,
537
+ imports: [NgTemplateOutlet],
538
+ host: {
539
+ class: 'contents',
540
+ },
541
+ template: `
542
+ @if (item().icon) {
543
+ <span data-ui-nav-icon-slot="true" [class]="iconSlotClasses()">
544
+ @if (iconTemplate(); as customIcon) {
545
+ <ng-container [ngTemplateOutlet]="customIcon.template" [ngTemplateOutletContext]="iconContext()" />
546
+ } @else {
547
+ <span aria-hidden="true" [class]="defaultIconClasses()" [attr.data-icon]="item().icon"></span>
548
+ }
549
+ </span>
550
+ }
551
+
552
+ @if (!compact()) {
553
+ <span class="min-w-0 flex-1">
554
+ <span [class]="titleClasses()">{{ item().title }}</span>
555
+ @if (showSubtitle()) {
556
+ <span [class]="subtitleClasses()">{{ item().subtitle }}</span>
557
+ }
558
+ </span>
559
+
560
+ @if (item().badge; as badge) {
561
+ <span [class]="badge.classes ?? defaultBadgeClasses()">{{ badge.title }}</span>
562
+ }
563
+ }
564
+
565
+ @if (compact() && !item().icon) {
566
+ <span aria-hidden="true" [class]="compactFallbackClasses()">{{ compactFallback() }}</span>
567
+ }
568
+ `,
569
+ }]
570
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }] } });
571
+
572
+ class NavItemComponent {
573
+ nav = inject(NavService);
574
+ navId = input('default', ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
575
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
576
+ level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
577
+ orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
578
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
579
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
580
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
581
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
582
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
583
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
584
+ straightRail = input(false, ...(ngDevMode ? [{ debugName: "straightRail" }] : /* istanbul ignore next */ []));
585
+ straightRailActive = input(false, ...(ngDevMode ? [{ debugName: "straightRailActive" }] : /* istanbul ignore next */ []));
586
+ firstInBranch = input(false, ...(ngDevMode ? [{ debugName: "firstInBranch" }] : /* istanbul ignore next */ []));
587
+ lastInBranch = input(false, ...(ngDevMode ? [{ debugName: "lastInBranch" }] : /* istanbul ignore next */ []));
588
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
589
+ openedIdsChange = output();
590
+ itemSelected = output();
591
+ openedIdSet = computed(() => new Set(this.openedIds()), ...(ngDevMode ? [{ debugName: "openedIdSet" }] : /* istanbul ignore next */ []));
592
+ isHorizontalRoot = computed(() => this.orientation() === 'horizontal' && this.level() === 0, ...(ngDevMode ? [{ debugName: "isHorizontalRoot" }] : /* istanbul ignore next */ []));
593
+ isActive = computed(() => this.nav.isItemActive(this.item(), this.activeIds(), this.activeUrl()), ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
594
+ showChildren = computed(() => !this.compact() && this.isOpen(), ...(ngDevMode ? [{ debugName: "showChildren" }] : /* istanbul ignore next */ []));
595
+ hostClasses = computed(() => {
596
+ if (this.item().type === 'divider') {
597
+ return this.dividerClasses();
598
+ }
599
+ if (this.item().type === 'spacer') {
600
+ return 'flex-1';
601
+ }
602
+ if (this.item().type === 'group' || this.item().type === 'mega') {
603
+ return this.groupContainerClasses();
604
+ }
605
+ return this.itemContainerClasses();
606
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
607
+ hostRole = computed(() => {
608
+ if (this.item().type === 'divider') {
609
+ return 'separator';
610
+ }
611
+ return this.orientation() === 'horizontal' ? 'none' : null;
612
+ }, ...(ngDevMode ? [{ debugName: "hostRole" }] : /* istanbul ignore next */ []));
613
+ headingId = computed(() => `${this.item().panelId}-heading`, ...(ngDevMode ? [{ debugName: "headingId" }] : /* istanbul ignore next */ []));
614
+ isRouterItem() {
615
+ return this.nav.isRouterItem(this.item());
616
+ }
617
+ hrefFor() {
618
+ return this.nav.hrefFor(this.item());
619
+ }
620
+ relFor() {
621
+ return this.nav.relFor(this.item());
622
+ }
623
+ routerLinkActiveOptions() {
624
+ return this.nav.routerLinkActiveOptions(this.item());
625
+ }
626
+ itemRole() {
627
+ return this.nav.itemRole(this.orientation(), this.level());
628
+ }
629
+ compactLabel() {
630
+ return this.nav.compactLabel(this.item(), this.compact());
631
+ }
632
+ titleFor() {
633
+ return this.nav.titleFor(this.item(), this.compact());
634
+ }
635
+ isOpen() {
636
+ return this.openedIdSet().has(this.item().stateId) || this.openedIdSet().has(this.item().key) || this.isActive();
637
+ }
638
+ toggleOpen() {
639
+ if (this.item().disabled) {
640
+ return;
641
+ }
642
+ const next = new Set(this.openedIds());
643
+ if (next.has(this.item().stateId)) {
644
+ next.delete(this.item().stateId);
645
+ }
646
+ else {
647
+ next.add(this.item().stateId);
648
+ }
649
+ this.openedIdsChange.emit([...next]);
650
+ }
651
+ selectItem(event) {
652
+ if (this.item().disabled) {
653
+ event.preventDefault();
654
+ event.stopPropagation();
655
+ return;
656
+ }
657
+ this.item().action?.(this.item().source);
658
+ this.itemSelected.emit({
659
+ item: this.item().source,
660
+ key: this.item().key,
661
+ type: this.item().type,
662
+ link: this.item().link,
663
+ external: !!this.hrefFor(),
664
+ });
665
+ this.nav.closePanel(this.navId());
666
+ this.nav.closeDrawer(this.navId());
667
+ }
668
+ leafClasses(active) {
669
+ return cn('ui-nav-item group/nav inline-flex min-w-0 items-center rounded-md text-sm font-medium transition-colors', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', this.orientation() === 'horizontal' && this.level() === 0 ? 'h-9 px-3 py-2' : 'w-full px-3 py-1.5 text-left', this.orientation() === 'horizontal' && this.level() === 0 ? 'gap-3' : 'gap-1.5', this.compact() && 'h-10 w-10 justify-center gap-0 px-0 text-center', this.interactiveStateClasses(active), this.item().disabled && 'pointer-events-none opacity-50', this.item().classes?.wrapper, this.itemClass());
670
+ }
671
+ triggerClasses(active) {
672
+ return cn('ui-nav-trigger group/nav inline-flex min-w-0 items-center rounded-md text-sm font-medium transition-colors', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', this.orientation() === 'horizontal' && this.level() === 0 ? 'h-9 px-3 py-2' : 'w-full px-3 py-1.5 text-left', this.orientation() === 'horizontal' && this.level() === 0 ? 'gap-3' : 'gap-1.5', this.compact() && 'h-10 w-10 justify-center gap-0 px-0 text-center', this.interactiveStateClasses(active), this.item().classes?.wrapper, this.itemClass());
673
+ }
674
+ interactiveStateClasses(active) {
675
+ const showsNestedActiveConnector = active &&
676
+ this.orientation() === 'vertical' &&
677
+ !this.compact() &&
678
+ this.level() > 1 &&
679
+ this.collapseTree() === 'stairs';
680
+ if (this.orientation() === 'vertical' && !this.compact()) {
681
+ return cn('relative isolate', "before:pointer-events-none before:absolute before:inset-y-0 before:left-2 before:right-2 before:-z-10 before:rounded-md before:border before:border-transparent before:bg-transparent before:transition-colors before:duration-200 before:content-['']", showsNestedActiveConnector &&
682
+ "after:pointer-events-none after:absolute after:-left-2 after:top-1/2 after:-z-10 after:h-px after:w-5 after:-translate-y-1/2 after:rounded-full after:bg-current/25 after:content-['']", active
683
+ ? 'font-semibold text-foreground hover:before:border-primary'
684
+ : 'text-foreground/80 hover:text-accent-foreground hover:before:border-primary hover:before:bg-accent');
685
+ }
686
+ return active ? 'font-semibold text-foreground' : 'text-foreground/80 hover:bg-accent hover:text-accent-foreground';
687
+ }
688
+ chevronClasses() {
689
+ return cn('ml-auto shrink-0 text-base leading-none transition-transform', this.isOpen() && 'rotate-90');
690
+ }
691
+ itemContainerClasses() {
692
+ return cn(this.orientation() === 'horizontal' && this.level() === 0 ? 'relative' : 'w-full', this.compact() && 'flex justify-center', this.straightRailClasses());
693
+ }
694
+ groupContainerClasses() {
695
+ return cn('w-full', this.level() > 0 && 'pt-2');
696
+ }
697
+ dividerClasses() {
698
+ return cn(this.orientation() === 'horizontal' && this.level() === 0 ? 'mx-1 h-5 w-px' : 'my-2 w-full px-2');
699
+ }
700
+ groupHeadingClasses() {
701
+ return cn('px-3 py-2 text-xs font-medium uppercase tracking-wide text-muted-foreground', this.item().classes?.title);
702
+ }
703
+ childListClasses() {
704
+ const isGroupedBranch = this.item().type === 'group' || this.item().type === 'mega';
705
+ const usesStairsTree = this.collapseTree() === 'stairs';
706
+ return cn('flex list-none flex-col gap-0.5 p-0', !this.compact() && 'mt-0.5', this.level() >= 0 &&
707
+ !this.compact() &&
708
+ !isGroupedBranch &&
709
+ usesStairsTree &&
710
+ cn("relative ml-[1.625rem] pl-2 before:absolute before:-top-2 before:bottom-0 before:left-0 before:w-px before:-translate-x-1/2 before:rounded-full before:content-['']", this.isActive() ? 'before:bg-current/25' : 'before:bg-border'));
711
+ }
712
+ showStraightRailForChildren() {
713
+ return (!this.compact() &&
714
+ this.collapseTree() === 'straight' &&
715
+ this.item().type !== 'group' &&
716
+ this.item().type !== 'mega');
717
+ }
718
+ straightRailClasses() {
719
+ if (!this.straightRail() || this.orientation() !== 'vertical' || this.compact()) {
720
+ return '';
721
+ }
722
+ return cn('relative', "before:pointer-events-none before:absolute before:left-[1.625rem] before:w-0 before:-z-10 before:border-l before:border-dotted before:content-['']", this.straightRailActive() ? 'before:border-primary/50' : 'before:border-border/50', this.firstInBranch() ? 'before:-top-9' : 'before:-top-0.5', this.lastInBranch() ? 'before:bottom-[calc(100%-1.25rem)]' : 'before:-bottom-0.5');
723
+ }
724
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
725
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: NavItemComponent, isStandalone: true, selector: "li[ui-nav-item]", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, straightRail: { classPropertyName: "straightRail", publicName: "straightRail", isSignal: true, isRequired: false, transformFunction: null }, straightRailActive: { classPropertyName: "straightRailActive", publicName: "straightRailActive", isSignal: true, isRequired: false, transformFunction: null }, firstInBranch: { classPropertyName: "firstInBranch", publicName: "firstInBranch", isSignal: true, isRequired: false, transformFunction: null }, lastInBranch: { classPropertyName: "lastInBranch", publicName: "lastInBranch", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { properties: { "class": "hostClasses()", "attr.role": "hostRole()", "attr.data-ui-nav-item-key": "item().key", "attr.aria-hidden": "item().type === \"spacer\" ? \"true\" : null" } }, ngImport: i0, template: `
726
+ @switch (item().type) {
727
+ @case ('divider') {
728
+ <span class="block h-px w-full bg-border"></span>
729
+ }
730
+
731
+ @case ('spacer') {}
732
+
733
+ @case ('group') {
734
+ @if (!compact() && item().title) {
735
+ <div [id]="headingId()" [class]="groupHeadingClasses()">{{ item().title }}</div>
736
+ }
737
+
738
+ <ul [class]="childListClasses()" role="group" [attr.aria-labelledby]="item().title ? headingId() : null">
739
+ @for (child of item().children; track child.key; let isFirst = $first; let isLast = $last) {
740
+ <li
741
+ ui-nav-item
742
+ [navId]="navId()"
743
+ [item]="child"
744
+ [level]="level() + 1"
745
+ [orientation]="orientation()"
746
+ [compact]="compact()"
747
+ [itemClass]="itemClass()"
748
+ [activeIds]="activeIds()"
749
+ [activeUrl]="activeUrl()"
750
+ [iconTemplate]="iconTemplate()"
751
+ [collapseTree]="collapseTree()"
752
+ [straightRail]="showStraightRailForChildren()"
753
+ [straightRailActive]="isActive()"
754
+ [firstInBranch]="isFirst"
755
+ [lastInBranch]="isLast"
756
+ [openedIds]="openedIds()"
757
+ (openedIdsChange)="openedIdsChange.emit($event)"
758
+ (itemSelected)="itemSelected.emit($event)"></li>
759
+ }
760
+ </ul>
761
+ }
762
+
763
+ @case ('collapsible') {
764
+ <button
765
+ type="button"
766
+ [class]="triggerClasses(isActive())"
767
+ [attr.aria-expanded]="isOpen()"
768
+ [attr.aria-controls]="item().panelId"
769
+ [attr.aria-label]="compactLabel()"
770
+ [attr.title]="titleFor()"
771
+ [disabled]="item().disabled || null"
772
+ (click)="toggleOpen()">
773
+ <ui-nav-item-content
774
+ [item]="item()"
775
+ [active]="isActive()"
776
+ [compact]="compact()"
777
+ [orientation]="orientation()"
778
+ [level]="level()"
779
+ [collapseTree]="collapseTree()"
780
+ [iconTemplate]="iconTemplate()" />
781
+
782
+ @if (!compact()) {
783
+ <span aria-hidden="true" [class]="chevronClasses()">›</span>
784
+ }
785
+ </button>
786
+
787
+ @if (showChildren()) {
788
+ <ul [id]="item().panelId" [class]="childListClasses()" role="group">
789
+ @for (child of item().children; track child.key; let isFirst = $first; let isLast = $last) {
790
+ <li
791
+ ui-nav-item
792
+ [navId]="navId()"
793
+ [item]="child"
794
+ [level]="level() + 1"
795
+ [orientation]="orientation()"
796
+ [compact]="false"
797
+ [itemClass]="itemClass()"
798
+ [activeIds]="activeIds()"
799
+ [activeUrl]="activeUrl()"
800
+ [iconTemplate]="iconTemplate()"
801
+ [collapseTree]="collapseTree()"
802
+ [straightRail]="showStraightRailForChildren()"
803
+ [straightRailActive]="isActive()"
804
+ [firstInBranch]="isFirst"
805
+ [lastInBranch]="isLast"
806
+ [openedIds]="openedIds()"
807
+ (openedIdsChange)="openedIdsChange.emit($event)"
808
+ (itemSelected)="itemSelected.emit($event)"></li>
809
+ }
810
+ </ul>
811
+ }
812
+ }
813
+
814
+ @case ('mega') {
815
+ @if (!compact() && item().title) {
816
+ <div [id]="headingId()" [class]="groupHeadingClasses()">{{ item().title }}</div>
817
+ }
818
+
819
+ <ul [class]="childListClasses()" role="group" [attr.aria-labelledby]="item().title ? headingId() : null">
820
+ @for (child of item().children; track child.key; let isFirst = $first; let isLast = $last) {
821
+ <li
822
+ ui-nav-item
823
+ [navId]="navId()"
824
+ [item]="child"
825
+ [level]="level() + 1"
826
+ [orientation]="orientation()"
827
+ [compact]="compact()"
828
+ [itemClass]="itemClass()"
829
+ [activeIds]="activeIds()"
830
+ [activeUrl]="activeUrl()"
831
+ [iconTemplate]="iconTemplate()"
832
+ [collapseTree]="collapseTree()"
833
+ [straightRail]="showStraightRailForChildren()"
834
+ [straightRailActive]="isActive()"
835
+ [firstInBranch]="isFirst"
836
+ [lastInBranch]="isLast"
837
+ [openedIds]="openedIds()"
838
+ (openedIdsChange)="openedIdsChange.emit($event)"
839
+ (itemSelected)="itemSelected.emit($event)"></li>
840
+ }
841
+ </ul>
842
+ }
843
+
844
+ @default {
845
+ @if (isRouterItem()) {
846
+ <a
847
+ [class]="leafClasses(routerActive.isActive || isActive())"
848
+ [routerLink]="item().link ?? null"
849
+ [queryParams]="item().queryParams ?? null"
850
+ [queryParamsHandling]="item().queryParamsHandling ?? null"
851
+ [fragment]="item().fragment ?? undefined"
852
+ [preserveFragment]="item().preserveFragment ?? false"
853
+ [target]="item().target ?? undefined"
854
+ routerLinkActive
855
+ #routerActive="routerLinkActive"
856
+ [routerLinkActiveOptions]="routerLinkActiveOptions()"
857
+ [attr.aria-current]="routerActive.isActive || isActive() ? 'page' : null"
858
+ [attr.aria-disabled]="item().disabled || null"
859
+ [attr.aria-label]="compactLabel()"
860
+ [attr.title]="titleFor()"
861
+ [attr.role]="itemRole()"
862
+ [attr.data-ui-nav-root-item]="isHorizontalRoot() ? 'true' : null"
863
+ (click)="selectItem($event)">
864
+ <ui-nav-item-content
865
+ [item]="item()"
866
+ [active]="routerActive.isActive || isActive()"
867
+ [compact]="compact()"
868
+ [orientation]="orientation()"
869
+ [level]="level()"
870
+ [collapseTree]="collapseTree()"
871
+ [iconTemplate]="iconTemplate()" />
872
+ </a>
873
+ } @else if (hrefFor()) {
874
+ <a
875
+ [class]="leafClasses(isActive())"
876
+ [attr.href]="hrefFor()"
877
+ [attr.target]="item().target ?? (item().externalLink ? '_blank' : null)"
878
+ [attr.rel]="relFor()"
879
+ [attr.aria-current]="isActive() ? 'page' : null"
880
+ [attr.aria-disabled]="item().disabled || null"
881
+ [attr.aria-label]="compactLabel()"
882
+ [attr.title]="titleFor()"
883
+ [attr.role]="itemRole()"
884
+ [attr.data-ui-nav-root-item]="isHorizontalRoot() ? 'true' : null"
885
+ (click)="selectItem($event)">
886
+ <ui-nav-item-content
887
+ [item]="item()"
888
+ [active]="isActive()"
889
+ [compact]="compact()"
890
+ [orientation]="orientation()"
891
+ [level]="level()"
892
+ [collapseTree]="collapseTree()"
893
+ [iconTemplate]="iconTemplate()" />
894
+ </a>
895
+ } @else {
896
+ <button
897
+ type="button"
898
+ [class]="leafClasses(isActive())"
899
+ [disabled]="item().disabled || null"
900
+ [attr.aria-current]="isActive() ? 'page' : null"
901
+ [attr.aria-label]="compactLabel()"
902
+ [attr.title]="titleFor()"
903
+ [attr.role]="itemRole()"
904
+ [attr.data-ui-nav-root-item]="isHorizontalRoot() ? 'true' : null"
905
+ (click)="selectItem($event)">
906
+ <ui-nav-item-content
907
+ [item]="item()"
908
+ [active]="isActive()"
909
+ [compact]="compact()"
910
+ [orientation]="orientation()"
911
+ [level]="level()"
912
+ [collapseTree]="collapseTree()"
913
+ [iconTemplate]="iconTemplate()" />
914
+ </button>
915
+ }
916
+ }
917
+ }
918
+ `, isInline: true, dependencies: [{ kind: "component", type: NavItemComponent, selector: "li[ui-nav-item]", inputs: ["navId", "item", "level", "orientation", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "straightRail", "straightRailActive", "firstInBranch", "lastInBranch", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: NavItemContentComponent, selector: "ui-nav-item-content", inputs: ["item", "active", "compact", "orientation", "level", "collapseTree", "iconTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
919
+ }
920
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavItemComponent, decorators: [{
921
+ type: Component,
922
+ args: [{
923
+ selector: 'li[ui-nav-item]',
924
+ changeDetection: ChangeDetectionStrategy.OnPush,
925
+ imports: [RouterLink, RouterLinkActive, NavItemContentComponent],
926
+ host: {
927
+ '[class]': 'hostClasses()',
928
+ '[attr.role]': 'hostRole()',
929
+ '[attr.data-ui-nav-item-key]': 'item().key',
930
+ '[attr.aria-hidden]': 'item().type === "spacer" ? "true" : null',
931
+ },
932
+ template: `
933
+ @switch (item().type) {
934
+ @case ('divider') {
935
+ <span class="block h-px w-full bg-border"></span>
936
+ }
937
+
938
+ @case ('spacer') {}
939
+
940
+ @case ('group') {
941
+ @if (!compact() && item().title) {
942
+ <div [id]="headingId()" [class]="groupHeadingClasses()">{{ item().title }}</div>
943
+ }
944
+
945
+ <ul [class]="childListClasses()" role="group" [attr.aria-labelledby]="item().title ? headingId() : null">
946
+ @for (child of item().children; track child.key; let isFirst = $first; let isLast = $last) {
947
+ <li
948
+ ui-nav-item
949
+ [navId]="navId()"
950
+ [item]="child"
951
+ [level]="level() + 1"
952
+ [orientation]="orientation()"
953
+ [compact]="compact()"
954
+ [itemClass]="itemClass()"
955
+ [activeIds]="activeIds()"
956
+ [activeUrl]="activeUrl()"
957
+ [iconTemplate]="iconTemplate()"
958
+ [collapseTree]="collapseTree()"
959
+ [straightRail]="showStraightRailForChildren()"
960
+ [straightRailActive]="isActive()"
961
+ [firstInBranch]="isFirst"
962
+ [lastInBranch]="isLast"
963
+ [openedIds]="openedIds()"
964
+ (openedIdsChange)="openedIdsChange.emit($event)"
965
+ (itemSelected)="itemSelected.emit($event)"></li>
966
+ }
967
+ </ul>
968
+ }
969
+
970
+ @case ('collapsible') {
971
+ <button
972
+ type="button"
973
+ [class]="triggerClasses(isActive())"
974
+ [attr.aria-expanded]="isOpen()"
975
+ [attr.aria-controls]="item().panelId"
976
+ [attr.aria-label]="compactLabel()"
977
+ [attr.title]="titleFor()"
978
+ [disabled]="item().disabled || null"
979
+ (click)="toggleOpen()">
980
+ <ui-nav-item-content
981
+ [item]="item()"
982
+ [active]="isActive()"
983
+ [compact]="compact()"
984
+ [orientation]="orientation()"
985
+ [level]="level()"
986
+ [collapseTree]="collapseTree()"
987
+ [iconTemplate]="iconTemplate()" />
988
+
989
+ @if (!compact()) {
990
+ <span aria-hidden="true" [class]="chevronClasses()">›</span>
991
+ }
992
+ </button>
993
+
994
+ @if (showChildren()) {
995
+ <ul [id]="item().panelId" [class]="childListClasses()" role="group">
996
+ @for (child of item().children; track child.key; let isFirst = $first; let isLast = $last) {
997
+ <li
998
+ ui-nav-item
999
+ [navId]="navId()"
1000
+ [item]="child"
1001
+ [level]="level() + 1"
1002
+ [orientation]="orientation()"
1003
+ [compact]="false"
1004
+ [itemClass]="itemClass()"
1005
+ [activeIds]="activeIds()"
1006
+ [activeUrl]="activeUrl()"
1007
+ [iconTemplate]="iconTemplate()"
1008
+ [collapseTree]="collapseTree()"
1009
+ [straightRail]="showStraightRailForChildren()"
1010
+ [straightRailActive]="isActive()"
1011
+ [firstInBranch]="isFirst"
1012
+ [lastInBranch]="isLast"
1013
+ [openedIds]="openedIds()"
1014
+ (openedIdsChange)="openedIdsChange.emit($event)"
1015
+ (itemSelected)="itemSelected.emit($event)"></li>
1016
+ }
1017
+ </ul>
1018
+ }
1019
+ }
1020
+
1021
+ @case ('mega') {
1022
+ @if (!compact() && item().title) {
1023
+ <div [id]="headingId()" [class]="groupHeadingClasses()">{{ item().title }}</div>
1024
+ }
1025
+
1026
+ <ul [class]="childListClasses()" role="group" [attr.aria-labelledby]="item().title ? headingId() : null">
1027
+ @for (child of item().children; track child.key; let isFirst = $first; let isLast = $last) {
1028
+ <li
1029
+ ui-nav-item
1030
+ [navId]="navId()"
1031
+ [item]="child"
1032
+ [level]="level() + 1"
1033
+ [orientation]="orientation()"
1034
+ [compact]="compact()"
1035
+ [itemClass]="itemClass()"
1036
+ [activeIds]="activeIds()"
1037
+ [activeUrl]="activeUrl()"
1038
+ [iconTemplate]="iconTemplate()"
1039
+ [collapseTree]="collapseTree()"
1040
+ [straightRail]="showStraightRailForChildren()"
1041
+ [straightRailActive]="isActive()"
1042
+ [firstInBranch]="isFirst"
1043
+ [lastInBranch]="isLast"
1044
+ [openedIds]="openedIds()"
1045
+ (openedIdsChange)="openedIdsChange.emit($event)"
1046
+ (itemSelected)="itemSelected.emit($event)"></li>
1047
+ }
1048
+ </ul>
1049
+ }
1050
+
1051
+ @default {
1052
+ @if (isRouterItem()) {
1053
+ <a
1054
+ [class]="leafClasses(routerActive.isActive || isActive())"
1055
+ [routerLink]="item().link ?? null"
1056
+ [queryParams]="item().queryParams ?? null"
1057
+ [queryParamsHandling]="item().queryParamsHandling ?? null"
1058
+ [fragment]="item().fragment ?? undefined"
1059
+ [preserveFragment]="item().preserveFragment ?? false"
1060
+ [target]="item().target ?? undefined"
1061
+ routerLinkActive
1062
+ #routerActive="routerLinkActive"
1063
+ [routerLinkActiveOptions]="routerLinkActiveOptions()"
1064
+ [attr.aria-current]="routerActive.isActive || isActive() ? 'page' : null"
1065
+ [attr.aria-disabled]="item().disabled || null"
1066
+ [attr.aria-label]="compactLabel()"
1067
+ [attr.title]="titleFor()"
1068
+ [attr.role]="itemRole()"
1069
+ [attr.data-ui-nav-root-item]="isHorizontalRoot() ? 'true' : null"
1070
+ (click)="selectItem($event)">
1071
+ <ui-nav-item-content
1072
+ [item]="item()"
1073
+ [active]="routerActive.isActive || isActive()"
1074
+ [compact]="compact()"
1075
+ [orientation]="orientation()"
1076
+ [level]="level()"
1077
+ [collapseTree]="collapseTree()"
1078
+ [iconTemplate]="iconTemplate()" />
1079
+ </a>
1080
+ } @else if (hrefFor()) {
1081
+ <a
1082
+ [class]="leafClasses(isActive())"
1083
+ [attr.href]="hrefFor()"
1084
+ [attr.target]="item().target ?? (item().externalLink ? '_blank' : null)"
1085
+ [attr.rel]="relFor()"
1086
+ [attr.aria-current]="isActive() ? 'page' : null"
1087
+ [attr.aria-disabled]="item().disabled || null"
1088
+ [attr.aria-label]="compactLabel()"
1089
+ [attr.title]="titleFor()"
1090
+ [attr.role]="itemRole()"
1091
+ [attr.data-ui-nav-root-item]="isHorizontalRoot() ? 'true' : null"
1092
+ (click)="selectItem($event)">
1093
+ <ui-nav-item-content
1094
+ [item]="item()"
1095
+ [active]="isActive()"
1096
+ [compact]="compact()"
1097
+ [orientation]="orientation()"
1098
+ [level]="level()"
1099
+ [collapseTree]="collapseTree()"
1100
+ [iconTemplate]="iconTemplate()" />
1101
+ </a>
1102
+ } @else {
1103
+ <button
1104
+ type="button"
1105
+ [class]="leafClasses(isActive())"
1106
+ [disabled]="item().disabled || null"
1107
+ [attr.aria-current]="isActive() ? 'page' : null"
1108
+ [attr.aria-label]="compactLabel()"
1109
+ [attr.title]="titleFor()"
1110
+ [attr.role]="itemRole()"
1111
+ [attr.data-ui-nav-root-item]="isHorizontalRoot() ? 'true' : null"
1112
+ (click)="selectItem($event)">
1113
+ <ui-nav-item-content
1114
+ [item]="item()"
1115
+ [active]="isActive()"
1116
+ [compact]="compact()"
1117
+ [orientation]="orientation()"
1118
+ [level]="level()"
1119
+ [collapseTree]="collapseTree()"
1120
+ [iconTemplate]="iconTemplate()" />
1121
+ </button>
1122
+ }
1123
+ }
1124
+ }
1125
+ `,
1126
+ }]
1127
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], straightRail: [{ type: i0.Input, args: [{ isSignal: true, alias: "straightRail", required: false }] }], straightRailActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "straightRailActive", required: false }] }], firstInBranch: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstInBranch", required: false }] }], lastInBranch: [{ type: i0.Input, args: [{ isSignal: true, alias: "lastInBranch", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1128
+
1129
+ class NavHorizontalComponent {
1130
+ nav = inject(NavService);
1131
+ host = inject(ElementRef);
1132
+ navId = input('default', ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
1133
+ appearance = input('navbar', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
1134
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1135
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
1136
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
1137
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
1138
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
1139
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
1140
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
1141
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
1142
+ openedIdsChange = output();
1143
+ itemSelected = output();
1144
+ listClasses = computed(() => cn('flex min-w-0 list-none p-0', this.appearance() === 'flyout'
1145
+ ? 'items-center gap-2'
1146
+ : this.compact()
1147
+ ? 'justify-center gap-1'
1148
+ : 'items-center justify-center gap-1'), ...(ngDevMode ? [{ debugName: "listClasses" }] : /* istanbul ignore next */ []));
1149
+ isItemActive(item) {
1150
+ return this.nav.isItemActive(item, this.activeIds(), this.activeUrl());
1151
+ }
1152
+ isPanelOpen(item) {
1153
+ return this.nav.isPanelOpen(this.navId(), item);
1154
+ }
1155
+ openPanel(item) {
1156
+ this.nav.openPanel(this.navId(), item);
1157
+ }
1158
+ togglePanel(item) {
1159
+ this.nav.togglePanel(this.navId(), item);
1160
+ }
1161
+ compactLabel(item) {
1162
+ return this.nav.compactLabel(item, this.compact());
1163
+ }
1164
+ titleFor(item) {
1165
+ return this.nav.titleFor(item, this.compact());
1166
+ }
1167
+ triggerClasses(item) {
1168
+ return cn('ui-nav-trigger group/nav inline-flex min-w-0 items-center gap-3 rounded-md text-sm font-medium transition-colors', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', this.appearance() === 'flyout'
1169
+ ? 'h-10 rounded-full border border-border/60 px-4 py-2 shadow-sm'
1170
+ : 'h-9 px-3 py-2', this.compact() && 'w-10 justify-center px-0', this.isItemActive(item)
1171
+ ? 'bg-accent text-accent-foreground'
1172
+ : 'text-foreground/80 hover:bg-accent hover:text-accent-foreground', item.classes?.wrapper, this.itemClass());
1173
+ }
1174
+ chevronClasses(item) {
1175
+ return cn('ml-auto shrink-0 text-base leading-none transition-transform', this.isPanelOpen(item) && 'rotate-180');
1176
+ }
1177
+ panelClasses(item) {
1178
+ return cn(this.appearance() === 'flyout'
1179
+ ? 'absolute left-0 top-[calc(100%+0.75rem)] z-50 rounded-2xl border border-border/70 bg-background/95 p-3 text-foreground shadow-2xl backdrop-blur'
1180
+ : 'absolute left-0 top-full z-50 mt-2 rounded-xl border border-border bg-popover p-2 text-popover-foreground shadow-lg', item.type === 'mega' ? 'w-[min(92vw,44rem)]' : 'min-w-56');
1181
+ }
1182
+ panelListClasses(item) {
1183
+ const columns = Math.min(Math.max(item.columns ?? (item.type === 'mega' ? 2 : 1), 1), 4);
1184
+ return cn('grid list-none gap-1 p-0', columns === 2 && 'md:grid-cols-2', columns === 3 && 'md:grid-cols-3', columns === 4 && 'md:grid-cols-4');
1185
+ }
1186
+ onKeydown(event) {
1187
+ if (event.key === 'Escape') {
1188
+ const panelKey = this.nav.currentPanelKey(this.navId());
1189
+ this.nav.closePanel(this.navId());
1190
+ this.focusOpenPanelTrigger(panelKey);
1191
+ return;
1192
+ }
1193
+ const rootItems = this.rootFocusItems();
1194
+ if (rootItems.length === 0) {
1195
+ return;
1196
+ }
1197
+ const currentIndex = rootItems.indexOf(document.activeElement);
1198
+ if (currentIndex === -1) {
1199
+ return;
1200
+ }
1201
+ if (event.key === 'ArrowDown') {
1202
+ const currentItem = rootItems[currentIndex];
1203
+ if (currentItem.getAttribute('aria-haspopup') === 'menu') {
1204
+ event.preventDefault();
1205
+ currentItem.click();
1206
+ queueMicrotask(() => this.focusFirstPanelItem(this.nav.currentPanelKey(this.navId())));
1207
+ }
1208
+ return;
1209
+ }
1210
+ if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {
1211
+ event.preventDefault();
1212
+ const direction = event.key === 'ArrowRight' ? 1 : -1;
1213
+ const nextIndex = (currentIndex + direction + rootItems.length) % rootItems.length;
1214
+ rootItems[nextIndex]?.focus();
1215
+ }
1216
+ }
1217
+ onPanelKeydown(event) {
1218
+ if (event.key !== 'Escape') {
1219
+ return;
1220
+ }
1221
+ event.preventDefault();
1222
+ const panelKey = this.nav.currentPanelKey(this.navId());
1223
+ this.nav.closePanel(this.navId());
1224
+ this.focusOpenPanelTrigger(panelKey);
1225
+ }
1226
+ rootFocusItems() {
1227
+ return Array.from(this.host.nativeElement.querySelectorAll('[data-ui-nav-root-item="true"]'));
1228
+ }
1229
+ focusOpenPanelTrigger(panelKey) {
1230
+ if (!panelKey) {
1231
+ return;
1232
+ }
1233
+ const trigger = this.host.nativeElement.querySelector(`[data-ui-nav-item-key="${panelKey}"] [data-ui-nav-root-item="true"]`);
1234
+ trigger?.focus();
1235
+ }
1236
+ focusFirstPanelItem(panelKey) {
1237
+ if (!panelKey) {
1238
+ return;
1239
+ }
1240
+ const panel = this.host.nativeElement.querySelector(`[data-ui-nav-panel="${panelKey}"]`);
1241
+ const item = panel?.querySelector('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])');
1242
+ item?.focus();
1243
+ }
1244
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavHorizontalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1245
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: NavHorizontalComponent, isStandalone: true, selector: "ui-nav-horizontal", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { classAttribute: "block w-full" }, ngImport: i0, template: `
1246
+ <ul [class]="listClasses()" role="menubar" (keydown)="onKeydown($event)">
1247
+ @for (item of items(); track item.key) {
1248
+ @switch (item.type) {
1249
+ @case ('group') {
1250
+ <ng-container [ngTemplateOutlet]="branchTemplate" [ngTemplateOutletContext]="{ $implicit: item }" />
1251
+ }
1252
+ @case ('collapsible') {
1253
+ <ng-container [ngTemplateOutlet]="branchTemplate" [ngTemplateOutletContext]="{ $implicit: item }" />
1254
+ }
1255
+ @case ('mega') {
1256
+ <ng-container [ngTemplateOutlet]="branchTemplate" [ngTemplateOutletContext]="{ $implicit: item }" />
1257
+ }
1258
+ @default {
1259
+ <li
1260
+ ui-nav-item
1261
+ [navId]="navId()"
1262
+ [item]="item"
1263
+ [level]="0"
1264
+ [orientation]="'horizontal'"
1265
+ [compact]="compact()"
1266
+ [itemClass]="itemClass()"
1267
+ [activeIds]="activeIds()"
1268
+ [activeUrl]="activeUrl()"
1269
+ [iconTemplate]="iconTemplate()"
1270
+ [collapseTree]="collapseTree()"
1271
+ [openedIds]="openedIds()"
1272
+ (openedIdsChange)="openedIdsChange.emit($event)"
1273
+ (itemSelected)="itemSelected.emit($event)"></li>
1274
+ }
1275
+ }
1276
+ }
1277
+ </ul>
1278
+
1279
+ <ng-template #branchTemplate let-item>
1280
+ <li role="none" class="relative" [attr.data-ui-nav-item-key]="item.key">
1281
+ <button
1282
+ type="button"
1283
+ role="menuitem"
1284
+ data-ui-nav-root-item="true"
1285
+ [class]="triggerClasses(item)"
1286
+ [attr.aria-expanded]="isPanelOpen(item)"
1287
+ [attr.aria-controls]="item.panelId"
1288
+ [attr.aria-haspopup]="'menu'"
1289
+ [attr.aria-label]="compactLabel(item)"
1290
+ [attr.title]="titleFor(item)"
1291
+ [disabled]="item.disabled || null"
1292
+ (click)="togglePanel(item)"
1293
+ (mouseenter)="openPanel(item)">
1294
+ <ui-nav-item-content
1295
+ [item]="item"
1296
+ [active]="isItemActive(item)"
1297
+ [compact]="compact()"
1298
+ [orientation]="'horizontal'"
1299
+ [level]="0"
1300
+ [iconTemplate]="iconTemplate()" />
1301
+ <span aria-hidden="true" [class]="chevronClasses(item)">⌄</span>
1302
+ </button>
1303
+
1304
+ @if (isPanelOpen(item)) {
1305
+ <div
1306
+ [id]="item.panelId"
1307
+ role="menu"
1308
+ [class]="panelClasses(item)"
1309
+ [attr.data-ui-nav-panel]="item.key"
1310
+ (keydown)="onPanelKeydown($event)">
1311
+ <ul [class]="panelListClasses(item)" role="none">
1312
+ @for (child of item.children; track child.key) {
1313
+ <li
1314
+ ui-nav-item
1315
+ [navId]="navId()"
1316
+ [item]="child"
1317
+ [level]="1"
1318
+ [orientation]="'horizontal'"
1319
+ [compact]="false"
1320
+ [itemClass]="itemClass()"
1321
+ [activeIds]="activeIds()"
1322
+ [activeUrl]="activeUrl()"
1323
+ [iconTemplate]="iconTemplate()"
1324
+ [collapseTree]="collapseTree()"
1325
+ [openedIds]="openedIds()"
1326
+ (openedIdsChange)="openedIdsChange.emit($event)"
1327
+ (itemSelected)="itemSelected.emit($event)"></li>
1328
+ }
1329
+ </ul>
1330
+ </div>
1331
+ }
1332
+ </li>
1333
+ </ng-template>
1334
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NavItemComponent, selector: "li[ui-nav-item]", inputs: ["navId", "item", "level", "orientation", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "straightRail", "straightRailActive", "firstInBranch", "lastInBranch", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavItemContentComponent, selector: "ui-nav-item-content", inputs: ["item", "active", "compact", "orientation", "level", "collapseTree", "iconTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1335
+ }
1336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavHorizontalComponent, decorators: [{
1337
+ type: Component,
1338
+ args: [{
1339
+ selector: 'ui-nav-horizontal',
1340
+ changeDetection: ChangeDetectionStrategy.OnPush,
1341
+ imports: [NgTemplateOutlet, NavItemComponent, NavItemContentComponent],
1342
+ host: {
1343
+ class: 'block w-full',
1344
+ },
1345
+ template: `
1346
+ <ul [class]="listClasses()" role="menubar" (keydown)="onKeydown($event)">
1347
+ @for (item of items(); track item.key) {
1348
+ @switch (item.type) {
1349
+ @case ('group') {
1350
+ <ng-container [ngTemplateOutlet]="branchTemplate" [ngTemplateOutletContext]="{ $implicit: item }" />
1351
+ }
1352
+ @case ('collapsible') {
1353
+ <ng-container [ngTemplateOutlet]="branchTemplate" [ngTemplateOutletContext]="{ $implicit: item }" />
1354
+ }
1355
+ @case ('mega') {
1356
+ <ng-container [ngTemplateOutlet]="branchTemplate" [ngTemplateOutletContext]="{ $implicit: item }" />
1357
+ }
1358
+ @default {
1359
+ <li
1360
+ ui-nav-item
1361
+ [navId]="navId()"
1362
+ [item]="item"
1363
+ [level]="0"
1364
+ [orientation]="'horizontal'"
1365
+ [compact]="compact()"
1366
+ [itemClass]="itemClass()"
1367
+ [activeIds]="activeIds()"
1368
+ [activeUrl]="activeUrl()"
1369
+ [iconTemplate]="iconTemplate()"
1370
+ [collapseTree]="collapseTree()"
1371
+ [openedIds]="openedIds()"
1372
+ (openedIdsChange)="openedIdsChange.emit($event)"
1373
+ (itemSelected)="itemSelected.emit($event)"></li>
1374
+ }
1375
+ }
1376
+ }
1377
+ </ul>
1378
+
1379
+ <ng-template #branchTemplate let-item>
1380
+ <li role="none" class="relative" [attr.data-ui-nav-item-key]="item.key">
1381
+ <button
1382
+ type="button"
1383
+ role="menuitem"
1384
+ data-ui-nav-root-item="true"
1385
+ [class]="triggerClasses(item)"
1386
+ [attr.aria-expanded]="isPanelOpen(item)"
1387
+ [attr.aria-controls]="item.panelId"
1388
+ [attr.aria-haspopup]="'menu'"
1389
+ [attr.aria-label]="compactLabel(item)"
1390
+ [attr.title]="titleFor(item)"
1391
+ [disabled]="item.disabled || null"
1392
+ (click)="togglePanel(item)"
1393
+ (mouseenter)="openPanel(item)">
1394
+ <ui-nav-item-content
1395
+ [item]="item"
1396
+ [active]="isItemActive(item)"
1397
+ [compact]="compact()"
1398
+ [orientation]="'horizontal'"
1399
+ [level]="0"
1400
+ [iconTemplate]="iconTemplate()" />
1401
+ <span aria-hidden="true" [class]="chevronClasses(item)">⌄</span>
1402
+ </button>
1403
+
1404
+ @if (isPanelOpen(item)) {
1405
+ <div
1406
+ [id]="item.panelId"
1407
+ role="menu"
1408
+ [class]="panelClasses(item)"
1409
+ [attr.data-ui-nav-panel]="item.key"
1410
+ (keydown)="onPanelKeydown($event)">
1411
+ <ul [class]="panelListClasses(item)" role="none">
1412
+ @for (child of item.children; track child.key) {
1413
+ <li
1414
+ ui-nav-item
1415
+ [navId]="navId()"
1416
+ [item]="child"
1417
+ [level]="1"
1418
+ [orientation]="'horizontal'"
1419
+ [compact]="false"
1420
+ [itemClass]="itemClass()"
1421
+ [activeIds]="activeIds()"
1422
+ [activeUrl]="activeUrl()"
1423
+ [iconTemplate]="iconTemplate()"
1424
+ [collapseTree]="collapseTree()"
1425
+ [openedIds]="openedIds()"
1426
+ (openedIdsChange)="openedIdsChange.emit($event)"
1427
+ (itemSelected)="itemSelected.emit($event)"></li>
1428
+ }
1429
+ </ul>
1430
+ </div>
1431
+ }
1432
+ </li>
1433
+ </ng-template>
1434
+ `,
1435
+ }]
1436
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1437
+
1438
+ class NavFlyoutComponent {
1439
+ navId = input('default', ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
1440
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1441
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
1442
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
1443
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
1444
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
1445
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
1446
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
1447
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
1448
+ openedIdsChange = output();
1449
+ itemSelected = output();
1450
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavFlyoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1451
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: NavFlyoutComponent, isStandalone: true, selector: "ui-nav-flyout", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { classAttribute: "block w-full" }, ngImport: i0, template: `
1452
+ <ui-nav-horizontal
1453
+ [navId]="navId()"
1454
+ [appearance]="'flyout'"
1455
+ [items]="items()"
1456
+ [compact]="compact()"
1457
+ [itemClass]="itemClass()"
1458
+ [activeIds]="activeIds()"
1459
+ [activeUrl]="activeUrl()"
1460
+ [iconTemplate]="iconTemplate()"
1461
+ [collapseTree]="collapseTree()"
1462
+ [openedIds]="openedIds()"
1463
+ (openedIdsChange)="openedIdsChange.emit($event)"
1464
+ (itemSelected)="itemSelected.emit($event)" />
1465
+ `, isInline: true, dependencies: [{ kind: "component", type: NavHorizontalComponent, selector: "ui-nav-horizontal", inputs: ["navId", "appearance", "items", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1466
+ }
1467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavFlyoutComponent, decorators: [{
1468
+ type: Component,
1469
+ args: [{
1470
+ selector: 'ui-nav-flyout',
1471
+ changeDetection: ChangeDetectionStrategy.OnPush,
1472
+ imports: [NavHorizontalComponent],
1473
+ host: {
1474
+ class: 'block w-full',
1475
+ },
1476
+ template: `
1477
+ <ui-nav-horizontal
1478
+ [navId]="navId()"
1479
+ [appearance]="'flyout'"
1480
+ [items]="items()"
1481
+ [compact]="compact()"
1482
+ [itemClass]="itemClass()"
1483
+ [activeIds]="activeIds()"
1484
+ [activeUrl]="activeUrl()"
1485
+ [iconTemplate]="iconTemplate()"
1486
+ [collapseTree]="collapseTree()"
1487
+ [openedIds]="openedIds()"
1488
+ (openedIdsChange)="openedIdsChange.emit($event)"
1489
+ (itemSelected)="itemSelected.emit($event)" />
1490
+ `,
1491
+ }]
1492
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1493
+
1494
+ class NavNavbarComponent {
1495
+ navId = input('default', ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
1496
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1497
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
1498
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
1499
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
1500
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
1501
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
1502
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
1503
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
1504
+ openedIdsChange = output();
1505
+ itemSelected = output();
1506
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavNavbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1507
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: NavNavbarComponent, isStandalone: true, selector: "ui-nav-navbar", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { classAttribute: "block w-full" }, ngImport: i0, template: `
1508
+ <ui-nav-horizontal
1509
+ [navId]="navId()"
1510
+ [appearance]="'navbar'"
1511
+ [items]="items()"
1512
+ [compact]="compact()"
1513
+ [itemClass]="itemClass()"
1514
+ [activeIds]="activeIds()"
1515
+ [activeUrl]="activeUrl()"
1516
+ [iconTemplate]="iconTemplate()"
1517
+ [collapseTree]="collapseTree()"
1518
+ [openedIds]="openedIds()"
1519
+ (openedIdsChange)="openedIdsChange.emit($event)"
1520
+ (itemSelected)="itemSelected.emit($event)" />
1521
+ `, isInline: true, dependencies: [{ kind: "component", type: NavHorizontalComponent, selector: "ui-nav-horizontal", inputs: ["navId", "appearance", "items", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1522
+ }
1523
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavNavbarComponent, decorators: [{
1524
+ type: Component,
1525
+ args: [{
1526
+ selector: 'ui-nav-navbar',
1527
+ changeDetection: ChangeDetectionStrategy.OnPush,
1528
+ imports: [NavHorizontalComponent],
1529
+ host: {
1530
+ class: 'block w-full',
1531
+ },
1532
+ template: `
1533
+ <ui-nav-horizontal
1534
+ [navId]="navId()"
1535
+ [appearance]="'navbar'"
1536
+ [items]="items()"
1537
+ [compact]="compact()"
1538
+ [itemClass]="itemClass()"
1539
+ [activeIds]="activeIds()"
1540
+ [activeUrl]="activeUrl()"
1541
+ [iconTemplate]="iconTemplate()"
1542
+ [collapseTree]="collapseTree()"
1543
+ [openedIds]="openedIds()"
1544
+ (openedIdsChange)="openedIdsChange.emit($event)"
1545
+ (itemSelected)="itemSelected.emit($event)" />
1546
+ `,
1547
+ }]
1548
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1549
+
1550
+ class NavSidebarComponent {
1551
+ navId = input('default', ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
1552
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1553
+ collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
1554
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
1555
+ position = input('left', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
1556
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
1557
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
1558
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
1559
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
1560
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
1561
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
1562
+ openedIdsChange = output();
1563
+ itemSelected = output();
1564
+ isCollapsed = computed(() => this.collapsed() || this.compact(), ...(ngDevMode ? [{ debugName: "isCollapsed" }] : /* istanbul ignore next */ []));
1565
+ hostClasses = computed(() => cn('block', this.position() === 'right' && 'items-end text-right'), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1566
+ listClasses = computed(() => this.isCollapsed()
1567
+ ? cn('flex list-none flex-col items-center gap-0.5 p-0')
1568
+ : cn('flex list-none flex-col gap-0.5 p-0', this.position() === 'right' && 'items-end'), ...(ngDevMode ? [{ debugName: "listClasses" }] : /* istanbul ignore next */ []));
1569
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1570
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: NavSidebarComponent, isStandalone: true, selector: "ui-nav-sidebar", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { properties: { "class": "hostClasses()", "attr.data-position": "position()" } }, ngImport: i0, template: `
1571
+ <ul [class]="listClasses()" role="list">
1572
+ @for (item of items(); track item.key) {
1573
+ <li
1574
+ ui-nav-item
1575
+ [navId]="navId()"
1576
+ [item]="item"
1577
+ [level]="0"
1578
+ [orientation]="'vertical'"
1579
+ [compact]="isCollapsed()"
1580
+ [itemClass]="itemClass()"
1581
+ [activeIds]="activeIds()"
1582
+ [activeUrl]="activeUrl()"
1583
+ [iconTemplate]="iconTemplate()"
1584
+ [collapseTree]="collapseTree()"
1585
+ [openedIds]="openedIds()"
1586
+ (openedIdsChange)="openedIdsChange.emit($event)"
1587
+ (itemSelected)="itemSelected.emit($event)"></li>
1588
+ }
1589
+ </ul>
1590
+ `, isInline: true, dependencies: [{ kind: "component", type: NavItemComponent, selector: "li[ui-nav-item]", inputs: ["navId", "item", "level", "orientation", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "straightRail", "straightRailActive", "firstInBranch", "lastInBranch", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1591
+ }
1592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavSidebarComponent, decorators: [{
1593
+ type: Component,
1594
+ args: [{
1595
+ selector: 'ui-nav-sidebar',
1596
+ changeDetection: ChangeDetectionStrategy.OnPush,
1597
+ imports: [NavItemComponent],
1598
+ host: {
1599
+ '[class]': 'hostClasses()',
1600
+ '[attr.data-position]': 'position()',
1601
+ },
1602
+ template: `
1603
+ <ul [class]="listClasses()" role="list">
1604
+ @for (item of items(); track item.key) {
1605
+ <li
1606
+ ui-nav-item
1607
+ [navId]="navId()"
1608
+ [item]="item"
1609
+ [level]="0"
1610
+ [orientation]="'vertical'"
1611
+ [compact]="isCollapsed()"
1612
+ [itemClass]="itemClass()"
1613
+ [activeIds]="activeIds()"
1614
+ [activeUrl]="activeUrl()"
1615
+ [iconTemplate]="iconTemplate()"
1616
+ [collapseTree]="collapseTree()"
1617
+ [openedIds]="openedIds()"
1618
+ (openedIdsChange)="openedIdsChange.emit($event)"
1619
+ (itemSelected)="itemSelected.emit($event)"></li>
1620
+ }
1621
+ </ul>
1622
+ `,
1623
+ }]
1624
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1625
+
1626
+ class NavDockbarComponent {
1627
+ nav = inject(NavService);
1628
+ host = inject(ElementRef);
1629
+ navId = input('default', ...(ngDevMode ? [{ debugName: "navId" }] : /* istanbul ignore next */ []));
1630
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1631
+ mode = input('sticky', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1632
+ position = input('left', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
1633
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
1634
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
1635
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
1636
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
1637
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
1638
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
1639
+ openedIdsChange = output();
1640
+ itemSelected = output();
1641
+ isDrawerMode = computed(() => this.mode() === 'drawer', ...(ngDevMode ? [{ debugName: "isDrawerMode" }] : /* istanbul ignore next */ []));
1642
+ isDrawerOpen = computed(() => this.nav.isDrawerOpen(this.navId()), ...(ngDevMode ? [{ debugName: "isDrawerOpen" }] : /* istanbul ignore next */ []));
1643
+ panelId = computed(() => `ui-nav-dockbar-${this.safeId(this.navId())}`, ...(ngDevMode ? [{ debugName: "panelId" }] : /* istanbul ignore next */ []));
1644
+ hostClasses = computed(() => cn('block', this.isDrawerMode() ? 'w-auto' : 'w-16', this.position() === 'right' && 'justify-self-end'), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1645
+ railClasses = computed(() => cn('flex min-h-full w-16 justify-center rounded-2xl border border-border/60 bg-background/70 px-2 py-3 backdrop-blur', this.position() === 'right' && 'ml-auto'), ...(ngDevMode ? [{ debugName: "railClasses" }] : /* istanbul ignore next */ []));
1646
+ triggerClasses() {
1647
+ return cn('inline-flex h-11 w-11 items-center justify-center rounded-2xl border border-border/60 bg-background/80 text-foreground shadow-sm transition-colors', 'hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring');
1648
+ }
1649
+ drawerClasses() {
1650
+ return cn('fixed bottom-4 top-4 z-50 w-72 overflow-y-auto rounded-2xl border border-border bg-background p-4 shadow-2xl', this.position() === 'right' ? 'right-4' : 'left-4');
1651
+ }
1652
+ toggleDrawer() {
1653
+ const wasOpen = this.isDrawerOpen();
1654
+ this.nav.toggleDrawer(this.navId());
1655
+ if (wasOpen) {
1656
+ queueMicrotask(() => this.focusTrigger());
1657
+ return;
1658
+ }
1659
+ queueMicrotask(() => this.focusFirstDrawerItem());
1660
+ }
1661
+ closeDrawer() {
1662
+ if (!this.isDrawerOpen()) {
1663
+ return;
1664
+ }
1665
+ this.nav.closeDrawer(this.navId());
1666
+ queueMicrotask(() => this.focusTrigger());
1667
+ }
1668
+ onDrawerKeydown(event) {
1669
+ if (event.key !== 'Escape') {
1670
+ return;
1671
+ }
1672
+ event.preventDefault();
1673
+ this.closeDrawer();
1674
+ }
1675
+ focusFirstDrawerItem() {
1676
+ const panel = this.host.nativeElement.querySelector(`#${this.panelId()}`);
1677
+ const focusable = panel?.querySelector('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])');
1678
+ focusable?.focus();
1679
+ }
1680
+ focusTrigger() {
1681
+ const trigger = this.host.nativeElement.querySelector('[data-ui-nav-dockbar-trigger="true"]');
1682
+ trigger?.focus();
1683
+ }
1684
+ safeId(value) {
1685
+ const normalized = value
1686
+ .trim()
1687
+ .toLowerCase()
1688
+ .replace(/[^a-z0-9_-]+/g, '-');
1689
+ return normalized || 'default';
1690
+ }
1691
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavDockbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1692
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: NavDockbarComponent, isStandalone: true, selector: "ui-nav-dockbar", inputs: { navId: { classPropertyName: "navId", publicName: "navId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, host: { properties: { "class": "hostClasses()", "attr.data-mode": "mode()", "attr.data-position": "position()" } }, ngImport: i0, template: `
1693
+ @if (isDrawerMode()) {
1694
+ <div class="relative">
1695
+ <button
1696
+ type="button"
1697
+ data-ui-nav-dockbar-trigger="true"
1698
+ [class]="triggerClasses()"
1699
+ [attr.aria-expanded]="isDrawerOpen()"
1700
+ [attr.aria-controls]="panelId()"
1701
+ aria-haspopup="dialog"
1702
+ aria-label="Open navigation drawer"
1703
+ (click)="toggleDrawer()">
1704
+ <span aria-hidden="true" class="text-lg leading-none">☰</span>
1705
+ </button>
1706
+
1707
+ @if (isDrawerOpen()) {
1708
+ <div class="fixed inset-0 z-40 bg-black/40" aria-hidden="true" (click)="closeDrawer()"></div>
1709
+
1710
+ <aside
1711
+ [id]="panelId()"
1712
+ [class]="drawerClasses()"
1713
+ role="dialog"
1714
+ aria-modal="true"
1715
+ (keydown)="onDrawerKeydown($event)">
1716
+ <div class="mb-3 flex items-center justify-between gap-3 px-1">
1717
+ <span class="text-sm font-semibold text-foreground">Navigation</span>
1718
+ <button
1719
+ type="button"
1720
+ class="inline-flex h-9 items-center rounded-md px-3 text-sm font-medium text-foreground/80 transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1721
+ (click)="closeDrawer()">
1722
+ Close
1723
+ </button>
1724
+ </div>
1725
+
1726
+ <ui-nav-sidebar
1727
+ [navId]="navId()"
1728
+ [items]="items()"
1729
+ [collapsed]="false"
1730
+ [position]="position()"
1731
+ [itemClass]="itemClass()"
1732
+ [activeIds]="activeIds()"
1733
+ [activeUrl]="activeUrl()"
1734
+ [iconTemplate]="iconTemplate()"
1735
+ [collapseTree]="collapseTree()"
1736
+ [openedIds]="openedIds()"
1737
+ (openedIdsChange)="openedIdsChange.emit($event)"
1738
+ (itemSelected)="itemSelected.emit($event)" />
1739
+ </aside>
1740
+ }
1741
+ </div>
1742
+ } @else {
1743
+ <div [class]="railClasses()">
1744
+ <ui-nav-sidebar
1745
+ [navId]="navId()"
1746
+ [items]="items()"
1747
+ [collapsed]="true"
1748
+ [position]="position()"
1749
+ [itemClass]="itemClass()"
1750
+ [activeIds]="activeIds()"
1751
+ [activeUrl]="activeUrl()"
1752
+ [iconTemplate]="iconTemplate()"
1753
+ [collapseTree]="collapseTree()"
1754
+ [openedIds]="openedIds()"
1755
+ (openedIdsChange)="openedIdsChange.emit($event)"
1756
+ (itemSelected)="itemSelected.emit($event)" />
1757
+ </div>
1758
+ }
1759
+ `, isInline: true, dependencies: [{ kind: "component", type: NavSidebarComponent, selector: "ui-nav-sidebar", inputs: ["navId", "items", "collapsed", "compact", "position", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1760
+ }
1761
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: NavDockbarComponent, decorators: [{
1762
+ type: Component,
1763
+ args: [{
1764
+ selector: 'ui-nav-dockbar',
1765
+ changeDetection: ChangeDetectionStrategy.OnPush,
1766
+ imports: [NavSidebarComponent],
1767
+ host: {
1768
+ '[class]': 'hostClasses()',
1769
+ '[attr.data-mode]': 'mode()',
1770
+ '[attr.data-position]': 'position()',
1771
+ },
1772
+ template: `
1773
+ @if (isDrawerMode()) {
1774
+ <div class="relative">
1775
+ <button
1776
+ type="button"
1777
+ data-ui-nav-dockbar-trigger="true"
1778
+ [class]="triggerClasses()"
1779
+ [attr.aria-expanded]="isDrawerOpen()"
1780
+ [attr.aria-controls]="panelId()"
1781
+ aria-haspopup="dialog"
1782
+ aria-label="Open navigation drawer"
1783
+ (click)="toggleDrawer()">
1784
+ <span aria-hidden="true" class="text-lg leading-none">☰</span>
1785
+ </button>
1786
+
1787
+ @if (isDrawerOpen()) {
1788
+ <div class="fixed inset-0 z-40 bg-black/40" aria-hidden="true" (click)="closeDrawer()"></div>
1789
+
1790
+ <aside
1791
+ [id]="panelId()"
1792
+ [class]="drawerClasses()"
1793
+ role="dialog"
1794
+ aria-modal="true"
1795
+ (keydown)="onDrawerKeydown($event)">
1796
+ <div class="mb-3 flex items-center justify-between gap-3 px-1">
1797
+ <span class="text-sm font-semibold text-foreground">Navigation</span>
1798
+ <button
1799
+ type="button"
1800
+ class="inline-flex h-9 items-center rounded-md px-3 text-sm font-medium text-foreground/80 transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1801
+ (click)="closeDrawer()">
1802
+ Close
1803
+ </button>
1804
+ </div>
1805
+
1806
+ <ui-nav-sidebar
1807
+ [navId]="navId()"
1808
+ [items]="items()"
1809
+ [collapsed]="false"
1810
+ [position]="position()"
1811
+ [itemClass]="itemClass()"
1812
+ [activeIds]="activeIds()"
1813
+ [activeUrl]="activeUrl()"
1814
+ [iconTemplate]="iconTemplate()"
1815
+ [collapseTree]="collapseTree()"
1816
+ [openedIds]="openedIds()"
1817
+ (openedIdsChange)="openedIdsChange.emit($event)"
1818
+ (itemSelected)="itemSelected.emit($event)" />
1819
+ </aside>
1820
+ }
1821
+ </div>
1822
+ } @else {
1823
+ <div [class]="railClasses()">
1824
+ <ui-nav-sidebar
1825
+ [navId]="navId()"
1826
+ [items]="items()"
1827
+ [collapsed]="true"
1828
+ [position]="position()"
1829
+ [itemClass]="itemClass()"
1830
+ [activeIds]="activeIds()"
1831
+ [activeUrl]="activeUrl()"
1832
+ [iconTemplate]="iconTemplate()"
1833
+ [collapseTree]="collapseTree()"
1834
+ [openedIds]="openedIds()"
1835
+ (openedIdsChange)="openedIdsChange.emit($event)"
1836
+ (itemSelected)="itemSelected.emit($event)" />
1837
+ </div>
1838
+ }
1839
+ `,
1840
+ }]
1841
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "navId", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1842
+
1843
+ class UiNavOutletComponent {
1844
+ state = input.required(...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
1845
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1846
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
1847
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
1848
+ activeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
1849
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
1850
+ iconTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
1851
+ collapseTree = input('stairs', ...(ngDevMode ? [{ debugName: "collapseTree" }] : /* istanbul ignore next */ []));
1852
+ openedIds = input([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
1853
+ openedIdsChange = output();
1854
+ itemSelected = output();
1855
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1856
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: UiNavOutletComponent, isStandalone: true, selector: "ui-nav-outlet", inputs: { state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, iconTemplate: { classPropertyName: "iconTemplate", publicName: "iconTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapseTree", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIdsChange: "openedIdsChange", itemSelected: "itemSelected" }, ngImport: i0, template: `
1857
+ @let navState = state();
1858
+
1859
+ @if (navState.orientation === 'horizontal' && navState.appearance === 'flyout') {
1860
+ <ui-nav-flyout
1861
+ [navId]="navState.id"
1862
+ [items]="items()"
1863
+ [compact]="compact()"
1864
+ [itemClass]="itemClass()"
1865
+ [activeIds]="activeIds()"
1866
+ [activeUrl]="activeUrl()"
1867
+ [iconTemplate]="iconTemplate()"
1868
+ [collapseTree]="collapseTree()"
1869
+ [openedIds]="openedIds()"
1870
+ (openedIdsChange)="openedIdsChange.emit($event)"
1871
+ (itemSelected)="itemSelected.emit($event)" />
1872
+ } @else if (navState.orientation === 'horizontal') {
1873
+ <ui-nav-navbar
1874
+ [navId]="navState.id"
1875
+ [items]="items()"
1876
+ [compact]="compact()"
1877
+ [itemClass]="itemClass()"
1878
+ [activeIds]="activeIds()"
1879
+ [activeUrl]="activeUrl()"
1880
+ [iconTemplate]="iconTemplate()"
1881
+ [collapseTree]="collapseTree()"
1882
+ [openedIds]="openedIds()"
1883
+ (openedIdsChange)="openedIdsChange.emit($event)"
1884
+ (itemSelected)="itemSelected.emit($event)" />
1885
+ } @else if (navState.appearance === 'dockbar') {
1886
+ <ui-nav-dockbar
1887
+ [navId]="navState.id"
1888
+ [items]="items()"
1889
+ [mode]="navState.dockbarMode"
1890
+ [position]="navState.position"
1891
+ [itemClass]="itemClass()"
1892
+ [activeIds]="activeIds()"
1893
+ [activeUrl]="activeUrl()"
1894
+ [iconTemplate]="iconTemplate()"
1895
+ [collapseTree]="collapseTree()"
1896
+ [openedIds]="openedIds()"
1897
+ (openedIdsChange)="openedIdsChange.emit($event)"
1898
+ (itemSelected)="itemSelected.emit($event)" />
1899
+ } @else {
1900
+ <ui-nav-sidebar
1901
+ [navId]="navState.id"
1902
+ [items]="items()"
1903
+ [collapsed]="navState.collapsed"
1904
+ [position]="navState.position"
1905
+ [itemClass]="itemClass()"
1906
+ [activeIds]="activeIds()"
1907
+ [activeUrl]="activeUrl()"
1908
+ [iconTemplate]="iconTemplate()"
1909
+ [collapseTree]="collapseTree()"
1910
+ [openedIds]="openedIds()"
1911
+ (openedIdsChange)="openedIdsChange.emit($event)"
1912
+ (itemSelected)="itemSelected.emit($event)" />
1913
+ }
1914
+ `, isInline: true, dependencies: [{ kind: "component", type: NavDockbarComponent, selector: "ui-nav-dockbar", inputs: ["navId", "items", "mode", "position", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavFlyoutComponent, selector: "ui-nav-flyout", inputs: ["navId", "items", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavNavbarComponent, selector: "ui-nav-navbar", inputs: ["navId", "items", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: NavSidebarComponent, selector: "ui-nav-sidebar", inputs: ["navId", "items", "collapsed", "compact", "position", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1915
+ }
1916
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavOutletComponent, decorators: [{
1917
+ type: Component,
1918
+ args: [{
1919
+ selector: 'ui-nav-outlet',
1920
+ changeDetection: ChangeDetectionStrategy.OnPush,
1921
+ imports: [NavDockbarComponent, NavFlyoutComponent, NavNavbarComponent, NavSidebarComponent],
1922
+ template: `
1923
+ @let navState = state();
1924
+
1925
+ @if (navState.orientation === 'horizontal' && navState.appearance === 'flyout') {
1926
+ <ui-nav-flyout
1927
+ [navId]="navState.id"
1928
+ [items]="items()"
1929
+ [compact]="compact()"
1930
+ [itemClass]="itemClass()"
1931
+ [activeIds]="activeIds()"
1932
+ [activeUrl]="activeUrl()"
1933
+ [iconTemplate]="iconTemplate()"
1934
+ [collapseTree]="collapseTree()"
1935
+ [openedIds]="openedIds()"
1936
+ (openedIdsChange)="openedIdsChange.emit($event)"
1937
+ (itemSelected)="itemSelected.emit($event)" />
1938
+ } @else if (navState.orientation === 'horizontal') {
1939
+ <ui-nav-navbar
1940
+ [navId]="navState.id"
1941
+ [items]="items()"
1942
+ [compact]="compact()"
1943
+ [itemClass]="itemClass()"
1944
+ [activeIds]="activeIds()"
1945
+ [activeUrl]="activeUrl()"
1946
+ [iconTemplate]="iconTemplate()"
1947
+ [collapseTree]="collapseTree()"
1948
+ [openedIds]="openedIds()"
1949
+ (openedIdsChange)="openedIdsChange.emit($event)"
1950
+ (itemSelected)="itemSelected.emit($event)" />
1951
+ } @else if (navState.appearance === 'dockbar') {
1952
+ <ui-nav-dockbar
1953
+ [navId]="navState.id"
1954
+ [items]="items()"
1955
+ [mode]="navState.dockbarMode"
1956
+ [position]="navState.position"
1957
+ [itemClass]="itemClass()"
1958
+ [activeIds]="activeIds()"
1959
+ [activeUrl]="activeUrl()"
1960
+ [iconTemplate]="iconTemplate()"
1961
+ [collapseTree]="collapseTree()"
1962
+ [openedIds]="openedIds()"
1963
+ (openedIdsChange)="openedIdsChange.emit($event)"
1964
+ (itemSelected)="itemSelected.emit($event)" />
1965
+ } @else {
1966
+ <ui-nav-sidebar
1967
+ [navId]="navState.id"
1968
+ [items]="items()"
1969
+ [collapsed]="navState.collapsed"
1970
+ [position]="navState.position"
1971
+ [itemClass]="itemClass()"
1972
+ [activeIds]="activeIds()"
1973
+ [activeUrl]="activeUrl()"
1974
+ [iconTemplate]="iconTemplate()"
1975
+ [collapseTree]="collapseTree()"
1976
+ [openedIds]="openedIds()"
1977
+ (openedIdsChange)="openedIdsChange.emit($event)"
1978
+ (itemSelected)="itemSelected.emit($event)" />
1979
+ }
1980
+ `,
1981
+ }]
1982
+ }], propDecorators: { state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: true }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], iconTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTemplate", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseTree", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }], openedIdsChange: [{ type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
1983
+
1984
+ const UI_NAV_SHELL = new InjectionToken('UI_NAV_SHELL');
1985
+
1986
+ class UiNavFooterComponent {
1987
+ shell = inject(UI_NAV_SHELL, { optional: true });
1988
+ class = input('', { ...(ngDevMode ? { debugName: "class" } : /* istanbul ignore next */ {}), alias: 'class' });
1989
+ isHorizontal = computed(() => this.shell?.displayState().orientation === 'horizontal', ...(ngDevMode ? [{ debugName: "isHorizontal" }] : /* istanbul ignore next */ []));
1990
+ hostClasses = computed(() => cn(this.isHorizontal()
1991
+ ? 'relative z-10 block h-full w-auto shrink-0'
1992
+ : 'sticky bottom-0 z-10 block h-12 shrink-0 border-t border-border/70', this.class()), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1993
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1994
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiNavFooterComponent, isStandalone: true, selector: "ui-nav-footer", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
1995
+ <div class="flex h-full items-center">
1996
+ <ng-content />
1997
+ </div>
1998
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1999
+ }
2000
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavFooterComponent, decorators: [{
2001
+ type: Component,
2002
+ args: [{
2003
+ selector: 'ui-nav-footer',
2004
+ changeDetection: ChangeDetectionStrategy.OnPush,
2005
+ host: {
2006
+ '[class]': 'hostClasses()',
2007
+ },
2008
+ template: `
2009
+ <div class="flex h-full items-center">
2010
+ <ng-content />
2011
+ </div>
2012
+ `,
2013
+ }]
2014
+ }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2015
+
2016
+ class UiNavHeaderComponent {
2017
+ shell = inject(UI_NAV_SHELL);
2018
+ toggle = input(false, ...(ngDevMode ? [{ debugName: "toggle" }] : /* istanbul ignore next */ []));
2019
+ class = input('', { ...(ngDevMode ? { debugName: "class" } : /* istanbul ignore next */ {}), alias: 'class' });
2020
+ collapsed = computed(() => this.shell.state().collapsed, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
2021
+ displayCollapsed = computed(() => this.shell.displayState().collapsed, ...(ngDevMode ? [{ debugName: "displayCollapsed" }] : /* istanbul ignore next */ []));
2022
+ isHorizontal = computed(() => this.shell.displayState().orientation === 'horizontal', ...(ngDevMode ? [{ debugName: "isHorizontal" }] : /* istanbul ignore next */ []));
2023
+ showToggle = computed(() => {
2024
+ if (this.isHorizontal()) {
2025
+ return false;
2026
+ }
2027
+ return this.toggle() || (this.shell.collapseEnabled() && !this.displayCollapsed());
2028
+ }, ...(ngDevMode ? [{ debugName: "showToggle" }] : /* istanbul ignore next */ []));
2029
+ toggleAriaLabel = computed(() => (this.collapsed() ? 'Expand navigation' : 'Collapse navigation'), ...(ngDevMode ? [{ debugName: "toggleAriaLabel" }] : /* istanbul ignore next */ []));
2030
+ toggleIconName = computed(() => (this.collapsed() ? 'left_panel_open' : 'left_panel_close'), ...(ngDevMode ? [{ debugName: "toggleIconName" }] : /* istanbul ignore next */ []));
2031
+ contentClasses = computed(() => (this.isHorizontal() ? 'min-w-0' : 'min-w-0 flex-1'), ...(ngDevMode ? [{ debugName: "contentClasses" }] : /* istanbul ignore next */ []));
2032
+ hostClasses = computed(() => cn(this.isHorizontal()
2033
+ ? 'relative z-10 block h-full w-auto shrink-0'
2034
+ : 'sticky top-0 z-10 block h-12 shrink-0 border-b border-border/70', this.class()), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2035
+ toggleCollapsed() {
2036
+ this.shell.toggleCollapsed();
2037
+ }
2038
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2039
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: UiNavHeaderComponent, isStandalone: true, selector: "ui-nav-header", inputs: { toggle: { classPropertyName: "toggle", publicName: "toggle", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "attr.data-collapsed": "displayCollapsed()" } }, ngImport: i0, template: `
2040
+ <div class="flex h-full items-center gap-3 px-3">
2041
+ <div [class]="contentClasses()">
2042
+ <ng-content />
2043
+ </div>
2044
+
2045
+ @if (showToggle()) {
2046
+ <button
2047
+ type="button"
2048
+ class="inline-flex h-8 w-8 shrink-0 items-center justify-center bg-transparent text-foreground/80 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
2049
+ [attr.aria-label]="toggleAriaLabel()"
2050
+ [attr.title]="toggleAriaLabel()"
2051
+ data-ui-nav-header-toggle="true"
2052
+ (click)="toggleCollapsed()">
2053
+ <span
2054
+ aria-hidden="true"
2055
+ data-ui-nav-header-toggle-icon="true"
2056
+ class="material-symbols-outlined leading-none"
2057
+ style="font-size: 18px; line-height: 18px;">
2058
+ {{ toggleIconName() }}
2059
+ </span>
2060
+ </button>
2061
+ }
2062
+ </div>
2063
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
2064
+ }
2065
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavHeaderComponent, decorators: [{
2066
+ type: Component,
2067
+ args: [{
2068
+ selector: 'ui-nav-header',
2069
+ changeDetection: ChangeDetectionStrategy.OnPush,
2070
+ host: {
2071
+ '[class]': 'hostClasses()',
2072
+ '[attr.data-collapsed]': 'displayCollapsed()',
2073
+ },
2074
+ template: `
2075
+ <div class="flex h-full items-center gap-3 px-3">
2076
+ <div [class]="contentClasses()">
2077
+ <ng-content />
2078
+ </div>
2079
+
2080
+ @if (showToggle()) {
2081
+ <button
2082
+ type="button"
2083
+ class="inline-flex h-8 w-8 shrink-0 items-center justify-center bg-transparent text-foreground/80 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
2084
+ [attr.aria-label]="toggleAriaLabel()"
2085
+ [attr.title]="toggleAriaLabel()"
2086
+ data-ui-nav-header-toggle="true"
2087
+ (click)="toggleCollapsed()">
2088
+ <span
2089
+ aria-hidden="true"
2090
+ data-ui-nav-header-toggle-icon="true"
2091
+ class="material-symbols-outlined leading-none"
2092
+ style="font-size: 18px; line-height: 18px;">
2093
+ {{ toggleIconName() }}
2094
+ </span>
2095
+ </button>
2096
+ }
2097
+ </div>
2098
+ `,
2099
+ }]
2100
+ }], propDecorators: { toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2101
+
2102
+ class UiNavMainComponent {
2103
+ class = input('', { ...(ngDevMode ? { debugName: "class" } : /* istanbul ignore next */ {}), alias: 'class' });
2104
+ orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
2105
+ hostClasses = computed(() => cn('min-h-0 flex-1', this.orientation() === 'horizontal'
2106
+ ? 'flex h-full min-w-0 items-stretch justify-center overflow-visible'
2107
+ : 'block overflow-y-auto overflow-x-hidden scrollbar-thin scrollbar-thumb-primary scrollbar-track-primary/10', this.class()), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavMainComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiNavMainComponent, isStandalone: true, selector: "ui-nav-main", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: ` <ng-content /> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
2110
+ }
2111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavMainComponent, decorators: [{
2112
+ type: Component,
2113
+ args: [{
2114
+ selector: 'ui-nav-main',
2115
+ changeDetection: ChangeDetectionStrategy.OnPush,
2116
+ host: {
2117
+ '[class]': 'hostClasses()',
2118
+ },
2119
+ template: ` <ng-content /> `,
2120
+ }]
2121
+ }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
2122
+
2123
+ class UiNavComponent {
2124
+ navId = input('default', { ...(ngDevMode ? { debugName: "navId" } : /* istanbul ignore next */ {}), alias: 'id' });
2125
+ data = input([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
2126
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
2127
+ orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
2128
+ appearance = input(null, ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
2129
+ position = input(null, ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
2130
+ collapsed = input(null, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
2131
+ dockbarMode = input(null, ...(ngDevMode ? [{ debugName: "dockbarMode" }] : /* istanbul ignore next */ []));
2132
+ ariaLabel = input('Primary navigation', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
2133
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
2134
+ previewExpanded = input(false, ...(ngDevMode ? [{ debugName: "previewExpanded" }] : /* istanbul ignore next */ []));
2135
+ sidebarCollapse = input(false, { ...(ngDevMode ? { debugName: "sidebarCollapse" } : /* istanbul ignore next */ {}), alias: 'nav-sidebar-collapse', transform: booleanAttribute });
2136
+ collapseTree = input('stairs', { ...(ngDevMode ? { debugName: "collapseTree" } : /* istanbul ignore next */ {}), alias: 'collapse-tree' });
2137
+ class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
2138
+ itemClass = input('', ...(ngDevMode ? [{ debugName: "itemClass" }] : /* istanbul ignore next */ []));
2139
+ activeIds = input(null, ...(ngDevMode ? [{ debugName: "activeIds" }] : /* istanbul ignore next */ []));
2140
+ activeUrl = input(null, ...(ngDevMode ? [{ debugName: "activeUrl" }] : /* istanbul ignore next */ []));
2141
+ openedIds = model([], ...(ngDevMode ? [{ debugName: "openedIds" }] : /* istanbul ignore next */ []));
2142
+ itemSelected = output();
2143
+ hoverPreviewExpanded = signal(false, ...(ngDevMode ? [{ debugName: "hoverPreviewExpanded" }] : /* istanbul ignore next */ []));
2144
+ controller = injectUiNavController({
2145
+ navId: this.navId,
2146
+ data: this.data,
2147
+ items: this.items,
2148
+ orientation: this.orientation,
2149
+ appearance: this.appearance,
2150
+ position: this.position,
2151
+ collapsed: this.collapsed,
2152
+ dockbarMode: this.dockbarMode,
2153
+ compact: this.compact,
2154
+ activeIds: this.activeIds,
2155
+ });
2156
+ headerSlot = contentChild(UiNavHeaderComponent, ...(ngDevMode ? [{ debugName: "headerSlot" }] : /* istanbul ignore next */ []));
2157
+ footerSlot = contentChild(UiNavFooterComponent, ...(ngDevMode ? [{ debugName: "footerSlot" }] : /* istanbul ignore next */ []));
2158
+ iconTemplate = contentChild(NavIconDirective, ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
2159
+ normalizedItems = this.controller.normalizedItems;
2160
+ resolvedState = this.controller.resolvedState;
2161
+ activeIdSet = this.controller.activeIdSet;
2162
+ previewRailExpanded = computed(() => {
2163
+ const state = this.resolvedState();
2164
+ if (state.orientation !== 'vertical' || state.appearance !== 'sidebar' || !state.collapsed) {
2165
+ return false;
2166
+ }
2167
+ return this.previewExpanded() || (this.sidebarCollapse() && this.hoverPreviewExpanded());
2168
+ }, ...(ngDevMode ? [{ debugName: "previewRailExpanded" }] : /* istanbul ignore next */ []));
2169
+ previewRailOffset = computed(() => (this.previewRailExpanded() ? '15rem' : '0px'), ...(ngDevMode ? [{ debugName: "previewRailOffset" }] : /* istanbul ignore next */ []));
2170
+ displayState = computed(() => {
2171
+ const state = this.resolvedState();
2172
+ return this.previewRailExpanded() ? { ...state, collapsed: false } : state;
2173
+ }, ...(ngDevMode ? [{ debugName: "displayState" }] : /* istanbul ignore next */ []));
2174
+ collapseEnabled = computed(() => {
2175
+ const state = this.resolvedState();
2176
+ return this.sidebarCollapse() && state.orientation === 'vertical' && state.appearance === 'sidebar';
2177
+ }, ...(ngDevMode ? [{ debugName: "collapseEnabled" }] : /* istanbul ignore next */ []));
2178
+ shellClasses = computed(() => cn('flex h-full min-h-0 transition-[width,box-shadow,transform] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none', this.resolvedState().orientation === 'horizontal'
2179
+ ? 'flex-row items-stretch overflow-visible'
2180
+ : 'flex-col overflow-hidden', this.resolvedState().position === 'right' ? 'origin-right' : 'origin-left', this.previewRailExpanded() && [
2181
+ 'absolute inset-y-0 z-20 w-76 overflow-hidden bg-background shadow-xl',
2182
+ this.resolvedState().position === 'right'
2183
+ ? 'right-0 border-l border-border/70'
2184
+ : 'left-0 border-r border-border/70',
2185
+ ]), ...(ngDevMode ? [{ debugName: "shellClasses" }] : /* istanbul ignore next */ []));
2186
+ state = this.resolvedState;
2187
+ hostClasses = computed(() => cn('relative block min-h-0 text-foreground transition-[width] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none', this.resolvedState().orientation === 'horizontal'
2188
+ ? 'w-full'
2189
+ : this.resolvedState().appearance === 'dockbar'
2190
+ ? 'w-auto'
2191
+ : this.resolvedState().collapsed
2192
+ ? 'w-16'
2193
+ : 'w-76', this.resolvedState().orientation === 'horizontal' || this.previewRailExpanded()
2194
+ ? 'overflow-visible'
2195
+ : 'overflow-hidden', this.class()), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2196
+ toggleCollapsed() {
2197
+ this.controller.toggleCollapsed();
2198
+ }
2199
+ setHoverPreview(value) {
2200
+ this.hoverPreviewExpanded.set(this.sidebarCollapse() ? value : false);
2201
+ }
2202
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2203
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: UiNavComponent, isStandalone: true, selector: "ui-nav", inputs: { navId: { classPropertyName: "navId", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, dockbarMode: { classPropertyName: "dockbarMode", publicName: "dockbarMode", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, previewExpanded: { classPropertyName: "previewExpanded", publicName: "previewExpanded", isSignal: true, isRequired: false, transformFunction: null }, sidebarCollapse: { classPropertyName: "sidebarCollapse", publicName: "nav-sidebar-collapse", isSignal: true, isRequired: false, transformFunction: null }, collapseTree: { classPropertyName: "collapseTree", publicName: "collapse-tree", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, activeIds: { classPropertyName: "activeIds", publicName: "activeIds", isSignal: true, isRequired: false, transformFunction: null }, activeUrl: { classPropertyName: "activeUrl", publicName: "activeUrl", isSignal: true, isRequired: false, transformFunction: null }, openedIds: { classPropertyName: "openedIds", publicName: "openedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedIds: "openedIdsChange", itemSelected: "itemSelected" }, host: { attributes: { "role": "navigation" }, listeners: { "mouseenter": "setHoverPreview(true)", "mouseleave": "setHoverPreview(false)" }, properties: { "class": "hostClasses()", "attr.aria-label": "ariaLabel() || null", "attr.data-nav-id": "resolvedState().id", "attr.data-orientation": "resolvedState().orientation", "attr.data-appearance": "resolvedState().appearance", "attr.data-position": "resolvedState().orientation === \"vertical\" ? resolvedState().position : null", "attr.data-collapse-tree": "collapseTree()", "attr.data-preview-expanded": "previewRailExpanded() ? \"true\" : null" } }, providers: [{ provide: UI_NAV_SHELL, useExisting: forwardRef(() => UiNavComponent) }], queries: [{ propertyName: "headerSlot", first: true, predicate: UiNavHeaderComponent, descendants: true, isSignal: true }, { propertyName: "footerSlot", first: true, predicate: UiNavFooterComponent, descendants: true, isSignal: true }, { propertyName: "iconTemplate", first: true, predicate: NavIconDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
2204
+ @let iconTpl = iconTemplate();
2205
+ @let navState = displayState();
2206
+
2207
+ <div [class]="shellClasses()">
2208
+ @if (headerSlot()) {
2209
+ <ng-content select="ui-nav-header" />
2210
+ }
2211
+
2212
+ <ui-nav-main [orientation]="navState.orientation">
2213
+ <ui-nav-outlet
2214
+ [state]="navState"
2215
+ [items]="normalizedItems()"
2216
+ [compact]="compact()"
2217
+ [itemClass]="itemClass()"
2218
+ [activeIds]="activeIdSet()"
2219
+ [activeUrl]="activeUrl()"
2220
+ [iconTemplate]="iconTpl"
2221
+ [collapseTree]="collapseTree()"
2222
+ [openedIds]="openedIds()"
2223
+ (openedIdsChange)="openedIds.set($event)"
2224
+ (itemSelected)="itemSelected.emit($event)" />
2225
+ </ui-nav-main>
2226
+
2227
+ @if (footerSlot()) {
2228
+ <ng-content select="ui-nav-footer" />
2229
+ }
2230
+ </div>
2231
+ `, isInline: true, dependencies: [{ kind: "component", type: UiNavMainComponent, selector: "ui-nav-main", inputs: ["class", "orientation"] }, { kind: "component", type: UiNavOutletComponent, selector: "ui-nav-outlet", inputs: ["state", "items", "compact", "itemClass", "activeIds", "activeUrl", "iconTemplate", "collapseTree", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2232
+ }
2233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavComponent, decorators: [{
2234
+ type: Component,
2235
+ args: [{
2236
+ selector: 'ui-nav',
2237
+ changeDetection: ChangeDetectionStrategy.OnPush,
2238
+ imports: [UiNavMainComponent, UiNavOutletComponent],
2239
+ providers: [{ provide: UI_NAV_SHELL, useExisting: forwardRef(() => UiNavComponent) }],
2240
+ host: {
2241
+ '[class]': 'hostClasses()',
2242
+ role: 'navigation',
2243
+ '[attr.aria-label]': 'ariaLabel() || null',
2244
+ '[attr.data-nav-id]': 'resolvedState().id',
2245
+ '[attr.data-orientation]': 'resolvedState().orientation',
2246
+ '[attr.data-appearance]': 'resolvedState().appearance',
2247
+ '[attr.data-position]': 'resolvedState().orientation === "vertical" ? resolvedState().position : null',
2248
+ '[attr.data-collapse-tree]': 'collapseTree()',
2249
+ '[attr.data-preview-expanded]': 'previewRailExpanded() ? "true" : null',
2250
+ '(mouseenter)': 'setHoverPreview(true)',
2251
+ '(mouseleave)': 'setHoverPreview(false)',
2252
+ },
2253
+ template: `
2254
+ @let iconTpl = iconTemplate();
2255
+ @let navState = displayState();
2256
+
2257
+ <div [class]="shellClasses()">
2258
+ @if (headerSlot()) {
2259
+ <ng-content select="ui-nav-header" />
2260
+ }
2261
+
2262
+ <ui-nav-main [orientation]="navState.orientation">
2263
+ <ui-nav-outlet
2264
+ [state]="navState"
2265
+ [items]="normalizedItems()"
2266
+ [compact]="compact()"
2267
+ [itemClass]="itemClass()"
2268
+ [activeIds]="activeIdSet()"
2269
+ [activeUrl]="activeUrl()"
2270
+ [iconTemplate]="iconTpl"
2271
+ [collapseTree]="collapseTree()"
2272
+ [openedIds]="openedIds()"
2273
+ (openedIdsChange)="openedIds.set($event)"
2274
+ (itemSelected)="itemSelected.emit($event)" />
2275
+ </ui-nav-main>
2276
+
2277
+ @if (footerSlot()) {
2278
+ <ng-content select="ui-nav-footer" />
2279
+ }
2280
+ </div>
2281
+ `,
2282
+ }]
2283
+ }], propDecorators: { navId: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], dockbarMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "dockbarMode", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], previewExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "previewExpanded", required: false }] }], sidebarCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "nav-sidebar-collapse", required: false }] }], collapseTree: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapse-tree", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], itemClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemClass", required: false }] }], activeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIds", required: false }] }], activeUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeUrl", required: false }] }], openedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "openedIds", required: false }] }, { type: i0.Output, args: ["openedIdsChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], headerSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => UiNavHeaderComponent), { isSignal: true }] }], footerSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => UiNavFooterComponent), { isSignal: true }] }], iconTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NavIconDirective), { isSignal: true }] }] } });
2284
+
2285
+ class UiNavCollapseRootDirective {
2286
+ shell = inject(UI_NAV_SHELL);
2287
+ collapseEnabled = computed(() => this.shell.collapseEnabled() && this.shell.displayState().orientation === 'vertical', ...(ngDevMode ? [{ debugName: "collapseEnabled" }] : /* istanbul ignore next */ []));
2288
+ displayCollapsed = computed(() => this.collapseEnabled() && this.shell.displayState().collapsed, ...(ngDevMode ? [{ debugName: "displayCollapsed" }] : /* istanbul ignore next */ []));
2289
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavCollapseRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2290
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.15", type: UiNavCollapseRootDirective, isStandalone: true, selector: "[uiNavCollapseRoot]", host: { properties: { "class.w-full": "collapseEnabled()", "class.justify-center": "displayCollapsed()" } }, ngImport: i0 });
2291
+ }
2292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavCollapseRootDirective, decorators: [{
2293
+ type: Directive,
2294
+ args: [{
2295
+ selector: '[uiNavCollapseRoot]',
2296
+ host: {
2297
+ '[class.w-full]': 'collapseEnabled()',
2298
+ '[class.justify-center]': 'displayCollapsed()',
2299
+ },
2300
+ }]
2301
+ }] });
2302
+ class UiNavCollapseExpandedDirective {
2303
+ shell = inject(UI_NAV_SHELL);
2304
+ templateRef = inject((TemplateRef));
2305
+ viewContainer = inject(ViewContainerRef);
2306
+ hasView = false;
2307
+ shouldRender = computed(() => !this.shell.collapseEnabled() ||
2308
+ this.shell.displayState().orientation !== 'vertical' ||
2309
+ !this.shell.displayState().collapsed, ...(ngDevMode ? [{ debugName: "shouldRender" }] : /* istanbul ignore next */ []));
2310
+ constructor() {
2311
+ effect(() => {
2312
+ if (this.shouldRender()) {
2313
+ if (!this.hasView) {
2314
+ this.viewContainer.createEmbeddedView(this.templateRef);
2315
+ this.hasView = true;
2316
+ }
2317
+ return;
2318
+ }
2319
+ if (this.hasView) {
2320
+ this.viewContainer.clear();
2321
+ this.hasView = false;
2322
+ }
2323
+ });
2324
+ }
2325
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavCollapseExpandedDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2326
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.15", type: UiNavCollapseExpandedDirective, isStandalone: true, selector: "[uiNavCollapseExpanded]", ngImport: i0 });
2327
+ }
2328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiNavCollapseExpandedDirective, decorators: [{
2329
+ type: Directive,
2330
+ args: [{
2331
+ selector: '[uiNavCollapseExpanded]',
2332
+ }]
2333
+ }], ctorParameters: () => [] });
2334
+
2335
+ /**
2336
+ * Generated bundle index. Do not edit.
2337
+ */
2338
+
2339
+ export { NavIconDirective, UiNavCollapseExpandedDirective, UiNavCollapseRootDirective, UiNavComponent, UiNavFooterComponent, UiNavHeaderComponent, UiNavMainComponent, normalizeUiNavItems };
2340
+ //# sourceMappingURL=edsis-ui-nav.mjs.map