@neural-ui/core 1.2.1 → 1.3.1

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 (239) hide show
  1. package/README.md +56 -88
  2. package/accordion/package.json +4 -0
  3. package/alert/package.json +4 -0
  4. package/autocomplete/package.json +4 -0
  5. package/avatar/package.json +4 -0
  6. package/badge/package.json +4 -0
  7. package/block-ui/package.json +4 -0
  8. package/breadcrumb/package.json +4 -0
  9. package/button/package.json +4 -0
  10. package/card/package.json +4 -0
  11. package/chart/package.json +4 -0
  12. package/checkbox/package.json +4 -0
  13. package/chip/package.json +4 -0
  14. package/code-block/package.json +4 -0
  15. package/color-picker/package.json +4 -0
  16. package/command-palette/package.json +4 -0
  17. package/confirm-dialog/package.json +4 -0
  18. package/context-menu/package.json +4 -0
  19. package/dashboard-grid/package.json +4 -0
  20. package/date-input/package.json +4 -0
  21. package/divider/package.json +4 -0
  22. package/empty-state/package.json +4 -0
  23. package/fesm2022/neural-ui-core-accordion.mjs +162 -0
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -0
  25. package/fesm2022/neural-ui-core-alert.mjs +116 -0
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -0
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +406 -0
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -0
  29. package/fesm2022/neural-ui-core-avatar.mjs +109 -0
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -0
  31. package/fesm2022/neural-ui-core-badge.mjs +54 -0
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -0
  33. package/fesm2022/neural-ui-core-block-ui.mjs +95 -0
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -0
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +84 -0
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -0
  37. package/fesm2022/neural-ui-core-button.mjs +125 -0
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -0
  39. package/fesm2022/neural-ui-core-card.mjs +69 -0
  40. package/fesm2022/neural-ui-core-card.mjs.map +1 -0
  41. package/fesm2022/neural-ui-core-chart.mjs +287 -0
  42. package/fesm2022/neural-ui-core-chart.mjs.map +1 -0
  43. package/fesm2022/neural-ui-core-checkbox.mjs +138 -0
  44. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -0
  45. package/fesm2022/neural-ui-core-chip.mjs +130 -0
  46. package/fesm2022/neural-ui-core-chip.mjs.map +1 -0
  47. package/fesm2022/neural-ui-core-code-block.mjs +250 -0
  48. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -0
  49. package/fesm2022/neural-ui-core-color-picker.mjs +435 -0
  50. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -0
  51. package/fesm2022/neural-ui-core-command-palette.mjs +235 -0
  52. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -0
  53. package/fesm2022/neural-ui-core-confirm-dialog.mjs +118 -0
  54. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -0
  55. package/fesm2022/neural-ui-core-context-menu.mjs +158 -0
  56. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -0
  57. package/fesm2022/neural-ui-core-dashboard-grid.mjs +144 -0
  58. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -0
  59. package/fesm2022/neural-ui-core-date-input.mjs +1332 -0
  60. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -0
  61. package/fesm2022/neural-ui-core-divider.mjs +54 -0
  62. package/fesm2022/neural-ui-core-divider.mjs.map +1 -0
  63. package/fesm2022/neural-ui-core-empty-state.mjs +84 -0
  64. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -0
  65. package/fesm2022/neural-ui-core-filter-bar.mjs +118 -0
  66. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -0
  67. package/fesm2022/neural-ui-core-icon.mjs +50 -0
  68. package/fesm2022/neural-ui-core-icon.mjs.map +1 -0
  69. package/fesm2022/neural-ui-core-image-viewer.mjs +309 -0
  70. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -0
  71. package/fesm2022/neural-ui-core-input-otp.mjs +192 -0
  72. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -0
  73. package/fesm2022/neural-ui-core-input.mjs +320 -0
  74. package/fesm2022/neural-ui-core-input.mjs.map +1 -0
  75. package/fesm2022/neural-ui-core-knob.mjs +323 -0
  76. package/fesm2022/neural-ui-core-knob.mjs.map +1 -0
  77. package/fesm2022/neural-ui-core-meter-group.mjs +122 -0
  78. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -0
  79. package/fesm2022/neural-ui-core-modal.mjs +156 -0
  80. package/fesm2022/neural-ui-core-modal.mjs.map +1 -0
  81. package/fesm2022/neural-ui-core-multiselect.mjs +825 -0
  82. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -0
  83. package/fesm2022/neural-ui-core-nav.mjs +952 -0
  84. package/fesm2022/neural-ui-core-nav.mjs.map +1 -0
  85. package/fesm2022/neural-ui-core-notification-center.mjs +264 -0
  86. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -0
  87. package/fesm2022/neural-ui-core-number-input.mjs +331 -0
  88. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -0
  89. package/fesm2022/neural-ui-core-pagination.mjs +198 -0
  90. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -0
  91. package/fesm2022/neural-ui-core-popover.mjs +207 -0
  92. package/fesm2022/neural-ui-core-popover.mjs.map +1 -0
  93. package/fesm2022/neural-ui-core-progress-bar.mjs +105 -0
  94. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -0
  95. package/fesm2022/neural-ui-core-radio.mjs +171 -0
  96. package/fesm2022/neural-ui-core-radio.mjs.map +1 -0
  97. package/fesm2022/neural-ui-core-rating.mjs +151 -0
  98. package/fesm2022/neural-ui-core-rating.mjs.map +1 -0
  99. package/fesm2022/neural-ui-core-select.mjs +710 -0
  100. package/fesm2022/neural-ui-core-select.mjs.map +1 -0
  101. package/fesm2022/neural-ui-core-sidebar.mjs +214 -0
  102. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -0
  103. package/fesm2022/neural-ui-core-skeleton.mjs +40 -0
  104. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -0
  105. package/fesm2022/neural-ui-core-slider.mjs +146 -0
  106. package/fesm2022/neural-ui-core-slider.mjs.map +1 -0
  107. package/fesm2022/neural-ui-core-spinner.mjs +113 -0
  108. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -0
  109. package/fesm2022/neural-ui-core-split-button.mjs +252 -0
  110. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -0
  111. package/fesm2022/neural-ui-core-splitter.mjs +174 -0
  112. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -0
  113. package/fesm2022/neural-ui-core-stats-card.mjs +163 -0
  114. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -0
  115. package/fesm2022/neural-ui-core-stepper.mjs +204 -0
  116. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -0
  117. package/fesm2022/neural-ui-core-switch.mjs +111 -0
  118. package/fesm2022/neural-ui-core-switch.mjs.map +1 -0
  119. package/fesm2022/neural-ui-core-table.mjs +1872 -0
  120. package/fesm2022/neural-ui-core-table.mjs.map +1 -0
  121. package/fesm2022/neural-ui-core-tabs.mjs +338 -0
  122. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -0
  123. package/fesm2022/neural-ui-core-textarea.mjs +188 -0
  124. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -0
  125. package/fesm2022/neural-ui-core-timeline.mjs +117 -0
  126. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -0
  127. package/fesm2022/neural-ui-core-toast.mjs +171 -0
  128. package/fesm2022/neural-ui-core-toast.mjs.map +1 -0
  129. package/fesm2022/neural-ui-core-toggle-button-group.mjs +162 -0
  130. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -0
  131. package/fesm2022/neural-ui-core-toolbar.mjs +67 -0
  132. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -0
  133. package/fesm2022/neural-ui-core-tooltip.mjs +151 -0
  134. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -0
  135. package/fesm2022/neural-ui-core-url-state.mjs +96 -0
  136. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -0
  137. package/fesm2022/neural-ui-core-virtual-list.mjs +126 -0
  138. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -0
  139. package/fesm2022/neural-ui-core.mjs +11 -8544
  140. package/fesm2022/neural-ui-core.mjs.map +1 -1
  141. package/filter-bar/package.json +4 -0
  142. package/icon/package.json +4 -0
  143. package/image-viewer/package.json +4 -0
  144. package/input/package.json +4 -0
  145. package/input-otp/package.json +4 -0
  146. package/knob/package.json +4 -0
  147. package/meter-group/package.json +4 -0
  148. package/modal/package.json +4 -0
  149. package/multiselect/package.json +4 -0
  150. package/nav/package.json +4 -0
  151. package/notification-center/package.json +4 -0
  152. package/number-input/package.json +4 -0
  153. package/package.json +252 -5
  154. package/pagination/package.json +4 -0
  155. package/popover/package.json +4 -0
  156. package/progress-bar/package.json +4 -0
  157. package/radio/package.json +4 -0
  158. package/rating/package.json +4 -0
  159. package/select/package.json +4 -0
  160. package/sidebar/package.json +4 -0
  161. package/skeleton/package.json +4 -0
  162. package/slider/package.json +4 -0
  163. package/spinner/package.json +4 -0
  164. package/split-button/package.json +4 -0
  165. package/splitter/package.json +4 -0
  166. package/stats-card/package.json +4 -0
  167. package/stepper/package.json +4 -0
  168. package/styles/_tokens.scss +202 -0
  169. package/styles.scss +1 -0
  170. package/switch/package.json +4 -0
  171. package/table/package.json +4 -0
  172. package/tabs/package.json +4 -0
  173. package/textarea/package.json +4 -0
  174. package/timeline/package.json +4 -0
  175. package/toast/package.json +4 -0
  176. package/toggle-button-group/package.json +4 -0
  177. package/toolbar/package.json +4 -0
  178. package/tooltip/package.json +4 -0
  179. package/types/neural-ui-core-accordion.d.ts +55 -0
  180. package/types/neural-ui-core-alert.d.ts +47 -0
  181. package/types/neural-ui-core-autocomplete.d.ts +75 -0
  182. package/types/neural-ui-core-avatar.d.ts +39 -0
  183. package/types/neural-ui-core-badge.d.ts +36 -0
  184. package/types/neural-ui-core-block-ui.d.ts +46 -0
  185. package/types/neural-ui-core-breadcrumb.d.ts +38 -0
  186. package/types/neural-ui-core-button.d.ts +55 -0
  187. package/types/neural-ui-core-card.d.ts +37 -0
  188. package/types/neural-ui-core-chart.d.ts +236 -0
  189. package/types/neural-ui-core-checkbox.d.ts +33 -0
  190. package/types/neural-ui-core-chip.d.ts +53 -0
  191. package/types/neural-ui-core-code-block.d.ts +55 -0
  192. package/types/neural-ui-core-color-picker.d.ts +55 -0
  193. package/types/neural-ui-core-command-palette.d.ts +56 -0
  194. package/types/neural-ui-core-confirm-dialog.d.ts +50 -0
  195. package/types/neural-ui-core-context-menu.d.ts +66 -0
  196. package/types/neural-ui-core-dashboard-grid.d.ts +41 -0
  197. package/types/neural-ui-core-date-input.d.ts +178 -0
  198. package/types/neural-ui-core-divider.d.ts +20 -0
  199. package/types/neural-ui-core-empty-state.d.ts +32 -0
  200. package/types/neural-ui-core-filter-bar.d.ts +49 -0
  201. package/types/neural-ui-core-icon.d.ts +33 -0
  202. package/types/neural-ui-core-image-viewer.d.ts +67 -0
  203. package/types/neural-ui-core-input-otp.d.ts +49 -0
  204. package/types/neural-ui-core-input.d.ts +86 -0
  205. package/types/neural-ui-core-knob.d.ts +68 -0
  206. package/types/neural-ui-core-meter-group.d.ts +52 -0
  207. package/types/neural-ui-core-modal.d.ts +54 -0
  208. package/types/neural-ui-core-multiselect.d.ts +138 -0
  209. package/types/neural-ui-core-nav.d.ts +69 -0
  210. package/types/neural-ui-core-notification-center.d.ts +60 -0
  211. package/types/neural-ui-core-number-input.d.ts +63 -0
  212. package/types/neural-ui-core-pagination.d.ts +30 -0
  213. package/types/neural-ui-core-popover.d.ts +73 -0
  214. package/types/neural-ui-core-progress-bar.d.ts +35 -0
  215. package/types/neural-ui-core-radio.d.ts +51 -0
  216. package/types/neural-ui-core-rating.d.ts +34 -0
  217. package/types/neural-ui-core-select.d.ts +170 -0
  218. package/types/neural-ui-core-sidebar.d.ts +57 -0
  219. package/types/neural-ui-core-skeleton.d.ts +22 -0
  220. package/types/neural-ui-core-slider.d.ts +42 -0
  221. package/types/neural-ui-core-spinner.d.ts +38 -0
  222. package/types/neural-ui-core-split-button.d.ts +65 -0
  223. package/types/neural-ui-core-splitter.d.ts +28 -0
  224. package/types/neural-ui-core-stats-card.d.ts +39 -0
  225. package/types/neural-ui-core-stepper.d.ts +51 -0
  226. package/types/neural-ui-core-switch.d.ts +34 -0
  227. package/types/neural-ui-core-table.d.ts +285 -0
  228. package/types/neural-ui-core-tabs.d.ts +88 -0
  229. package/types/neural-ui-core-textarea.d.ts +52 -0
  230. package/types/neural-ui-core-timeline.d.ts +33 -0
  231. package/types/neural-ui-core-toast.d.ts +70 -0
  232. package/types/neural-ui-core-toggle-button-group.d.ts +63 -0
  233. package/types/neural-ui-core-toolbar.d.ts +36 -0
  234. package/types/neural-ui-core-tooltip.d.ts +48 -0
  235. package/types/neural-ui-core-url-state.d.ts +58 -0
  236. package/types/neural-ui-core-virtual-list.d.ts +60 -0
  237. package/types/neural-ui-core.d.ts +3 -2105
  238. package/url-state/package.json +4 -0
  239. package/virtual-list/package.json +4 -0
@@ -0,0 +1,952 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, output, signal, effect, afterNextRender, DestroyRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { Router, NavigationEnd, RouterLink, RouterLinkActive } from '@angular/router';
4
+ import { filter } from 'rxjs';
5
+ import { toSignal } from '@angular/core/rxjs-interop';
6
+ import { NeuIconComponent } from '@neural-ui/core/icon';
7
+ import { NeuTooltipDirective } from '@neural-ui/core/tooltip';
8
+
9
+ class NeuNavComponent {
10
+ router = inject(Router);
11
+ // ---- Señal reactiva de ruta activa / Reactive active route signal ----
12
+ currentUrl = toSignal(this.router.events.pipe(filter((e) => e instanceof NavigationEnd)), { initialValue: null });
13
+ // ---- Inputs ----
14
+ /** Lista de ítems de navegación / Navigation item list */
15
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
16
+ /** Estado inicial colapsado / Initial collapsed state */
17
+ collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
18
+ /** Muestra el botón de colapsar/expandir / Shows the collapse/expand button */
19
+ collapsible = input(true, ...(ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []));
20
+ /** Etiqueta accesible del <nav> / Accessible label for the <nav> */
21
+ ariaLabel = input('Navegación principal', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
22
+ /** Aria-label del botón cuando el nav está colapsado / Aria-label for the button when the nav is collapsed */
23
+ expandLabel = input('Expandir menú', ...(ngDevMode ? [{ debugName: "expandLabel" }] : /* istanbul ignore next */ []));
24
+ /** Aria-label del botón cuando el nav está expandido / Aria-label for the button when the nav is expanded */
25
+ collapseLabel = input('Colapsar menú', ...(ngDevMode ? [{ debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
26
+ /** Emite cuando cambia el estado colapsado / Emits when the collapsed state changes */
27
+ collapsedChange = output();
28
+ // ---- Estado interno / Internal state ----
29
+ // Sigue el input `collapsed` del padre (permite el configurador)
30
+ // pero puede ser sobreescrito localmente con toggleCollapse()
31
+ isCollapsed = signal(this.collapsed(), ...(ngDevMode ? [{ debugName: "isCollapsed" }] : /* istanbul ignore next */ []));
32
+ openGroups = signal(new Set(), ...(ngDevMode ? [{ debugName: "openGroups" }] : /* istanbul ignore next */ []));
33
+ // ---- Flyout para modo colapsado / Flyout for collapsed mode ----
34
+ flyoutState = signal(null, ...(ngDevMode ? [{ debugName: "flyoutState" }] : /* istanbul ignore next */ []));
35
+ _flyoutTimer = null;
36
+ constructor() {
37
+ // Sincroniza isCollapsed cuando el input cambia desde el padre
38
+ effect(() => this.isCollapsed.set(this.collapsed()), { allowSignalWrites: true });
39
+ // Abrimos el grupo activo DESPUÉS de que el padre haya pasado los inputs
40
+ afterNextRender(() => this._openActiveGroup());
41
+ // Limpiamos el timer del flyout al destruir el componente
42
+ inject(DestroyRef).onDestroy(() => {
43
+ if (this._flyoutTimer)
44
+ clearTimeout(this._flyoutTimer);
45
+ });
46
+ }
47
+ // ---- Helpers de estado / State helpers ----
48
+ toggleCollapse() {
49
+ this.isCollapsed.update((v) => {
50
+ const next = !v;
51
+ this.collapsedChange.emit(next);
52
+ return next;
53
+ });
54
+ }
55
+ toggleGroup(id) {
56
+ this.openGroups.update((s) => {
57
+ const next = new Set(s);
58
+ if (next.has(id))
59
+ next.delete(id);
60
+ else
61
+ next.add(id);
62
+ return next;
63
+ });
64
+ }
65
+ isGroupOpen(id) {
66
+ return this.openGroups().has(id);
67
+ }
68
+ isCurrentRoute(route) {
69
+ if (!route)
70
+ return false;
71
+ // Consume la señal para que OnPush re-evalúe tras navegación
72
+ this.currentUrl();
73
+ return this.router.url === route || this.router.url.startsWith(route + '?');
74
+ }
75
+ isGroupActive(item) {
76
+ if (!item.children?.length)
77
+ return false;
78
+ return item.children.some((c) => this.isCurrentRoute(c.route ?? '') ||
79
+ (c.children?.some((g) => this.isCurrentRoute(g.route ?? '')) ?? false));
80
+ }
81
+ // ---- Flyout handlers ----
82
+ onGroupMouseEnter(item, event) {
83
+ if (!this.isCollapsed() || !item.children?.length)
84
+ return;
85
+ if (this._flyoutTimer) {
86
+ clearTimeout(this._flyoutTimer);
87
+ this._flyoutTimer = null;
88
+ }
89
+ const rect = event.currentTarget.getBoundingClientRect();
90
+ this.flyoutState.set({ item, top: rect.top, left: rect.right });
91
+ }
92
+ onGroupMouseLeave() {
93
+ if (!this.isCollapsed())
94
+ return;
95
+ this._flyoutTimer = setTimeout(() => this.flyoutState.set(null), 150);
96
+ }
97
+ onFlyoutMouseEnter() {
98
+ if (this._flyoutTimer) {
99
+ clearTimeout(this._flyoutTimer);
100
+ this._flyoutTimer = null;
101
+ }
102
+ }
103
+ onFlyoutMouseLeave() {
104
+ this._flyoutTimer = setTimeout(() => this.flyoutState.set(null), 150);
105
+ }
106
+ _openActiveGroup() {
107
+ const toOpen = new Set();
108
+ for (const item of this.items()) {
109
+ if (!item.children)
110
+ continue;
111
+ for (const child of item.children) {
112
+ if (child.route && this.router.url.startsWith(child.route)) {
113
+ toOpen.add(item.id);
114
+ }
115
+ if (child.children) {
116
+ for (const grand of child.children) {
117
+ if (grand.route && this.router.url.startsWith(grand.route)) {
118
+ toOpen.add(item.id);
119
+ toOpen.add(child.id);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ if (toOpen.size > 0) {
126
+ this.openGroups.set(toOpen);
127
+ }
128
+ }
129
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuNavComponent, isStandalone: true, selector: "neu-nav", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, expandLabel: { classPropertyName: "expandLabel", publicName: "expandLabel", isSignal: true, isRequired: false, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsedChange: "collapsedChange" }, ngImport: i0, template: `
131
+ <div class="neu-nav-wrapper" [class.neu-nav-wrapper--collapsed]="isCollapsed()">
132
+ <nav
133
+ class="neu-nav"
134
+ [class.neu-nav--collapsed]="isCollapsed()"
135
+ [attr.aria-label]="ariaLabel()"
136
+ >
137
+ <!-- Brand slot -->
138
+ <div class="neu-nav__brand">
139
+ <!-- Icono visible solo en modo colapsado -->
140
+ <div class="neu-nav__brand-icon">
141
+ <ng-content select="[neu-nav-brand-icon]" />
142
+ </div>
143
+ <!-- Contenido completo visible en modo expandido -->
144
+ <div class="neu-nav__brand-content">
145
+ <ng-content select="[neu-nav-brand]" />
146
+ </div>
147
+ </div>
148
+
149
+ <!-- Items (nivel 1) -->
150
+ <div class="neu-nav__items" role="list">
151
+ @for (item of items(); track item.id) {
152
+ @if (item.children?.length) {
153
+ <!-- NIVEL 1 — Grupo acordeón -->
154
+ <div
155
+ class="neu-nav__group"
156
+ [class.neu-nav__group--open]="isGroupOpen(item.id)"
157
+ role="listitem"
158
+ (mouseenter)="onGroupMouseEnter(item, $event)"
159
+ (mouseleave)="onGroupMouseLeave()"
160
+ >
161
+ <button
162
+ class="neu-nav__item neu-nav__item--parent"
163
+ type="button"
164
+ [class.neu-nav__item--active]="isGroupActive(item)"
165
+ [class.neu-nav__item--disabled]="item.disabled"
166
+ [attr.aria-expanded]="isGroupOpen(item.id)"
167
+ [attr.aria-haspopup]="true"
168
+ [attr.disabled]="item.disabled ? '' : null"
169
+ [neuTooltip]="isCollapsed() ? item.label : ''"
170
+ neuTooltipPosition="right"
171
+ (click)="!isCollapsed() && toggleGroup(item.id)"
172
+ >
173
+ <neu-icon
174
+ [name]="item.icon"
175
+ size="18px"
176
+ class="neu-nav__item-icon"
177
+ aria-hidden="true"
178
+ />
179
+ <span class="neu-nav__item-label">{{ item.label }}</span>
180
+ @if (item.badge) {
181
+ <span
182
+ class="neu-nav__item-badge neu-nav__item-badge--{{
183
+ item.badgeVariant ?? 'default'
184
+ }}"
185
+ >{{ item.badge }}</span
186
+ >
187
+ }
188
+ <neu-icon
189
+ name="lucideChevronRight"
190
+ size="14px"
191
+ class="neu-nav__group-chevron"
192
+ aria-hidden="true"
193
+ />
194
+ </button>
195
+
196
+ <!-- Submenú nivel 2 -->
197
+ @if (!isCollapsed() && isGroupOpen(item.id)) {
198
+ <div class="neu-nav__submenu" role="list">
199
+ @for (child of item.children; track child.id) {
200
+ @if (child.children?.length) {
201
+ <!-- NIVEL 2 — Subgrupo acordeón -->
202
+ <div
203
+ class="neu-nav__group neu-nav__group--nested"
204
+ [class.neu-nav__group--open]="isGroupOpen(child.id)"
205
+ role="listitem"
206
+ >
207
+ <button
208
+ class="neu-nav__item neu-nav__item--child neu-nav__item--parent"
209
+ type="button"
210
+ [class.neu-nav__item--active]="isGroupActive(child)"
211
+ [class.neu-nav__item--disabled]="child.disabled"
212
+ [attr.aria-expanded]="isGroupOpen(child.id)"
213
+ [attr.aria-haspopup]="true"
214
+ [attr.disabled]="child.disabled ? '' : null"
215
+ (click)="toggleGroup(child.id)"
216
+ >
217
+ <neu-icon
218
+ [name]="child.icon"
219
+ size="15px"
220
+ class="neu-nav__item-icon"
221
+ aria-hidden="true"
222
+ />
223
+ <span class="neu-nav__item-label">{{ child.label }}</span>
224
+ @if (child.badge) {
225
+ <span
226
+ class="neu-nav__item-badge neu-nav__item-badge--{{
227
+ child.badgeVariant ?? 'default'
228
+ }}"
229
+ >{{ child.badge }}</span
230
+ >
231
+ }
232
+ <neu-icon
233
+ name="lucideChevronRight"
234
+ size="13px"
235
+ class="neu-nav__group-chevron"
236
+ aria-hidden="true"
237
+ />
238
+ </button>
239
+
240
+ <!-- Submenú nivel 3 -->
241
+ @if (isGroupOpen(child.id)) {
242
+ <div class="neu-nav__submenu neu-nav__submenu--nested" role="list">
243
+ @for (grand of child.children; track grand.id) {
244
+ @if (grand.href) {
245
+ <!-- NIVEL 3 — Enlace externo -->
246
+ <a
247
+ class="neu-nav__item neu-nav__item--grandchild"
248
+ [class.neu-nav__item--disabled]="grand.disabled"
249
+ [href]="grand.disabled ? null : grand.href"
250
+ target="_blank"
251
+ rel="noopener noreferrer"
252
+ [attr.aria-disabled]="grand.disabled ? 'true' : null"
253
+ role="listitem"
254
+ >
255
+ <neu-icon
256
+ [name]="grand.icon"
257
+ size="14px"
258
+ class="neu-nav__item-icon"
259
+ aria-hidden="true"
260
+ />
261
+ <span class="neu-nav__item-label">{{ grand.label }}</span>
262
+ <neu-icon
263
+ name="lucideExternalLink"
264
+ size="11px"
265
+ class="neu-nav__external-icon"
266
+ aria-hidden="true"
267
+ />
268
+ </a>
269
+ } @else {
270
+ <!-- NIVEL 3 — Enlace interno -->
271
+ <a
272
+ class="neu-nav__item neu-nav__item--grandchild"
273
+ [class.neu-nav__item--disabled]="grand.disabled"
274
+ [routerLink]="grand.disabled ? null : (grand.route ?? null)"
275
+ routerLinkActive="neu-nav__item--active"
276
+ [routerLinkActiveOptions]="{ exact: true }"
277
+ [attr.aria-current]="
278
+ isCurrentRoute(grand.route ?? '') ? 'page' : null
279
+ "
280
+ role="listitem"
281
+ >
282
+ <neu-icon
283
+ [name]="grand.icon"
284
+ size="14px"
285
+ class="neu-nav__item-icon"
286
+ aria-hidden="true"
287
+ />
288
+ <span class="neu-nav__item-label">{{ grand.label }}</span>
289
+ @if (grand.badge) {
290
+ <span
291
+ class="neu-nav__item-badge neu-nav__item-badge--{{
292
+ grand.badgeVariant ?? 'default'
293
+ }}"
294
+ >{{ grand.badge }}</span
295
+ >
296
+ }
297
+ </a>
298
+ }
299
+ }
300
+ </div>
301
+ }
302
+ </div>
303
+ } @else if (child.href) {
304
+ <!-- NIVEL 2 — Enlace externo -->
305
+ <a
306
+ class="neu-nav__item neu-nav__item--child"
307
+ [class.neu-nav__item--disabled]="child.disabled"
308
+ [href]="child.disabled ? null : child.href"
309
+ target="_blank"
310
+ rel="noopener noreferrer"
311
+ [attr.aria-disabled]="child.disabled ? 'true' : null"
312
+ role="listitem"
313
+ >
314
+ <neu-icon
315
+ [name]="child.icon"
316
+ size="15px"
317
+ class="neu-nav__item-icon"
318
+ aria-hidden="true"
319
+ />
320
+ <span class="neu-nav__item-label">{{ child.label }}</span>
321
+ @if (child.badge) {
322
+ <span
323
+ class="neu-nav__item-badge neu-nav__item-badge--{{
324
+ child.badgeVariant ?? 'default'
325
+ }}"
326
+ >{{ child.badge }}</span
327
+ >
328
+ }
329
+ <neu-icon
330
+ name="lucideExternalLink"
331
+ size="12px"
332
+ class="neu-nav__external-icon"
333
+ aria-hidden="true"
334
+ />
335
+ </a>
336
+ } @else {
337
+ <!-- NIVEL 2 — Enlace interno -->
338
+ <a
339
+ class="neu-nav__item neu-nav__item--child"
340
+ [class.neu-nav__item--disabled]="child.disabled"
341
+ [routerLink]="child.disabled ? null : (child.route ?? null)"
342
+ routerLinkActive="neu-nav__item--active"
343
+ [routerLinkActiveOptions]="{ exact: true }"
344
+ [attr.aria-current]="isCurrentRoute(child.route ?? '') ? 'page' : null"
345
+ role="listitem"
346
+ >
347
+ <neu-icon
348
+ [name]="child.icon"
349
+ size="15px"
350
+ class="neu-nav__item-icon"
351
+ aria-hidden="true"
352
+ />
353
+ <span class="neu-nav__item-label">{{ child.label }}</span>
354
+ @if (child.badge) {
355
+ <span
356
+ class="neu-nav__item-badge neu-nav__item-badge--{{
357
+ child.badgeVariant ?? 'default'
358
+ }}"
359
+ >{{ child.badge }}</span
360
+ >
361
+ }
362
+ </a>
363
+ }
364
+ }
365
+ </div>
366
+ }
367
+ </div>
368
+ } @else if (item.href) {
369
+ <!-- NIVEL 1 — Enlace externo -->
370
+ <a
371
+ class="neu-nav__item"
372
+ [class.neu-nav__item--disabled]="item.disabled"
373
+ [href]="item.disabled ? null : item.href"
374
+ target="_blank"
375
+ rel="noopener noreferrer"
376
+ [attr.aria-disabled]="item.disabled ? 'true' : null"
377
+ [neuTooltip]="isCollapsed() ? item.label : ''"
378
+ neuTooltipPosition="right"
379
+ role="listitem"
380
+ >
381
+ <neu-icon
382
+ [name]="item.icon"
383
+ size="18px"
384
+ class="neu-nav__item-icon"
385
+ aria-hidden="true"
386
+ />
387
+ <span class="neu-nav__item-label">{{ item.label }}</span>
388
+ @if (item.badge) {
389
+ <span
390
+ class="neu-nav__item-badge neu-nav__item-badge--{{
391
+ item.badgeVariant ?? 'default'
392
+ }}"
393
+ >{{ item.badge }}</span
394
+ >
395
+ }
396
+ <neu-icon
397
+ name="lucideExternalLink"
398
+ size="13px"
399
+ class="neu-nav__external-icon"
400
+ aria-hidden="true"
401
+ />
402
+ </a>
403
+ } @else {
404
+ <!-- NIVEL 1 — Enlace interno -->
405
+ <a
406
+ class="neu-nav__item"
407
+ [class.neu-nav__item--disabled]="item.disabled"
408
+ [routerLink]="item.disabled ? null : (item.route ?? null)"
409
+ routerLinkActive="neu-nav__item--active"
410
+ [routerLinkActiveOptions]="{ exact: item.route === '/' }"
411
+ [attr.aria-current]="isCurrentRoute(item.route ?? '') ? 'page' : null"
412
+ [neuTooltip]="isCollapsed() ? item.label : ''"
413
+ neuTooltipPosition="right"
414
+ role="listitem"
415
+ >
416
+ <neu-icon
417
+ [name]="item.icon"
418
+ size="18px"
419
+ class="neu-nav__item-icon"
420
+ aria-hidden="true"
421
+ />
422
+ <span class="neu-nav__item-label">{{ item.label }}</span>
423
+ @if (item.badge) {
424
+ <span
425
+ class="neu-nav__item-badge neu-nav__item-badge--{{
426
+ item.badgeVariant ?? 'default'
427
+ }}"
428
+ >{{ item.badge }}</span
429
+ >
430
+ }
431
+ </a>
432
+ }
433
+ }
434
+ </div>
435
+
436
+ <!-- Footer slot -->
437
+ <div class="neu-nav__footer">
438
+ <ng-content select="[neu-nav-footer]" />
439
+ </div>
440
+ </nav>
441
+
442
+ <!-- Flyout panel para grupos en modo colapsado -->
443
+ @if (flyoutState(); as flyout) {
444
+ <div
445
+ class="neu-nav__flyout"
446
+ [style.top.px]="flyout.top"
447
+ [style.left.px]="flyout.left"
448
+ role="menu"
449
+ (mouseenter)="onFlyoutMouseEnter()"
450
+ (mouseleave)="onFlyoutMouseLeave()"
451
+ >
452
+ <div class="neu-nav__flyout-title">{{ flyout.item.label }}</div>
453
+ @for (child of flyout.item.children ?? []; track child.id) {
454
+ @if (child.children?.length) {
455
+ <div class="neu-nav__flyout-group">
456
+ <span class="neu-nav__flyout-group-label">{{ child.label }}</span>
457
+ @for (grand of child.children; track grand.id) {
458
+ @if (grand.href) {
459
+ <a
460
+ class="neu-nav__flyout-item"
461
+ role="menuitem"
462
+ [href]="grand.href"
463
+ target="_blank"
464
+ rel="noopener noreferrer"
465
+ (click)="flyoutState.set(null)"
466
+ >
467
+ <neu-icon [name]="grand.icon" size="13px" aria-hidden="true" />
468
+ <span>{{ grand.label }}</span>
469
+ <neu-icon
470
+ name="lucideExternalLink"
471
+ size="10px"
472
+ class="neu-nav__external-icon"
473
+ />
474
+ </a>
475
+ } @else {
476
+ <a
477
+ class="neu-nav__flyout-item"
478
+ role="menuitem"
479
+ [routerLink]="grand.route"
480
+ routerLinkActive="neu-nav__flyout-item--active"
481
+ (click)="flyoutState.set(null)"
482
+ >
483
+ <neu-icon [name]="grand.icon" size="13px" aria-hidden="true" />
484
+ <span>{{ grand.label }}</span>
485
+ </a>
486
+ }
487
+ }
488
+ </div>
489
+ } @else if (child.href) {
490
+ <a
491
+ class="neu-nav__flyout-item"
492
+ role="menuitem"
493
+ [href]="child.href"
494
+ target="_blank"
495
+ rel="noopener noreferrer"
496
+ (click)="flyoutState.set(null)"
497
+ >
498
+ <neu-icon [name]="child.icon" size="13px" aria-hidden="true" />
499
+ <span>{{ child.label }}</span>
500
+ <neu-icon name="lucideExternalLink" size="10px" class="neu-nav__external-icon" />
501
+ </a>
502
+ } @else {
503
+ <a
504
+ class="neu-nav__flyout-item"
505
+ role="menuitem"
506
+ [routerLink]="child.route"
507
+ routerLinkActive="neu-nav__flyout-item--active"
508
+ (click)="flyoutState.set(null)"
509
+ >
510
+ <neu-icon [name]="child.icon" size="13px" aria-hidden="true" />
511
+ <span>{{ child.label }}</span>
512
+ </a>
513
+ }
514
+ }
515
+ </div>
516
+ }
517
+
518
+ <!-- Pestaña collapse/expand — fuera del nav para no ser recortada -->
519
+ @if (collapsible()) {
520
+ <button
521
+ class="neu-nav__toggle-tab"
522
+ type="button"
523
+ [attr.aria-label]="isCollapsed() ? expandLabel() : collapseLabel()"
524
+ [attr.aria-expanded]="!isCollapsed()"
525
+ (click)="toggleCollapse()"
526
+ >
527
+ <neu-icon
528
+ [name]="isCollapsed() ? 'lucideChevronRight' : 'lucideChevronLeft'"
529
+ size="12px"
530
+ aria-hidden="true"
531
+ />
532
+ </button>
533
+ }
534
+ </div>
535
+ `, isInline: true, styles: ["@charset \"UTF-8\";.neu-nav{display:flex;flex-direction:column;width:268px;height:100%;background:var(--neu-surface);border-right:1px solid var(--neu-border);transition:width .28s cubic-bezier(.4,0,.2,1);overflow:hidden;flex-shrink:0;-webkit-user-select:none;user-select:none}.neu-nav--collapsed{width:64px}.neu-nav--collapsed .neu-nav__brand{justify-content:center;padding:0;gap:0}.neu-nav--collapsed .neu-nav__brand-content{flex:0 0 0;width:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav--collapsed .neu-nav__items{padding-left:0;padding-right:0}.neu-nav--collapsed .neu-nav__item{justify-content:center;width:64px;padding:0;gap:0}.neu-nav--collapsed .neu-nav__item--parent .neu-nav__group-chevron{margin-left:0}.neu-nav--collapsed .neu-nav__item-label,.neu-nav--collapsed .neu-nav__item-badge,.neu-nav--collapsed .neu-nav__group-chevron,.neu-nav--collapsed .neu-nav__external-icon{flex:0 0 0;width:0;margin:0;opacity:0;overflow:hidden;pointer-events:none;white-space:nowrap}.neu-nav--collapsed .neu-nav__footer{height:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav__brand{display:flex;align-items:center;justify-content:space-between;min-height:64px;padding:0 var(--neu-space-4);border-bottom:1px solid var(--neu-border);flex-shrink:0;gap:var(--neu-space-3)}.neu-nav__brand-content{flex:1;min-width:0;display:flex;align-items:center;gap:10px;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1);overflow:hidden}.neu-nav__brand-icon{display:none;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:inherit}.neu-nav__brand-icon:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav--collapsed .neu-nav__brand-icon{display:flex}.neu-nav-wrapper{position:relative;height:100%;flex-shrink:0;display:flex}.neu-nav__toggle-tab{position:absolute;right:-13px;top:16px;transform:none;width:13px;height:40px;display:flex;align-items:center;justify-content:center;background:var(--neu-surface);border:1px solid var(--neu-border);border-left:none;border-radius:0 6px 6px 0;color:var(--neu-text-muted);cursor:pointer;padding:0;z-index:10;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__toggle-tab:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__toggle-tab:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-nav__items{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) var(--neu-space-2);display:flex;flex-direction:column;gap:2px}.neu-nav__items::-webkit-scrollbar{width:4px}.neu-nav__items::-webkit-scrollbar-track{background:transparent}.neu-nav__items::-webkit-scrollbar-thumb{background:var(--neu-border);border-radius:4px}.neu-nav__item{position:relative;display:flex;align-items:center;gap:10px;height:40px;padding:0 var(--neu-space-3);border-radius:8px;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;background:none;border:none;font-family:inherit;width:100%;text-align:left;transition:background var(--neu-transition),color var(--neu-transition);white-space:nowrap;flex-shrink:0}.neu-nav__item:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav__item:hover:not(.neu-nav__item--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__item:hover:not(.neu-nav__item--disabled) .neu-nav__item-icon{color:var(--neu-text)}.neu-nav__item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__item--active .neu-nav__item-icon{color:var(--neu-primary)}.neu-nav__item--active:before{content:\"\";position:absolute;left:0;top:6px;bottom:6px;width:3px;background:var(--neu-primary);border-radius:0 var(--neu-radius-full) var(--neu-radius-full) 0}.neu-nav__item--disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.neu-nav__item--child{height:36px;padding-left:calc(var(--neu-space-3) + 6px);font-size:.8125rem}.neu-nav__item--parent .neu-nav__group-chevron{margin-left:auto;flex-shrink:0;transition:transform var(--neu-transition);color:var(--neu-text-disabled)}.neu-nav__item-icon{flex-shrink:0;color:var(--neu-text-disabled);transition:color var(--neu-transition)}.neu-nav__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1)}.neu-nav__item-badge{flex-shrink:0;font-size:10px;font-weight:700;line-height:1;padding:2px 6px;border-radius:var(--neu-radius-full);text-transform:uppercase;letter-spacing:.04em;transition:opacity .2s ease}.neu-nav__item-badge--default{background:var(--neu-surface-3);color:var(--neu-text-muted)}.neu-nav__item-badge--success{background:var(--neu-success-bg);color:var(--neu-success-text)}.neu-nav__item-badge--warning{background:var(--neu-warning-bg);color:var(--neu-warning-text)}.neu-nav__item-badge--danger{background:var(--neu-error-bg);color:var(--neu-error-text)}.neu-nav__item-badge--info{background:var(--neu-info-bg);color:var(--neu-info-text)}.neu-nav__group{display:flex;flex-direction:column}.neu-nav__group--open .neu-nav__group-chevron{transform:rotate(90deg)}.neu-nav__group--open>.neu-nav__item--parent{color:var(--neu-text);background:var(--neu-surface-2)}.neu-nav__group--open>.neu-nav__item--parent .neu-nav__item-icon{color:var(--neu-text-muted)}.neu-nav__submenu{display:flex;flex-direction:column;gap:1px;padding:2px 0 4px var(--neu-space-3);margin-top:2px;border-left:2px solid var(--neu-border);margin-left:calc(var(--neu-space-3) + 9px)}.neu-nav__submenu--nested{padding-left:var(--neu-space-2);margin-left:calc(var(--neu-space-2) + 7px);border-color:var(--neu-border);border-left-style:dashed}.neu-nav__item--grandchild{height:32px;padding-left:calc(var(--neu-space-2) + 4px);font-size:.75rem}.neu-nav__external-icon{flex-shrink:0;margin-left:auto;color:var(--neu-text-disabled);opacity:.7;transition:opacity var(--neu-transition),color var(--neu-transition)}.neu-nav__item:hover .neu-nav__external-icon{opacity:1;color:var(--neu-text-muted)}.neu-nav__footer{border-top:1px solid var(--neu-border);padding:var(--neu-space-3) var(--neu-space-4);flex-shrink:0;font-size:var(--neu-text-xs);color:var(--neu-text-muted);transition:opacity .2s ease,height .28s cubic-bezier(.4,0,.2,1)}.neu-nav--collapsed .neu-nav__item--parent:after{content:\"\\203a\";position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:11px;line-height:1;color:var(--neu-text-disabled);pointer-events:none}.neu-nav__flyout{position:fixed;z-index:1000;min-width:200px;max-width:240px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:8px;box-shadow:0 4px 20px #0000001f;padding:6px;margin-left:6px}.neu-nav__flyout-title{font-size:.6875rem;font-weight:700;color:var(--neu-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:4px 8px 6px}.neu-nav__flyout-item{display:flex;align-items:center;gap:8px;height:34px;padding:0 8px;border-radius:6px;font-size:.8125rem;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__flyout-item:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__flyout-item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__flyout-item .neu-nav__external-icon{margin-left:auto;opacity:.6}.neu-nav__flyout-group{margin-top:4px;padding-top:4px;border-top:1px solid var(--neu-border)}.neu-nav__flyout-group-label{display:block;font-size:.6875rem;font-weight:600;color:var(--neu-text-disabled);text-transform:uppercase;letter-spacing:.05em;padding:2px 8px 4px}\n"], dependencies: [{ 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: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }, { kind: "directive", type: NeuTooltipDirective, selector: "[neuTooltip]", inputs: ["neuTooltip", "neuTooltipPosition", "neuTooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
536
+ }
537
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuNavComponent, decorators: [{
538
+ type: Component,
539
+ args: [{ selector: 'neu-nav', imports: [RouterLink, RouterLinkActive, NeuIconComponent, NeuTooltipDirective], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
540
+ <div class="neu-nav-wrapper" [class.neu-nav-wrapper--collapsed]="isCollapsed()">
541
+ <nav
542
+ class="neu-nav"
543
+ [class.neu-nav--collapsed]="isCollapsed()"
544
+ [attr.aria-label]="ariaLabel()"
545
+ >
546
+ <!-- Brand slot -->
547
+ <div class="neu-nav__brand">
548
+ <!-- Icono visible solo en modo colapsado -->
549
+ <div class="neu-nav__brand-icon">
550
+ <ng-content select="[neu-nav-brand-icon]" />
551
+ </div>
552
+ <!-- Contenido completo visible en modo expandido -->
553
+ <div class="neu-nav__brand-content">
554
+ <ng-content select="[neu-nav-brand]" />
555
+ </div>
556
+ </div>
557
+
558
+ <!-- Items (nivel 1) -->
559
+ <div class="neu-nav__items" role="list">
560
+ @for (item of items(); track item.id) {
561
+ @if (item.children?.length) {
562
+ <!-- NIVEL 1 — Grupo acordeón -->
563
+ <div
564
+ class="neu-nav__group"
565
+ [class.neu-nav__group--open]="isGroupOpen(item.id)"
566
+ role="listitem"
567
+ (mouseenter)="onGroupMouseEnter(item, $event)"
568
+ (mouseleave)="onGroupMouseLeave()"
569
+ >
570
+ <button
571
+ class="neu-nav__item neu-nav__item--parent"
572
+ type="button"
573
+ [class.neu-nav__item--active]="isGroupActive(item)"
574
+ [class.neu-nav__item--disabled]="item.disabled"
575
+ [attr.aria-expanded]="isGroupOpen(item.id)"
576
+ [attr.aria-haspopup]="true"
577
+ [attr.disabled]="item.disabled ? '' : null"
578
+ [neuTooltip]="isCollapsed() ? item.label : ''"
579
+ neuTooltipPosition="right"
580
+ (click)="!isCollapsed() && toggleGroup(item.id)"
581
+ >
582
+ <neu-icon
583
+ [name]="item.icon"
584
+ size="18px"
585
+ class="neu-nav__item-icon"
586
+ aria-hidden="true"
587
+ />
588
+ <span class="neu-nav__item-label">{{ item.label }}</span>
589
+ @if (item.badge) {
590
+ <span
591
+ class="neu-nav__item-badge neu-nav__item-badge--{{
592
+ item.badgeVariant ?? 'default'
593
+ }}"
594
+ >{{ item.badge }}</span
595
+ >
596
+ }
597
+ <neu-icon
598
+ name="lucideChevronRight"
599
+ size="14px"
600
+ class="neu-nav__group-chevron"
601
+ aria-hidden="true"
602
+ />
603
+ </button>
604
+
605
+ <!-- Submenú nivel 2 -->
606
+ @if (!isCollapsed() && isGroupOpen(item.id)) {
607
+ <div class="neu-nav__submenu" role="list">
608
+ @for (child of item.children; track child.id) {
609
+ @if (child.children?.length) {
610
+ <!-- NIVEL 2 — Subgrupo acordeón -->
611
+ <div
612
+ class="neu-nav__group neu-nav__group--nested"
613
+ [class.neu-nav__group--open]="isGroupOpen(child.id)"
614
+ role="listitem"
615
+ >
616
+ <button
617
+ class="neu-nav__item neu-nav__item--child neu-nav__item--parent"
618
+ type="button"
619
+ [class.neu-nav__item--active]="isGroupActive(child)"
620
+ [class.neu-nav__item--disabled]="child.disabled"
621
+ [attr.aria-expanded]="isGroupOpen(child.id)"
622
+ [attr.aria-haspopup]="true"
623
+ [attr.disabled]="child.disabled ? '' : null"
624
+ (click)="toggleGroup(child.id)"
625
+ >
626
+ <neu-icon
627
+ [name]="child.icon"
628
+ size="15px"
629
+ class="neu-nav__item-icon"
630
+ aria-hidden="true"
631
+ />
632
+ <span class="neu-nav__item-label">{{ child.label }}</span>
633
+ @if (child.badge) {
634
+ <span
635
+ class="neu-nav__item-badge neu-nav__item-badge--{{
636
+ child.badgeVariant ?? 'default'
637
+ }}"
638
+ >{{ child.badge }}</span
639
+ >
640
+ }
641
+ <neu-icon
642
+ name="lucideChevronRight"
643
+ size="13px"
644
+ class="neu-nav__group-chevron"
645
+ aria-hidden="true"
646
+ />
647
+ </button>
648
+
649
+ <!-- Submenú nivel 3 -->
650
+ @if (isGroupOpen(child.id)) {
651
+ <div class="neu-nav__submenu neu-nav__submenu--nested" role="list">
652
+ @for (grand of child.children; track grand.id) {
653
+ @if (grand.href) {
654
+ <!-- NIVEL 3 — Enlace externo -->
655
+ <a
656
+ class="neu-nav__item neu-nav__item--grandchild"
657
+ [class.neu-nav__item--disabled]="grand.disabled"
658
+ [href]="grand.disabled ? null : grand.href"
659
+ target="_blank"
660
+ rel="noopener noreferrer"
661
+ [attr.aria-disabled]="grand.disabled ? 'true' : null"
662
+ role="listitem"
663
+ >
664
+ <neu-icon
665
+ [name]="grand.icon"
666
+ size="14px"
667
+ class="neu-nav__item-icon"
668
+ aria-hidden="true"
669
+ />
670
+ <span class="neu-nav__item-label">{{ grand.label }}</span>
671
+ <neu-icon
672
+ name="lucideExternalLink"
673
+ size="11px"
674
+ class="neu-nav__external-icon"
675
+ aria-hidden="true"
676
+ />
677
+ </a>
678
+ } @else {
679
+ <!-- NIVEL 3 — Enlace interno -->
680
+ <a
681
+ class="neu-nav__item neu-nav__item--grandchild"
682
+ [class.neu-nav__item--disabled]="grand.disabled"
683
+ [routerLink]="grand.disabled ? null : (grand.route ?? null)"
684
+ routerLinkActive="neu-nav__item--active"
685
+ [routerLinkActiveOptions]="{ exact: true }"
686
+ [attr.aria-current]="
687
+ isCurrentRoute(grand.route ?? '') ? 'page' : null
688
+ "
689
+ role="listitem"
690
+ >
691
+ <neu-icon
692
+ [name]="grand.icon"
693
+ size="14px"
694
+ class="neu-nav__item-icon"
695
+ aria-hidden="true"
696
+ />
697
+ <span class="neu-nav__item-label">{{ grand.label }}</span>
698
+ @if (grand.badge) {
699
+ <span
700
+ class="neu-nav__item-badge neu-nav__item-badge--{{
701
+ grand.badgeVariant ?? 'default'
702
+ }}"
703
+ >{{ grand.badge }}</span
704
+ >
705
+ }
706
+ </a>
707
+ }
708
+ }
709
+ </div>
710
+ }
711
+ </div>
712
+ } @else if (child.href) {
713
+ <!-- NIVEL 2 — Enlace externo -->
714
+ <a
715
+ class="neu-nav__item neu-nav__item--child"
716
+ [class.neu-nav__item--disabled]="child.disabled"
717
+ [href]="child.disabled ? null : child.href"
718
+ target="_blank"
719
+ rel="noopener noreferrer"
720
+ [attr.aria-disabled]="child.disabled ? 'true' : null"
721
+ role="listitem"
722
+ >
723
+ <neu-icon
724
+ [name]="child.icon"
725
+ size="15px"
726
+ class="neu-nav__item-icon"
727
+ aria-hidden="true"
728
+ />
729
+ <span class="neu-nav__item-label">{{ child.label }}</span>
730
+ @if (child.badge) {
731
+ <span
732
+ class="neu-nav__item-badge neu-nav__item-badge--{{
733
+ child.badgeVariant ?? 'default'
734
+ }}"
735
+ >{{ child.badge }}</span
736
+ >
737
+ }
738
+ <neu-icon
739
+ name="lucideExternalLink"
740
+ size="12px"
741
+ class="neu-nav__external-icon"
742
+ aria-hidden="true"
743
+ />
744
+ </a>
745
+ } @else {
746
+ <!-- NIVEL 2 — Enlace interno -->
747
+ <a
748
+ class="neu-nav__item neu-nav__item--child"
749
+ [class.neu-nav__item--disabled]="child.disabled"
750
+ [routerLink]="child.disabled ? null : (child.route ?? null)"
751
+ routerLinkActive="neu-nav__item--active"
752
+ [routerLinkActiveOptions]="{ exact: true }"
753
+ [attr.aria-current]="isCurrentRoute(child.route ?? '') ? 'page' : null"
754
+ role="listitem"
755
+ >
756
+ <neu-icon
757
+ [name]="child.icon"
758
+ size="15px"
759
+ class="neu-nav__item-icon"
760
+ aria-hidden="true"
761
+ />
762
+ <span class="neu-nav__item-label">{{ child.label }}</span>
763
+ @if (child.badge) {
764
+ <span
765
+ class="neu-nav__item-badge neu-nav__item-badge--{{
766
+ child.badgeVariant ?? 'default'
767
+ }}"
768
+ >{{ child.badge }}</span
769
+ >
770
+ }
771
+ </a>
772
+ }
773
+ }
774
+ </div>
775
+ }
776
+ </div>
777
+ } @else if (item.href) {
778
+ <!-- NIVEL 1 — Enlace externo -->
779
+ <a
780
+ class="neu-nav__item"
781
+ [class.neu-nav__item--disabled]="item.disabled"
782
+ [href]="item.disabled ? null : item.href"
783
+ target="_blank"
784
+ rel="noopener noreferrer"
785
+ [attr.aria-disabled]="item.disabled ? 'true' : null"
786
+ [neuTooltip]="isCollapsed() ? item.label : ''"
787
+ neuTooltipPosition="right"
788
+ role="listitem"
789
+ >
790
+ <neu-icon
791
+ [name]="item.icon"
792
+ size="18px"
793
+ class="neu-nav__item-icon"
794
+ aria-hidden="true"
795
+ />
796
+ <span class="neu-nav__item-label">{{ item.label }}</span>
797
+ @if (item.badge) {
798
+ <span
799
+ class="neu-nav__item-badge neu-nav__item-badge--{{
800
+ item.badgeVariant ?? 'default'
801
+ }}"
802
+ >{{ item.badge }}</span
803
+ >
804
+ }
805
+ <neu-icon
806
+ name="lucideExternalLink"
807
+ size="13px"
808
+ class="neu-nav__external-icon"
809
+ aria-hidden="true"
810
+ />
811
+ </a>
812
+ } @else {
813
+ <!-- NIVEL 1 — Enlace interno -->
814
+ <a
815
+ class="neu-nav__item"
816
+ [class.neu-nav__item--disabled]="item.disabled"
817
+ [routerLink]="item.disabled ? null : (item.route ?? null)"
818
+ routerLinkActive="neu-nav__item--active"
819
+ [routerLinkActiveOptions]="{ exact: item.route === '/' }"
820
+ [attr.aria-current]="isCurrentRoute(item.route ?? '') ? 'page' : null"
821
+ [neuTooltip]="isCollapsed() ? item.label : ''"
822
+ neuTooltipPosition="right"
823
+ role="listitem"
824
+ >
825
+ <neu-icon
826
+ [name]="item.icon"
827
+ size="18px"
828
+ class="neu-nav__item-icon"
829
+ aria-hidden="true"
830
+ />
831
+ <span class="neu-nav__item-label">{{ item.label }}</span>
832
+ @if (item.badge) {
833
+ <span
834
+ class="neu-nav__item-badge neu-nav__item-badge--{{
835
+ item.badgeVariant ?? 'default'
836
+ }}"
837
+ >{{ item.badge }}</span
838
+ >
839
+ }
840
+ </a>
841
+ }
842
+ }
843
+ </div>
844
+
845
+ <!-- Footer slot -->
846
+ <div class="neu-nav__footer">
847
+ <ng-content select="[neu-nav-footer]" />
848
+ </div>
849
+ </nav>
850
+
851
+ <!-- Flyout panel para grupos en modo colapsado -->
852
+ @if (flyoutState(); as flyout) {
853
+ <div
854
+ class="neu-nav__flyout"
855
+ [style.top.px]="flyout.top"
856
+ [style.left.px]="flyout.left"
857
+ role="menu"
858
+ (mouseenter)="onFlyoutMouseEnter()"
859
+ (mouseleave)="onFlyoutMouseLeave()"
860
+ >
861
+ <div class="neu-nav__flyout-title">{{ flyout.item.label }}</div>
862
+ @for (child of flyout.item.children ?? []; track child.id) {
863
+ @if (child.children?.length) {
864
+ <div class="neu-nav__flyout-group">
865
+ <span class="neu-nav__flyout-group-label">{{ child.label }}</span>
866
+ @for (grand of child.children; track grand.id) {
867
+ @if (grand.href) {
868
+ <a
869
+ class="neu-nav__flyout-item"
870
+ role="menuitem"
871
+ [href]="grand.href"
872
+ target="_blank"
873
+ rel="noopener noreferrer"
874
+ (click)="flyoutState.set(null)"
875
+ >
876
+ <neu-icon [name]="grand.icon" size="13px" aria-hidden="true" />
877
+ <span>{{ grand.label }}</span>
878
+ <neu-icon
879
+ name="lucideExternalLink"
880
+ size="10px"
881
+ class="neu-nav__external-icon"
882
+ />
883
+ </a>
884
+ } @else {
885
+ <a
886
+ class="neu-nav__flyout-item"
887
+ role="menuitem"
888
+ [routerLink]="grand.route"
889
+ routerLinkActive="neu-nav__flyout-item--active"
890
+ (click)="flyoutState.set(null)"
891
+ >
892
+ <neu-icon [name]="grand.icon" size="13px" aria-hidden="true" />
893
+ <span>{{ grand.label }}</span>
894
+ </a>
895
+ }
896
+ }
897
+ </div>
898
+ } @else if (child.href) {
899
+ <a
900
+ class="neu-nav__flyout-item"
901
+ role="menuitem"
902
+ [href]="child.href"
903
+ target="_blank"
904
+ rel="noopener noreferrer"
905
+ (click)="flyoutState.set(null)"
906
+ >
907
+ <neu-icon [name]="child.icon" size="13px" aria-hidden="true" />
908
+ <span>{{ child.label }}</span>
909
+ <neu-icon name="lucideExternalLink" size="10px" class="neu-nav__external-icon" />
910
+ </a>
911
+ } @else {
912
+ <a
913
+ class="neu-nav__flyout-item"
914
+ role="menuitem"
915
+ [routerLink]="child.route"
916
+ routerLinkActive="neu-nav__flyout-item--active"
917
+ (click)="flyoutState.set(null)"
918
+ >
919
+ <neu-icon [name]="child.icon" size="13px" aria-hidden="true" />
920
+ <span>{{ child.label }}</span>
921
+ </a>
922
+ }
923
+ }
924
+ </div>
925
+ }
926
+
927
+ <!-- Pestaña collapse/expand — fuera del nav para no ser recortada -->
928
+ @if (collapsible()) {
929
+ <button
930
+ class="neu-nav__toggle-tab"
931
+ type="button"
932
+ [attr.aria-label]="isCollapsed() ? expandLabel() : collapseLabel()"
933
+ [attr.aria-expanded]="!isCollapsed()"
934
+ (click)="toggleCollapse()"
935
+ >
936
+ <neu-icon
937
+ [name]="isCollapsed() ? 'lucideChevronRight' : 'lucideChevronLeft'"
938
+ size="12px"
939
+ aria-hidden="true"
940
+ />
941
+ </button>
942
+ }
943
+ </div>
944
+ `, styles: ["@charset \"UTF-8\";.neu-nav{display:flex;flex-direction:column;width:268px;height:100%;background:var(--neu-surface);border-right:1px solid var(--neu-border);transition:width .28s cubic-bezier(.4,0,.2,1);overflow:hidden;flex-shrink:0;-webkit-user-select:none;user-select:none}.neu-nav--collapsed{width:64px}.neu-nav--collapsed .neu-nav__brand{justify-content:center;padding:0;gap:0}.neu-nav--collapsed .neu-nav__brand-content{flex:0 0 0;width:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav--collapsed .neu-nav__items{padding-left:0;padding-right:0}.neu-nav--collapsed .neu-nav__item{justify-content:center;width:64px;padding:0;gap:0}.neu-nav--collapsed .neu-nav__item--parent .neu-nav__group-chevron{margin-left:0}.neu-nav--collapsed .neu-nav__item-label,.neu-nav--collapsed .neu-nav__item-badge,.neu-nav--collapsed .neu-nav__group-chevron,.neu-nav--collapsed .neu-nav__external-icon{flex:0 0 0;width:0;margin:0;opacity:0;overflow:hidden;pointer-events:none;white-space:nowrap}.neu-nav--collapsed .neu-nav__footer{height:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav__brand{display:flex;align-items:center;justify-content:space-between;min-height:64px;padding:0 var(--neu-space-4);border-bottom:1px solid var(--neu-border);flex-shrink:0;gap:var(--neu-space-3)}.neu-nav__brand-content{flex:1;min-width:0;display:flex;align-items:center;gap:10px;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1);overflow:hidden}.neu-nav__brand-icon{display:none;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:inherit}.neu-nav__brand-icon:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav--collapsed .neu-nav__brand-icon{display:flex}.neu-nav-wrapper{position:relative;height:100%;flex-shrink:0;display:flex}.neu-nav__toggle-tab{position:absolute;right:-13px;top:16px;transform:none;width:13px;height:40px;display:flex;align-items:center;justify-content:center;background:var(--neu-surface);border:1px solid var(--neu-border);border-left:none;border-radius:0 6px 6px 0;color:var(--neu-text-muted);cursor:pointer;padding:0;z-index:10;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__toggle-tab:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__toggle-tab:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-nav__items{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) var(--neu-space-2);display:flex;flex-direction:column;gap:2px}.neu-nav__items::-webkit-scrollbar{width:4px}.neu-nav__items::-webkit-scrollbar-track{background:transparent}.neu-nav__items::-webkit-scrollbar-thumb{background:var(--neu-border);border-radius:4px}.neu-nav__item{position:relative;display:flex;align-items:center;gap:10px;height:40px;padding:0 var(--neu-space-3);border-radius:8px;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;background:none;border:none;font-family:inherit;width:100%;text-align:left;transition:background var(--neu-transition),color var(--neu-transition);white-space:nowrap;flex-shrink:0}.neu-nav__item:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav__item:hover:not(.neu-nav__item--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__item:hover:not(.neu-nav__item--disabled) .neu-nav__item-icon{color:var(--neu-text)}.neu-nav__item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__item--active .neu-nav__item-icon{color:var(--neu-primary)}.neu-nav__item--active:before{content:\"\";position:absolute;left:0;top:6px;bottom:6px;width:3px;background:var(--neu-primary);border-radius:0 var(--neu-radius-full) var(--neu-radius-full) 0}.neu-nav__item--disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.neu-nav__item--child{height:36px;padding-left:calc(var(--neu-space-3) + 6px);font-size:.8125rem}.neu-nav__item--parent .neu-nav__group-chevron{margin-left:auto;flex-shrink:0;transition:transform var(--neu-transition);color:var(--neu-text-disabled)}.neu-nav__item-icon{flex-shrink:0;color:var(--neu-text-disabled);transition:color var(--neu-transition)}.neu-nav__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1)}.neu-nav__item-badge{flex-shrink:0;font-size:10px;font-weight:700;line-height:1;padding:2px 6px;border-radius:var(--neu-radius-full);text-transform:uppercase;letter-spacing:.04em;transition:opacity .2s ease}.neu-nav__item-badge--default{background:var(--neu-surface-3);color:var(--neu-text-muted)}.neu-nav__item-badge--success{background:var(--neu-success-bg);color:var(--neu-success-text)}.neu-nav__item-badge--warning{background:var(--neu-warning-bg);color:var(--neu-warning-text)}.neu-nav__item-badge--danger{background:var(--neu-error-bg);color:var(--neu-error-text)}.neu-nav__item-badge--info{background:var(--neu-info-bg);color:var(--neu-info-text)}.neu-nav__group{display:flex;flex-direction:column}.neu-nav__group--open .neu-nav__group-chevron{transform:rotate(90deg)}.neu-nav__group--open>.neu-nav__item--parent{color:var(--neu-text);background:var(--neu-surface-2)}.neu-nav__group--open>.neu-nav__item--parent .neu-nav__item-icon{color:var(--neu-text-muted)}.neu-nav__submenu{display:flex;flex-direction:column;gap:1px;padding:2px 0 4px var(--neu-space-3);margin-top:2px;border-left:2px solid var(--neu-border);margin-left:calc(var(--neu-space-3) + 9px)}.neu-nav__submenu--nested{padding-left:var(--neu-space-2);margin-left:calc(var(--neu-space-2) + 7px);border-color:var(--neu-border);border-left-style:dashed}.neu-nav__item--grandchild{height:32px;padding-left:calc(var(--neu-space-2) + 4px);font-size:.75rem}.neu-nav__external-icon{flex-shrink:0;margin-left:auto;color:var(--neu-text-disabled);opacity:.7;transition:opacity var(--neu-transition),color var(--neu-transition)}.neu-nav__item:hover .neu-nav__external-icon{opacity:1;color:var(--neu-text-muted)}.neu-nav__footer{border-top:1px solid var(--neu-border);padding:var(--neu-space-3) var(--neu-space-4);flex-shrink:0;font-size:var(--neu-text-xs);color:var(--neu-text-muted);transition:opacity .2s ease,height .28s cubic-bezier(.4,0,.2,1)}.neu-nav--collapsed .neu-nav__item--parent:after{content:\"\\203a\";position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:11px;line-height:1;color:var(--neu-text-disabled);pointer-events:none}.neu-nav__flyout{position:fixed;z-index:1000;min-width:200px;max-width:240px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:8px;box-shadow:0 4px 20px #0000001f;padding:6px;margin-left:6px}.neu-nav__flyout-title{font-size:.6875rem;font-weight:700;color:var(--neu-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:4px 8px 6px}.neu-nav__flyout-item{display:flex;align-items:center;gap:8px;height:34px;padding:0 8px;border-radius:6px;font-size:.8125rem;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__flyout-item:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__flyout-item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__flyout-item .neu-nav__external-icon{margin-left:auto;opacity:.6}.neu-nav__flyout-group{margin-top:4px;padding-top:4px;border-top:1px solid var(--neu-border)}.neu-nav__flyout-group-label{display:block;font-size:.6875rem;font-weight:600;color:var(--neu-text-disabled);text-transform:uppercase;letter-spacing:.05em;padding:2px 8px 4px}\n"] }]
945
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], expandLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandLabel", required: false }] }], collapseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseLabel", required: false }] }], collapsedChange: [{ type: i0.Output, args: ["collapsedChange"] }] } });
946
+
947
+ /**
948
+ * Generated bundle index. Do not edit.
949
+ */
950
+
951
+ export { NeuNavComponent };
952
+ //# sourceMappingURL=neural-ui-core-nav.mjs.map