@raintonic/formaui 0.3.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +80 -35
  2. package/README.md +22 -26
  3. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +39 -41
  4. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-cdk-form-field.mjs +207 -3
  6. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
  7. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +27 -2
  8. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
  9. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +5 -12
  10. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
  11. package/fesm2022/raintonic-formaui-components-accordion.mjs +8 -5
  12. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  13. package/fesm2022/raintonic-formaui-components-alert.mjs +16 -2
  14. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  15. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +255 -462
  16. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  17. package/fesm2022/raintonic-formaui-components-avatar.mjs +34 -59
  18. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  19. package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
  20. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +4 -4
  22. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
  24. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-button.mjs +15 -20
  26. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
  27. package/fesm2022/raintonic-formaui-components-card.mjs +2 -2
  28. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  29. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  30. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  31. package/fesm2022/raintonic-formaui-components-chip.mjs +97 -0
  32. package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -0
  33. package/fesm2022/raintonic-formaui-components-data-table.mjs +69 -29
  34. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-date-picker.mjs +223 -144
  36. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  38. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-drawer.mjs +2 -2
  40. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  41. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +888 -0
  42. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -0
  43. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +774 -0
  44. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -0
  45. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
  48. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-form-field.mjs +81 -50
  50. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
  52. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
  53. package/fesm2022/raintonic-formaui-components-input.mjs +47 -12
  54. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  55. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  56. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  57. package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -12
  58. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  59. package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
  60. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  61. package/fesm2022/raintonic-formaui-components-password-input.mjs +35 -110
  62. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  63. package/fesm2022/raintonic-formaui-components-popover.mjs +3 -2
  64. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  65. package/fesm2022/raintonic-formaui-components-progressbar.mjs +3 -2
  66. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  67. package/fesm2022/raintonic-formaui-components-radio.mjs +5 -6
  68. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  69. package/fesm2022/raintonic-formaui-components-select.mjs +257 -412
  70. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  71. package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
  72. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  73. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +525 -0
  74. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -0
  75. package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
  76. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
  80. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-stepper.mjs +50 -45
  82. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-components-strength-meter.mjs +149 -0
  84. package/fesm2022/raintonic-formaui-components-strength-meter.mjs.map +1 -0
  85. package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
  86. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  87. package/fesm2022/raintonic-formaui-components-time-picker.mjs +194 -154
  88. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  89. package/fesm2022/raintonic-formaui-components-toggle-group.mjs +302 -0
  90. package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -0
  91. package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
  92. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
  93. package/fesm2022/raintonic-formaui-components-toolbar.mjs +2 -2
  94. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  95. package/fesm2022/raintonic-formaui-components-tooltip.mjs +10 -4
  96. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  97. package/fesm2022/raintonic-formaui-components-topbar.mjs +60 -0
  98. package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -0
  99. package/fesm2022/raintonic-formaui-components-tree-select.mjs +59 -69
  100. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  101. package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
  102. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  103. package/fesm2022/raintonic-formaui-components-tree.mjs +31 -5
  104. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  105. package/fesm2022/raintonic-formaui-core.mjs +279 -1
  106. package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
  107. package/fesm2022/raintonic-formaui-services-breakpoint.mjs +93 -0
  108. package/fesm2022/raintonic-formaui-services-breakpoint.mjs.map +1 -0
  109. package/fesm2022/raintonic-formaui-services-dialog.mjs +314 -16
  110. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  111. package/fesm2022/raintonic-formaui-services-notification.mjs +93 -29
  112. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
  113. package/fesm2022/raintonic-formaui-services-theme.mjs +46 -196
  114. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
  115. package/fesm2022/raintonic-formaui.mjs +1 -1
  116. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  117. package/llms-full.txt +2329 -450
  118. package/llms.txt +36 -33
  119. package/package.json +42 -19
  120. package/styles/fonts/Geist-Bold.woff2 +0 -0
  121. package/styles/fonts/Geist-Italic.woff2 +0 -0
  122. package/styles/fonts/Geist-Light.woff2 +0 -0
  123. package/styles/fonts/Geist-Medium.woff2 +0 -0
  124. package/styles/fonts/Geist-Regular.woff2 +0 -0
  125. package/styles/fonts/Geist-SemiBold.woff2 +0 -0
  126. package/styles/fonts/GeistMono-Regular.woff2 +0 -0
  127. package/styles/generated/_tokens.scss +906 -0
  128. package/styles/index.scss +11 -10
  129. package/styles/partials/_brand.scss +46 -0
  130. package/styles/partials/_constants.scss +22 -20
  131. package/styles/partials/_fonts.scss +54 -10
  132. package/styles/partials/_grid.scss +29 -18
  133. package/styles/partials/_mixins.scss +69 -27
  134. package/styles/partials/_motion.scss +28 -33
  135. package/styles/partials/_theme.scss +28 -255
  136. package/styles/partials/_type.scss +117 -0
  137. package/styles/partials/_typography.scss +45 -45
  138. package/styles/partials/_utilities.scss +198 -98
  139. package/styles/partials/components/_button.scss +144 -75
  140. package/styles/partials/components/_dialog.scss +181 -180
  141. package/styles/partials/components/_overlay.scss +87 -87
  142. package/styles/partials/themes/_dark.scss +3 -268
  143. package/styles/partials/themes/_light.scss +4 -268
  144. package/styles/styles.css +7744 -0
  145. package/styles/styles.entry.scss +3 -0
  146. package/styles/utilities.css +4802 -0
  147. package/styles/utilities.entry.scss +3 -0
  148. package/types/raintonic-formaui-cdk-drag-drop.d.ts +0 -1
  149. package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -1
  150. package/types/raintonic-formaui-cdk-form-field.d.ts +118 -2
  151. package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -1
  152. package/types/raintonic-formaui-cdk-overlay.d.ts +2 -0
  153. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
  154. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +0 -1
  155. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -1
  156. package/types/raintonic-formaui-components-accordion.d.ts +1 -1
  157. package/types/raintonic-formaui-components-accordion.d.ts.map +1 -1
  158. package/types/raintonic-formaui-components-alert.d.ts +6 -1
  159. package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
  160. package/types/raintonic-formaui-components-autocomplete.d.ts +73 -116
  161. package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
  162. package/types/raintonic-formaui-components-avatar.d.ts +13 -31
  163. package/types/raintonic-formaui-components-avatar.d.ts.map +1 -1
  164. package/types/raintonic-formaui-components-button.d.ts +4 -10
  165. package/types/raintonic-formaui-components-button.d.ts.map +1 -1
  166. package/types/raintonic-formaui-components-chip.d.ts +43 -0
  167. package/types/raintonic-formaui-components-chip.d.ts.map +1 -0
  168. package/types/raintonic-formaui-components-data-table.d.ts +48 -11
  169. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  170. package/types/raintonic-formaui-components-date-picker.d.ts +59 -23
  171. package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
  172. package/types/raintonic-formaui-components-dropdown-menu.d.ts +394 -0
  173. package/types/raintonic-formaui-components-dropdown-menu.d.ts.map +1 -0
  174. package/types/raintonic-formaui-components-dual-tier-navigation.d.ts +87 -0
  175. package/types/raintonic-formaui-components-dual-tier-navigation.d.ts.map +1 -0
  176. package/types/raintonic-formaui-components-form-field.d.ts +51 -21
  177. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  178. package/types/raintonic-formaui-components-input.d.ts +20 -11
  179. package/types/raintonic-formaui-components-input.d.ts.map +1 -1
  180. package/types/raintonic-formaui-components-number-input.d.ts +5 -3
  181. package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
  182. package/types/raintonic-formaui-components-password-input.d.ts +18 -32
  183. package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
  184. package/types/raintonic-formaui-components-popover.d.ts.map +1 -1
  185. package/types/raintonic-formaui-components-progressbar.d.ts +1 -1
  186. package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
  187. package/types/raintonic-formaui-components-radio.d.ts +1 -2
  188. package/types/raintonic-formaui-components-radio.d.ts.map +1 -1
  189. package/types/raintonic-formaui-components-select.d.ts +107 -76
  190. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  191. package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts +223 -0
  192. package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts.map +1 -0
  193. package/types/raintonic-formaui-components-stepper.d.ts +4 -2
  194. package/types/raintonic-formaui-components-stepper.d.ts.map +1 -1
  195. package/types/raintonic-formaui-components-strength-meter.d.ts +78 -0
  196. package/types/raintonic-formaui-components-strength-meter.d.ts.map +1 -0
  197. package/types/raintonic-formaui-components-time-picker.d.ts +44 -24
  198. package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
  199. package/types/raintonic-formaui-components-toggle-group.d.ts +100 -0
  200. package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -0
  201. package/types/raintonic-formaui-components-tooltip.d.ts +2 -1
  202. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
  203. package/types/raintonic-formaui-components-topbar.d.ts +48 -0
  204. package/types/raintonic-formaui-components-topbar.d.ts.map +1 -0
  205. package/types/raintonic-formaui-components-tree-select.d.ts +25 -9
  206. package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -1
  207. package/types/raintonic-formaui-components-tree.d.ts +12 -1
  208. package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
  209. package/types/raintonic-formaui-core.d.ts +243 -5
  210. package/types/raintonic-formaui-core.d.ts.map +1 -1
  211. package/types/raintonic-formaui-services-breakpoint.d.ts +44 -0
  212. package/types/raintonic-formaui-services-breakpoint.d.ts.map +1 -0
  213. package/types/raintonic-formaui-services-dialog.d.ts +141 -2
  214. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
  215. package/types/raintonic-formaui-services-notification.d.ts +24 -2
  216. package/types/raintonic-formaui-services-notification.d.ts.map +1 -1
  217. package/types/raintonic-formaui-services-theme.d.ts +13 -103
  218. package/types/raintonic-formaui-services-theme.d.ts.map +1 -1
  219. package/types/raintonic-formaui.d.ts +1 -1
  220. package/fesm2022/raintonic-formaui-components-big-menu.mjs +0 -86
  221. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +0 -1
  222. package/fesm2022/raintonic-formaui-components-menu.mjs +0 -896
  223. package/fesm2022/raintonic-formaui-components-menu.mjs.map +0 -1
  224. package/fesm2022/raintonic-formaui-components-sidebar.mjs +0 -275
  225. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +0 -1
  226. package/fesm2022/raintonic-formaui-components-tag.mjs +0 -95
  227. package/fesm2022/raintonic-formaui-components-tag.mjs.map +0 -1
  228. package/styles/_fonts-entry.scss +0 -3
  229. package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
  230. package/styles/fonts/inter-tight-latin.woff2 +0 -0
  231. package/types/raintonic-formaui-components-big-menu.d.ts +0 -73
  232. package/types/raintonic-formaui-components-big-menu.d.ts.map +0 -1
  233. package/types/raintonic-formaui-components-menu.d.ts +0 -403
  234. package/types/raintonic-formaui-components-menu.d.ts.map +0 -1
  235. package/types/raintonic-formaui-components-sidebar.d.ts +0 -185
  236. package/types/raintonic-formaui-components-sidebar.d.ts.map +0 -1
  237. package/types/raintonic-formaui-components-tag.d.ts +0 -43
  238. package/types/raintonic-formaui-components-tag.d.ts.map +0 -1
@@ -0,0 +1,774 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, computed, ChangeDetectionStrategy, Component, inject, Injector, signal, effect, afterNextRender } from '@angular/core';
3
+ import { RouterLink, RouterLinkActive } from '@angular/router';
4
+ import { FuiIconComponent } from '@raintonic/formaui/components/icon';
5
+ import { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';
6
+
7
+ /**
8
+ * Renders a single top-level trigger item for the dual-tier navigation bar.
9
+ * Extracted so the main component stays under 200 lines.
10
+ */
11
+ class DualTierNavTriggerComponent {
12
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
13
+ isExpanded = input(false, ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
14
+ flyoutId = input('', ...(ngDevMode ? [{ debugName: "flyoutId" }] : /* istanbul ignore next */ []));
15
+ itemClick = output();
16
+ toggle = output();
17
+ keydown = output();
18
+ hasChildren = computed(() => !!this.item().items?.length, ...(ngDevMode ? [{ debugName: "hasChildren" }] : /* istanbul ignore next */ []));
19
+ onClick(event) {
20
+ const it = this.item();
21
+ if (it.disabled) {
22
+ event.preventDefault();
23
+ return;
24
+ }
25
+ if (this.hasChildren()) {
26
+ this.toggle.emit(event);
27
+ return;
28
+ }
29
+ it.command?.(event);
30
+ this.itemClick.emit(it);
31
+ }
32
+ onKeydown(event) {
33
+ if (this.item().disabled) {
34
+ return;
35
+ }
36
+ // bubble up and handle in dual-tier-navigation
37
+ this.keydown.emit(event);
38
+ }
39
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
40
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: DualTierNavTriggerComponent, isStandalone: true, selector: "fui-dual-tier-nav-trigger", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, isExpanded: { classPropertyName: "isExpanded", publicName: "isExpanded", isSignal: true, isRequired: false, transformFunction: null }, flyoutId: { classPropertyName: "flyoutId", publicName: "flyoutId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", toggle: "toggle", keydown: "keydown" }, host: { attributes: { "role": "none" }, classAttribute: "fui-dual-tier-nav__bar-item" }, ngImport: i0, template: `
41
+ @if (hasChildren()) {
42
+ <button
43
+ class="fui-dual-tier-nav__trigger"
44
+ type="button"
45
+ role="menuitem"
46
+ [class.fui-dual-tier-nav__trigger--expanded]="isExpanded()"
47
+ [class.fui-dual-tier-nav__trigger--disabled]="item().disabled"
48
+ [attr.aria-haspopup]="true"
49
+ [attr.aria-expanded]="isExpanded()"
50
+ [attr.aria-controls]="isExpanded() ? 'fui-dtn-flyout-' + flyoutId() : null"
51
+ [disabled]="item().disabled"
52
+ (click)="onClick($event)"
53
+ (keydown)="onKeydown($event)"
54
+ [fuiTooltip]="item().label ?? ''"
55
+ >
56
+ <div class="fui-dual-tier-nav__trigger-content">
57
+ @if (item().icon) {
58
+ <fui-icon class="fui-dual-tier-nav__trigger-icon" [name]="item().icon ?? ''" size="md" aria-hidden="true" />
59
+ }
60
+ <span class="fui-dual-tier-nav__trigger-label">{{ item().label }}</span>
61
+ </div>
62
+ </button>
63
+ } @else if (item().routerLink) {
64
+ <a
65
+ class="fui-dual-tier-nav__trigger"
66
+ role="menuitem"
67
+ [class.fui-dual-tier-nav__trigger--disabled]="item().disabled"
68
+ [attr.aria-disabled]="item().disabled || null"
69
+ [routerLink]="item().routerLink"
70
+ [queryParams]="item().queryParams || undefined"
71
+ [fragment]="item().fragment || undefined"
72
+ [target]="item().target"
73
+ (click)="onClick($event)"
74
+ (keydown)="onKeydown($event)"
75
+ [fuiTooltip]="item().label ?? ''"
76
+ >
77
+ <span class="fui-dual-tier-nav__trigger-content">
78
+ @if (item().icon) {
79
+ <fui-icon class="fui-dual-tier-nav__trigger-icon" [name]="item().icon ?? ''" size="md" aria-hidden="true" />
80
+ }
81
+ <span class="fui-dual-tier-nav__trigger-label">{{ item().label }}</span>
82
+ </span>
83
+ </a>
84
+ } @else {
85
+ <button
86
+ class="fui-dual-tier-nav__trigger"
87
+ type="button"
88
+ role="menuitem"
89
+ [class.fui-dual-tier-nav__trigger--disabled]="item().disabled"
90
+ [attr.aria-disabled]="item().disabled || null"
91
+ [title]="item().title"
92
+ [disabled]="item().disabled"
93
+ (click)="onClick($event)"
94
+ (keydown)="onKeydown($event)"
95
+ [fuiTooltip]="item().label ?? ''"
96
+ >
97
+ <span class="fui-dual-tier-nav__trigger-content">
98
+ @if (item().icon) {
99
+ <fui-icon class="fui-dual-tier-nav__trigger-icon" [name]="item().icon ?? ''" size="md" aria-hidden="true" />
100
+ }
101
+ <span class="fui-dual-tier-nav__trigger-label">{{ item().label }}</span>
102
+ </span>
103
+ </button>
104
+ }
105
+ `, isInline: true, styles: [":host{display:contents}.fui-dual-tier-nav__trigger{display:flex;align-items:center;gap:var(--fui-spacing-2);padding:var(--fui-spacing-5) var(--fui-spacing-5);cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;color:var(--fui-text-secondary);background:transparent;border:none;border-radius:var(--fui-radius-xs);font-family:var(--fui-font-sans);font-size:var(--fui-text-sm);font-weight:var(--fui-weight-medium);line-height:var(--fui-leading-normal);text-align:left;white-space:nowrap;outline:none;transition:background-color var(--fui-duration-fast) var(--fui-ease-out),color var(--fui-duration-fast) var(--fui-ease-out)}.fui-dual-tier-nav__trigger:hover:not(.fui-dual-tier-nav__trigger--disabled){color:var(--fui-text-primary)}.fui-dual-tier-nav__trigger:hover:not(.fui-dual-tier-nav__trigger--disabled) fui-icon{background-color:var(--fui-bg-muted)}.fui-dual-tier-nav__trigger:active:not(.fui-dual-tier-nav__trigger--disabled),.fui-dual-tier-nav__trigger--expanded{color:var(--fui-text-primary)}.fui-dual-tier-nav__trigger:active:not(.fui-dual-tier-nav__trigger--disabled) fui-icon,.fui-dual-tier-nav__trigger--expanded fui-icon{background-color:var(--fui-bg-primary);color:var(--fui-text-link)}.fui-dual-tier-nav__trigger--expanded:hover fui-icon{background-color:var(--fui-state-selected-bg)}.fui-dual-tier-nav__trigger:hover{text-decoration:none}.fui-dual-tier-nav__trigger:focus-visible{outline:2px solid var(--fui-state-focus-ring);outline-offset:-2px}.fui-dual-tier-nav__trigger--disabled{color:var(--fui-text-disabled);opacity:var(--fui-state-disabled-opacity);pointer-events:none;cursor:default}.fui-dual-tier-nav__trigger-content{display:flex;flex-direction:column;align-items:stretch;gap:var(--fui-spacing-2);max-width:44px}.fui-dual-tier-nav__trigger-icon{width:44px;height:44px;flex-shrink:0;align-self:center;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--fui-radius-xs)}.fui-dual-tier-nav__trigger-label{max-width:100%;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "directive", type: FuiTooltipDirective, selector: "[fuiTooltip]", inputs: ["fuiTooltip", "fuiTooltipPosition", "fuiTooltipSize", "fuiTooltipTrigger", "fuiTooltipShowDelay", "fuiTooltipHideDelay", "fuiTooltipDisabled", "fuiTooltipMaxWidth", "fuiTooltipOffset", "fuiTooltipArrow", "fuiTooltipShow"], exportAs: ["fuiTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
106
+ }
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavTriggerComponent, decorators: [{
108
+ type: Component,
109
+ args: [{ selector: 'fui-dual-tier-nav-trigger', standalone: true, imports: [RouterLink, FuiIconComponent, FuiTooltipDirective], template: `
110
+ @if (hasChildren()) {
111
+ <button
112
+ class="fui-dual-tier-nav__trigger"
113
+ type="button"
114
+ role="menuitem"
115
+ [class.fui-dual-tier-nav__trigger--expanded]="isExpanded()"
116
+ [class.fui-dual-tier-nav__trigger--disabled]="item().disabled"
117
+ [attr.aria-haspopup]="true"
118
+ [attr.aria-expanded]="isExpanded()"
119
+ [attr.aria-controls]="isExpanded() ? 'fui-dtn-flyout-' + flyoutId() : null"
120
+ [disabled]="item().disabled"
121
+ (click)="onClick($event)"
122
+ (keydown)="onKeydown($event)"
123
+ [fuiTooltip]="item().label ?? ''"
124
+ >
125
+ <div class="fui-dual-tier-nav__trigger-content">
126
+ @if (item().icon) {
127
+ <fui-icon class="fui-dual-tier-nav__trigger-icon" [name]="item().icon ?? ''" size="md" aria-hidden="true" />
128
+ }
129
+ <span class="fui-dual-tier-nav__trigger-label">{{ item().label }}</span>
130
+ </div>
131
+ </button>
132
+ } @else if (item().routerLink) {
133
+ <a
134
+ class="fui-dual-tier-nav__trigger"
135
+ role="menuitem"
136
+ [class.fui-dual-tier-nav__trigger--disabled]="item().disabled"
137
+ [attr.aria-disabled]="item().disabled || null"
138
+ [routerLink]="item().routerLink"
139
+ [queryParams]="item().queryParams || undefined"
140
+ [fragment]="item().fragment || undefined"
141
+ [target]="item().target"
142
+ (click)="onClick($event)"
143
+ (keydown)="onKeydown($event)"
144
+ [fuiTooltip]="item().label ?? ''"
145
+ >
146
+ <span class="fui-dual-tier-nav__trigger-content">
147
+ @if (item().icon) {
148
+ <fui-icon class="fui-dual-tier-nav__trigger-icon" [name]="item().icon ?? ''" size="md" aria-hidden="true" />
149
+ }
150
+ <span class="fui-dual-tier-nav__trigger-label">{{ item().label }}</span>
151
+ </span>
152
+ </a>
153
+ } @else {
154
+ <button
155
+ class="fui-dual-tier-nav__trigger"
156
+ type="button"
157
+ role="menuitem"
158
+ [class.fui-dual-tier-nav__trigger--disabled]="item().disabled"
159
+ [attr.aria-disabled]="item().disabled || null"
160
+ [title]="item().title"
161
+ [disabled]="item().disabled"
162
+ (click)="onClick($event)"
163
+ (keydown)="onKeydown($event)"
164
+ [fuiTooltip]="item().label ?? ''"
165
+ >
166
+ <span class="fui-dual-tier-nav__trigger-content">
167
+ @if (item().icon) {
168
+ <fui-icon class="fui-dual-tier-nav__trigger-icon" [name]="item().icon ?? ''" size="md" aria-hidden="true" />
169
+ }
170
+ <span class="fui-dual-tier-nav__trigger-label">{{ item().label }}</span>
171
+ </span>
172
+ </button>
173
+ }
174
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'fui-dual-tier-nav__bar-item', role: 'none' }, styles: [":host{display:contents}.fui-dual-tier-nav__trigger{display:flex;align-items:center;gap:var(--fui-spacing-2);padding:var(--fui-spacing-5) var(--fui-spacing-5);cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;color:var(--fui-text-secondary);background:transparent;border:none;border-radius:var(--fui-radius-xs);font-family:var(--fui-font-sans);font-size:var(--fui-text-sm);font-weight:var(--fui-weight-medium);line-height:var(--fui-leading-normal);text-align:left;white-space:nowrap;outline:none;transition:background-color var(--fui-duration-fast) var(--fui-ease-out),color var(--fui-duration-fast) var(--fui-ease-out)}.fui-dual-tier-nav__trigger:hover:not(.fui-dual-tier-nav__trigger--disabled){color:var(--fui-text-primary)}.fui-dual-tier-nav__trigger:hover:not(.fui-dual-tier-nav__trigger--disabled) fui-icon{background-color:var(--fui-bg-muted)}.fui-dual-tier-nav__trigger:active:not(.fui-dual-tier-nav__trigger--disabled),.fui-dual-tier-nav__trigger--expanded{color:var(--fui-text-primary)}.fui-dual-tier-nav__trigger:active:not(.fui-dual-tier-nav__trigger--disabled) fui-icon,.fui-dual-tier-nav__trigger--expanded fui-icon{background-color:var(--fui-bg-primary);color:var(--fui-text-link)}.fui-dual-tier-nav__trigger--expanded:hover fui-icon{background-color:var(--fui-state-selected-bg)}.fui-dual-tier-nav__trigger:hover{text-decoration:none}.fui-dual-tier-nav__trigger:focus-visible{outline:2px solid var(--fui-state-focus-ring);outline-offset:-2px}.fui-dual-tier-nav__trigger--disabled{color:var(--fui-text-disabled);opacity:var(--fui-state-disabled-opacity);pointer-events:none;cursor:default}.fui-dual-tier-nav__trigger-content{display:flex;flex-direction:column;align-items:stretch;gap:var(--fui-spacing-2);max-width:44px}.fui-dual-tier-nav__trigger-icon{width:44px;height:44px;flex-shrink:0;align-self:center;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--fui-radius-xs)}.fui-dual-tier-nav__trigger-label{max-width:100%;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}\n"] }]
175
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], isExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "isExpanded", required: false }] }], flyoutId: [{ type: i0.Input, args: [{ isSignal: true, alias: "flyoutId", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], toggle: [{ type: i0.Output, args: ["toggle"] }], keydown: [{ type: i0.Output, args: ["keydown"] }] } });
176
+
177
+ class DualTierNavSubmenuHeaderComponent {
178
+ title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
179
+ closable = input(true, ...(ngDevMode ? [{ debugName: "closable" }] : /* istanbul ignore next */ []));
180
+ close = output();
181
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavSubmenuHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
182
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: DualTierNavSubmenuHeaderComponent, isStandalone: true, selector: "fui-dual-tier-nav-submenu-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close" }, host: { classAttribute: "fui-dtn-submenu__header-wrapper" }, ngImport: i0, template: `
183
+ <div class="fui-dtn-submenu__header">
184
+ <h6 class="fui-dtn-submenu__title">{{ title() }}</h6>
185
+ @if (closable()) {
186
+ <button type="button" class="fui-dtn-submenu__close" aria-label="Close menu" (click)="close.emit()">
187
+ <fui-icon name="caret-double-left" size="sm" aria-hidden="true" />
188
+ </button>
189
+ }
190
+ </div>
191
+ `, isInline: true, styles: [".fui-dtn-submenu__header{display:flex;justify-content:space-between;margin-top:var(--fui-spacing-8);align-items:center;padding:0 var(--fui-spacing-2)}.fui-dtn-submenu__title{margin:0;font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-semibold);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide);color:var(--fui-text-primary)}.fui-dtn-submenu__close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;padding:8px;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);outline:none;transition:background-color var(--fui-duration-fast) var(--fui-ease-out),color var(--fui-duration-fast) var(--fui-ease-out)}.fui-dtn-submenu__close:hover{background-color:var(--fui-bg-muted);color:var(--fui-text-primary)}.fui-dtn-submenu__close:focus-visible{outline:2px solid var(--fui-state-focus-ring);outline-offset:-2px}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
192
+ }
193
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavSubmenuHeaderComponent, decorators: [{
194
+ type: Component,
195
+ args: [{ selector: 'fui-dual-tier-nav-submenu-header', standalone: true, imports: [FuiIconComponent], template: `
196
+ <div class="fui-dtn-submenu__header">
197
+ <h6 class="fui-dtn-submenu__title">{{ title() }}</h6>
198
+ @if (closable()) {
199
+ <button type="button" class="fui-dtn-submenu__close" aria-label="Close menu" (click)="close.emit()">
200
+ <fui-icon name="caret-double-left" size="sm" aria-hidden="true" />
201
+ </button>
202
+ }
203
+ </div>
204
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'fui-dtn-submenu__header-wrapper' }, styles: [".fui-dtn-submenu__header{display:flex;justify-content:space-between;margin-top:var(--fui-spacing-8);align-items:center;padding:0 var(--fui-spacing-2)}.fui-dtn-submenu__title{margin:0;font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-semibold);line-height:var(--fui-leading-normal);letter-spacing:var(--fui-tracking-wide);color:var(--fui-text-primary)}.fui-dtn-submenu__close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;padding:8px;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);outline:none;transition:background-color var(--fui-duration-fast) var(--fui-ease-out),color var(--fui-duration-fast) var(--fui-ease-out)}.fui-dtn-submenu__close:hover{background-color:var(--fui-bg-muted);color:var(--fui-text-primary)}.fui-dtn-submenu__close:focus-visible{outline:2px solid var(--fui-state-focus-ring);outline-offset:-2px}\n"] }]
205
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }], close: [{ type: i0.Output, args: ["close"] }] } });
206
+
207
+ class DualTierNavSubmenuItemComponent {
208
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
209
+ isExpanded = input(false, ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
210
+ clickItem = output();
211
+ toggleExpand = output();
212
+ keydown = output();
213
+ hasChildren() {
214
+ return !!this.item()?.items?.length;
215
+ }
216
+ _onClick(event) {
217
+ const it = this.item();
218
+ if (it?.disabled) {
219
+ event.preventDefault();
220
+ return;
221
+ }
222
+ if (this.hasChildren()) {
223
+ this.toggleExpand.emit({ item: it, sourceEl: event.currentTarget });
224
+ }
225
+ else {
226
+ if (it.command)
227
+ it.command(event);
228
+ this.clickItem.emit(it);
229
+ }
230
+ }
231
+ _onKeydown(event) {
232
+ if (this.item()?.disabled)
233
+ return;
234
+ switch (event.key) {
235
+ case 'ArrowRight':
236
+ event.preventDefault();
237
+ if (this.hasChildren())
238
+ this.toggleExpand.emit({ item: this.item(), sourceEl: event.currentTarget });
239
+ break;
240
+ case 'ArrowLeft':
241
+ event.preventDefault();
242
+ // Delegate to parent: collapse if expanded, close panel otherwise
243
+ this.keydown.emit(event);
244
+ break;
245
+ case 'ArrowDown':
246
+ case 'ArrowUp':
247
+ // Let the list-level handler navigate between items
248
+ break;
249
+ case 'Enter':
250
+ case ' ':
251
+ if (this.hasChildren()) {
252
+ event.preventDefault();
253
+ this.toggleExpand.emit({ item: this.item(), sourceEl: event.currentTarget });
254
+ }
255
+ break;
256
+ default:
257
+ this.keydown.emit(event);
258
+ }
259
+ }
260
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavSubmenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
261
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: DualTierNavSubmenuItemComponent, isStandalone: true, selector: "fui-dual-tier-nav-submenu-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, isExpanded: { classPropertyName: "isExpanded", publicName: "isExpanded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickItem: "clickItem", toggleExpand: "toggleExpand", keydown: "keydown" }, host: { attributes: { "role": "none" } }, ngImport: i0, template: `
262
+ @if (hasChildren()) {
263
+ <button
264
+ class="fui-dtn-item fui-dtn-item--parent"
265
+ type="button"
266
+ role="menuitem"
267
+ [class.fui-dtn-item--disabled]="item().disabled"
268
+ [class.fui-dtn-item--parent-expanded]="isExpanded()"
269
+ [attr.aria-haspopup]="true"
270
+ [attr.aria-expanded]="isExpanded()"
271
+ [disabled]="item().disabled"
272
+ (click)="_onClick($event)"
273
+ (keydown)="_onKeydown($event)"
274
+ >
275
+ <span class="fui-dtn-item__label">{{ item().label }}</span>
276
+ <fui-icon
277
+ class="fui-dtn-item__chevron"
278
+ [class.fui-dtn-item__chevron--expanded]="isExpanded()"
279
+ name="caret-right"
280
+ size="sm"
281
+ aria-hidden="true"
282
+ />
283
+ </button>
284
+ } @else if (item().routerLink) {
285
+ <a
286
+ class="fui-dtn-item"
287
+ role="menuitem"
288
+ routerLinkActive="fui-dtn-item--active"
289
+ [class.fui-dtn-item--disabled]="item().disabled"
290
+ [tabindex]="item().disabled ? -1 : 0"
291
+ [attr.aria-disabled]="item().disabled || null"
292
+ [routerLink]="item().routerLink"
293
+ [queryParams]="item().queryParams ?? undefined"
294
+ [fragment]="item().fragment ?? undefined"
295
+ [target]="item().target"
296
+ [title]="item().title"
297
+ (click)="_onClick($event)"
298
+ (keydown)="_onKeydown($event)"
299
+ >
300
+ <span class="fui-dtn-item__label">{{ item().label }}</span>
301
+ </a>
302
+ } @else {
303
+ <button
304
+ class="fui-dtn-item"
305
+ type="button"
306
+ role="menuitem"
307
+ [class.fui-dtn-item--disabled]="item().disabled"
308
+ [tabindex]="item().disabled ? -1 : 0"
309
+ [attr.aria-disabled]="item().disabled || null"
310
+ [title]="item().title"
311
+ [disabled]="item().disabled"
312
+ (click)="_onClick($event)"
313
+ (keydown)="_onKeydown($event)"
314
+ >
315
+ <span class="fui-dtn-item__label">{{ item().label }}</span>
316
+ </button>
317
+ }
318
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column}.fui-dtn-item{display:flex;align-items:center;gap:var(--fui-spacing-6);padding:var(--fui-spacing-4) var(--fui-spacing-6) var(--fui-spacing-4) var(--fui-spacing-3);cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;color:var(--fui-text-secondary);background:transparent;border:none;border-radius:var(--fui-radius-sm);font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-medium);line-height:var(--fui-leading-normal);text-align:left;width:100%;box-sizing:border-box;outline:none;transition:background-color var(--fui-duration-fast) var(--fui-ease-out),color var(--fui-duration-fast) var(--fui-ease-out)}.fui-dtn-item:hover{background-color:var(--fui-bg-muted);text-decoration:none}.fui-dtn-item:active{background-color:var(--fui-bg-primary)}.fui-dtn-item:focus-visible{outline:2px solid var(--fui-state-focus-ring);outline-offset:-2px}.fui-dtn-item--active{color:var(--fui-text-primary);background-color:var(--fui-state-selected-bg)}.fui-dtn-item--disabled{color:var(--fui-text-disabled);opacity:var(--fui-state-disabled-opacity);pointer-events:none;cursor:default}.fui-dtn-item--parent-expanded{color:var(--fui-text-primary);background-color:var(--fui-bg-muted)}.fui-dtn-item__label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fui-dtn-item__chevron{flex-shrink:0;color:inherit;display:inline-flex;align-items:center;justify-content:center;transition:transform var(--fui-duration-base) var(--fui-ease-out)}.fui-dtn-item__chevron--expanded{transform:rotate(90deg)}\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: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
319
+ }
320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavSubmenuItemComponent, decorators: [{
321
+ type: Component,
322
+ args: [{ selector: 'fui-dual-tier-nav-submenu-item', standalone: true, imports: [RouterLink, RouterLinkActive, FuiIconComponent], template: `
323
+ @if (hasChildren()) {
324
+ <button
325
+ class="fui-dtn-item fui-dtn-item--parent"
326
+ type="button"
327
+ role="menuitem"
328
+ [class.fui-dtn-item--disabled]="item().disabled"
329
+ [class.fui-dtn-item--parent-expanded]="isExpanded()"
330
+ [attr.aria-haspopup]="true"
331
+ [attr.aria-expanded]="isExpanded()"
332
+ [disabled]="item().disabled"
333
+ (click)="_onClick($event)"
334
+ (keydown)="_onKeydown($event)"
335
+ >
336
+ <span class="fui-dtn-item__label">{{ item().label }}</span>
337
+ <fui-icon
338
+ class="fui-dtn-item__chevron"
339
+ [class.fui-dtn-item__chevron--expanded]="isExpanded()"
340
+ name="caret-right"
341
+ size="sm"
342
+ aria-hidden="true"
343
+ />
344
+ </button>
345
+ } @else if (item().routerLink) {
346
+ <a
347
+ class="fui-dtn-item"
348
+ role="menuitem"
349
+ routerLinkActive="fui-dtn-item--active"
350
+ [class.fui-dtn-item--disabled]="item().disabled"
351
+ [tabindex]="item().disabled ? -1 : 0"
352
+ [attr.aria-disabled]="item().disabled || null"
353
+ [routerLink]="item().routerLink"
354
+ [queryParams]="item().queryParams ?? undefined"
355
+ [fragment]="item().fragment ?? undefined"
356
+ [target]="item().target"
357
+ [title]="item().title"
358
+ (click)="_onClick($event)"
359
+ (keydown)="_onKeydown($event)"
360
+ >
361
+ <span class="fui-dtn-item__label">{{ item().label }}</span>
362
+ </a>
363
+ } @else {
364
+ <button
365
+ class="fui-dtn-item"
366
+ type="button"
367
+ role="menuitem"
368
+ [class.fui-dtn-item--disabled]="item().disabled"
369
+ [tabindex]="item().disabled ? -1 : 0"
370
+ [attr.aria-disabled]="item().disabled || null"
371
+ [title]="item().title"
372
+ [disabled]="item().disabled"
373
+ (click)="_onClick($event)"
374
+ (keydown)="_onKeydown($event)"
375
+ >
376
+ <span class="fui-dtn-item__label">{{ item().label }}</span>
377
+ </button>
378
+ }
379
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: { role: 'none' }, styles: [":host{display:flex;flex-direction:column}.fui-dtn-item{display:flex;align-items:center;gap:var(--fui-spacing-6);padding:var(--fui-spacing-4) var(--fui-spacing-6) var(--fui-spacing-4) var(--fui-spacing-3);cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;color:var(--fui-text-secondary);background:transparent;border:none;border-radius:var(--fui-radius-sm);font-family:var(--fui-font-sans);font-size:var(--fui-text-base);font-weight:var(--fui-weight-medium);line-height:var(--fui-leading-normal);text-align:left;width:100%;box-sizing:border-box;outline:none;transition:background-color var(--fui-duration-fast) var(--fui-ease-out),color var(--fui-duration-fast) var(--fui-ease-out)}.fui-dtn-item:hover{background-color:var(--fui-bg-muted);text-decoration:none}.fui-dtn-item:active{background-color:var(--fui-bg-primary)}.fui-dtn-item:focus-visible{outline:2px solid var(--fui-state-focus-ring);outline-offset:-2px}.fui-dtn-item--active{color:var(--fui-text-primary);background-color:var(--fui-state-selected-bg)}.fui-dtn-item--disabled{color:var(--fui-text-disabled);opacity:var(--fui-state-disabled-opacity);pointer-events:none;cursor:default}.fui-dtn-item--parent-expanded{color:var(--fui-text-primary);background-color:var(--fui-bg-muted)}.fui-dtn-item__label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fui-dtn-item__chevron{flex-shrink:0;color:inherit;display:inline-flex;align-items:center;justify-content:center;transition:transform var(--fui-duration-base) var(--fui-ease-out)}.fui-dtn-item__chevron--expanded{transform:rotate(90deg)}\n"] }]
380
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], isExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "isExpanded", required: false }] }], clickItem: [{ type: i0.Output, args: ["clickItem"] }], toggleExpand: [{ type: i0.Output, args: ["toggleExpand"] }], keydown: [{ type: i0.Output, args: ["keydown"] }] } });
381
+
382
+ class DualTierNavSubmenuComponent {
383
+ _injector = inject(Injector);
384
+ title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
385
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
386
+ showHeader = input(true, ...(ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []));
387
+ closable = input(true, ...(ngDevMode ? [{ debugName: "closable" }] : /* istanbul ignore next */ []));
388
+ itemClick = output();
389
+ closePanel = output();
390
+ visibleItems = computed(() => this.items().filter((it) => it.visible !== false), ...(ngDevMode ? [{ debugName: "visibleItems" }] : /* istanbul ignore next */ []));
391
+ _expanded = signal(new Set(), ...(ngDevMode ? [{ debugName: "_expanded" }] : /* istanbul ignore next */ []));
392
+ constructor() {
393
+ effect(() => {
394
+ const expanded = new Set();
395
+ const walk = (list) => {
396
+ for (const it of list) {
397
+ if (it.expanded && it.items?.length)
398
+ expanded.add(it.id);
399
+ if (it.items)
400
+ walk(it.items);
401
+ }
402
+ };
403
+ walk(this.items());
404
+ this._expanded.set(expanded);
405
+ });
406
+ }
407
+ _hasChildren(item) {
408
+ return !!item.items?.length;
409
+ }
410
+ _isExpanded(item) {
411
+ return this._hasChildren(item) && this._expanded().has(item.id);
412
+ }
413
+ _onClose() {
414
+ this.closePanel.emit();
415
+ }
416
+ _onClickItem(item) {
417
+ this.itemClick.emit(item);
418
+ }
419
+ _onToggleExpand(item, toggleSourceEl) {
420
+ const id = item.id;
421
+ if (!id)
422
+ return;
423
+ const wasExpanded = this._expanded().has(id);
424
+ this._expanded.update((s) => {
425
+ const next = new Set(s);
426
+ if (next.has(id))
427
+ next.delete(id);
428
+ else
429
+ next.add(id);
430
+ return next;
431
+ });
432
+ // ponytail: afterNextRender to wait for the nested submenu to be rendered.
433
+ // Ceiling: if the nested submenu has no visible items, focus stays on the toggle.
434
+ if (!wasExpanded && toggleSourceEl) {
435
+ afterNextRender(() => {
436
+ const li = toggleSourceEl.closest('li');
437
+ const selector = '.fui-dtn-item:not(.fui-dtn-item--disabled)';
438
+ const nested = li?.querySelector(':scope > .fui-dtn-submenu__nested ' + selector);
439
+ nested?.focus();
440
+ }, { injector: this._injector });
441
+ }
442
+ }
443
+ _onListKeydown(event) {
444
+ if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key))
445
+ return;
446
+ event.stopPropagation();
447
+ const listEl = event.currentTarget?.closest('ul');
448
+ if (!listEl)
449
+ return;
450
+ // ponytail: querySelectorAll on every keydown — acceptable for small submenu lists (<50 items).
451
+ // Upgrade path: precompute items list on mutation and reuse.
452
+ const items = Array.from(listEl.querySelectorAll(':scope > li > fui-dual-tier-nav-submenu-item > .fui-dtn-item'));
453
+ const idx = items.indexOf(document.activeElement);
454
+ switch (event.key) {
455
+ case 'ArrowDown':
456
+ event.preventDefault();
457
+ this._focusItem(items, idx + 1, 1);
458
+ break;
459
+ case 'ArrowUp':
460
+ event.preventDefault();
461
+ this._focusItem(items, idx - 1, -1);
462
+ break;
463
+ case 'Home':
464
+ event.preventDefault();
465
+ this._focusItem(items, 0, 1);
466
+ break;
467
+ case 'End':
468
+ event.preventDefault();
469
+ this._focusItem(items, items.length - 1, -1);
470
+ break;
471
+ }
472
+ }
473
+ _onItemKeydown(event, item) {
474
+ switch (event.key) {
475
+ case 'ArrowLeft':
476
+ event.preventDefault();
477
+ if (this._hasChildren(item) && this._isExpanded(item)) {
478
+ this._expanded.update((s) => {
479
+ const next = new Set(s);
480
+ next.delete(item.id);
481
+ return next;
482
+ });
483
+ }
484
+ else {
485
+ this.closePanel.emit();
486
+ }
487
+ break;
488
+ }
489
+ }
490
+ _focusItem(items, start, step) {
491
+ let i = start;
492
+ while (i >= 0 && i < items.length) {
493
+ if (!items[i].classList.contains('fui-dtn-item--disabled')) {
494
+ items[i].focus();
495
+ return;
496
+ }
497
+ i += step;
498
+ }
499
+ }
500
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavSubmenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
501
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: DualTierNavSubmenuComponent, isStandalone: true, selector: "fui-dual-tier-nav-submenu", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", closePanel: "closePanel" }, ngImport: i0, template: `
502
+ <div class="fui-dtn-submenu">
503
+ @if (showHeader()) {
504
+ <fui-dual-tier-nav-submenu-header [title]="title()" [closable]="closable()" (close)="_onClose()" />
505
+ }
506
+ <ul class="fui-dtn-submenu__list" role="menu" aria-orientation="vertical" (keydown)="_onListKeydown($event)">
507
+ @for (item of visibleItems(); track item.id) {
508
+ <li role="none">
509
+ <fui-dual-tier-nav-submenu-item
510
+ [item]="item"
511
+ [isExpanded]="_isExpanded(item)"
512
+ (clickItem)="_onClickItem($event)"
513
+ (toggleExpand)="_onToggleExpand($event.item, $event.sourceEl)"
514
+ (keydown)="_onItemKeydown($event, item)"
515
+ />
516
+ @if (_hasChildren(item) && _isExpanded(item)) {
517
+ <div
518
+ class="fui-dtn-submenu__nested"
519
+ animate.enter="fui-dtn-nested--enter"
520
+ animate.leave="fui-dtn-nested--leave"
521
+ >
522
+ <fui-dual-tier-nav-submenu
523
+ [title]="item.label ?? ''"
524
+ [items]="item.items ?? []"
525
+ [showHeader]="false"
526
+ [closable]="false"
527
+ (itemClick)="itemClick.emit($event)"
528
+ (closePanel)="closePanel.emit()"
529
+ />
530
+ </div>
531
+ }
532
+ </li>
533
+ }
534
+ </ul>
535
+ </div>
536
+ `, isInline: true, styles: [":host{display:contents}.fui-dtn-submenu{display:flex;flex-direction:column;padding-top:var(--fui-spacing-2);padding-left:var(--fui-spacing-4)}.fui-dtn-submenu__list{display:flex;flex-direction:column;list-style:none;margin:0;gap:var(--fui-spacing-2)}\n", "@keyframes fui-dtn-nested-enter{0%{opacity:0;max-height:0}to{opacity:1;max-height:500px}}@keyframes fui-dtn-nested-leave{0%{opacity:1;max-height:500px}to{opacity:0;max-height:0}}.fui-dtn-nested--enter{animation:fui-dtn-nested-enter var(--fui-duration-moderate) var(--fui-ease-out);overflow:hidden}.fui-dtn-nested--leave{animation:fui-dtn-nested-leave var(--fui-duration-fast) var(--fui-ease-in);overflow:hidden}\n"], dependencies: [{ kind: "component", type: DualTierNavSubmenuComponent, selector: "fui-dual-tier-nav-submenu", inputs: ["title", "items", "showHeader", "closable"], outputs: ["itemClick", "closePanel"] }, { kind: "component", type: DualTierNavSubmenuHeaderComponent, selector: "fui-dual-tier-nav-submenu-header", inputs: ["title", "closable"], outputs: ["close"] }, { kind: "component", type: DualTierNavSubmenuItemComponent, selector: "fui-dual-tier-nav-submenu-item", inputs: ["item", "isExpanded"], outputs: ["clickItem", "toggleExpand", "keydown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
537
+ }
538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: DualTierNavSubmenuComponent, decorators: [{
539
+ type: Component,
540
+ args: [{ selector: 'fui-dual-tier-nav-submenu', standalone: true, imports: [DualTierNavSubmenuHeaderComponent, DualTierNavSubmenuItemComponent], template: `
541
+ <div class="fui-dtn-submenu">
542
+ @if (showHeader()) {
543
+ <fui-dual-tier-nav-submenu-header [title]="title()" [closable]="closable()" (close)="_onClose()" />
544
+ }
545
+ <ul class="fui-dtn-submenu__list" role="menu" aria-orientation="vertical" (keydown)="_onListKeydown($event)">
546
+ @for (item of visibleItems(); track item.id) {
547
+ <li role="none">
548
+ <fui-dual-tier-nav-submenu-item
549
+ [item]="item"
550
+ [isExpanded]="_isExpanded(item)"
551
+ (clickItem)="_onClickItem($event)"
552
+ (toggleExpand)="_onToggleExpand($event.item, $event.sourceEl)"
553
+ (keydown)="_onItemKeydown($event, item)"
554
+ />
555
+ @if (_hasChildren(item) && _isExpanded(item)) {
556
+ <div
557
+ class="fui-dtn-submenu__nested"
558
+ animate.enter="fui-dtn-nested--enter"
559
+ animate.leave="fui-dtn-nested--leave"
560
+ >
561
+ <fui-dual-tier-nav-submenu
562
+ [title]="item.label ?? ''"
563
+ [items]="item.items ?? []"
564
+ [showHeader]="false"
565
+ [closable]="false"
566
+ (itemClick)="itemClick.emit($event)"
567
+ (closePanel)="closePanel.emit()"
568
+ />
569
+ </div>
570
+ }
571
+ </li>
572
+ }
573
+ </ul>
574
+ </div>
575
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}.fui-dtn-submenu{display:flex;flex-direction:column;padding-top:var(--fui-spacing-2);padding-left:var(--fui-spacing-4)}.fui-dtn-submenu__list{display:flex;flex-direction:column;list-style:none;margin:0;gap:var(--fui-spacing-2)}\n", "@keyframes fui-dtn-nested-enter{0%{opacity:0;max-height:0}to{opacity:1;max-height:500px}}@keyframes fui-dtn-nested-leave{0%{opacity:1;max-height:500px}to{opacity:0;max-height:0}}.fui-dtn-nested--enter{animation:fui-dtn-nested-enter var(--fui-duration-moderate) var(--fui-ease-out);overflow:hidden}.fui-dtn-nested--leave{animation:fui-dtn-nested-leave var(--fui-duration-fast) var(--fui-ease-in);overflow:hidden}\n"] }]
576
+ }], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], closePanel: [{ type: i0.Output, args: ["closePanel"] }] } });
577
+
578
+ class FuiDualTierNavigationComponent {
579
+ _injector = inject(Injector);
580
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
581
+ ariaLabel = input('Dual tier navigation', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
582
+ itemClick = output();
583
+ _readyItems = computed(() => {
584
+ let counter = 0;
585
+ const assignIds = (list) => list
586
+ .filter((it) => it.visible !== false)
587
+ .map((it) => {
588
+ const copy = { ...it, id: it.id ?? `fui-dtn-${++counter}` };
589
+ if (copy.items) {
590
+ return { ...copy, items: assignIds(copy.items) };
591
+ }
592
+ return copy;
593
+ });
594
+ return assignIds(this.items());
595
+ }, ...(ngDevMode ? [{ debugName: "_readyItems" }] : /* istanbul ignore next */ []));
596
+ _expandedId = signal(undefined, ...(ngDevMode ? [{ debugName: "_expandedId" }] : /* istanbul ignore next */ []));
597
+ _expandedItem = computed(() => {
598
+ const id = this._expandedId();
599
+ if (!id)
600
+ return undefined;
601
+ return this._findItemById(this._readyItems(), id);
602
+ }, ...(ngDevMode ? [{ debugName: "_expandedItem" }] : /* istanbul ignore next */ []));
603
+ _findItemById(items, id) {
604
+ for (const item of items) {
605
+ if (item.id === id)
606
+ return item;
607
+ if (item.items?.length) {
608
+ const found = this._findItemById(item.items, id);
609
+ if (found)
610
+ return found;
611
+ }
612
+ }
613
+ return undefined;
614
+ }
615
+ _closeFlyout() {
616
+ const activeId = this._expandedId();
617
+ this._expandedId.set(undefined);
618
+ if (activeId) {
619
+ afterNextRender(() => {
620
+ document.querySelector('[aria-controls="fui-dtn-flyout-' + activeId + '"]')?.focus();
621
+ }, { injector: this._injector });
622
+ }
623
+ }
624
+ _onItemClick(item) {
625
+ this.itemClick.emit(item);
626
+ }
627
+ _onToggle(event, item) {
628
+ event.stopPropagation();
629
+ this._expandedId.update((current) => (current === item.id ? undefined : item.id));
630
+ this.itemClick.emit(item);
631
+ }
632
+ _onTriggerKeydown(event, item) {
633
+ const triggerEl = event.currentTarget?.closest('[role="menuitem"]');
634
+ if (!triggerEl)
635
+ return;
636
+ const barEl = triggerEl.closest('.fui-dual-tier-nav__bar');
637
+ if (!barEl)
638
+ return;
639
+ // ponytail: querySelectorAll on every keydown — acceptable for small trigger lists (<20 items).
640
+ // Upgrade path: precompute triggers list on mutation and reuse.
641
+ const triggers = Array.from(barEl.querySelectorAll('[role="menuitem"]'));
642
+ const idx = triggers.indexOf(triggerEl);
643
+ const closeFlyout = () => {
644
+ if (this._expandedId()) {
645
+ this._expandedId.set(undefined);
646
+ triggerEl.focus();
647
+ }
648
+ };
649
+ const focusFirstFlyoutItem = () => {
650
+ afterNextRender(() => {
651
+ const selector = '.fui-dtn-item:not(.fui-dtn-item--disabled)';
652
+ const el = document.getElementById(`fui-dtn-flyout-${item.id}`)?.querySelector(selector);
653
+ el?.focus();
654
+ }, { injector: this._injector });
655
+ };
656
+ switch (event.key) {
657
+ case ' ':
658
+ case 'Enter':
659
+ case 'ArrowRight':
660
+ event.preventDefault();
661
+ if (item.items?.length) {
662
+ this._expandedId.set(item.id);
663
+ focusFirstFlyoutItem();
664
+ }
665
+ else {
666
+ // Leaf item: forward click-like activation
667
+ if (item.command)
668
+ item.command(event);
669
+ this.itemClick.emit(item);
670
+ }
671
+ break;
672
+ case 'ArrowDown':
673
+ event.preventDefault();
674
+ triggers[idx + 1]?.focus();
675
+ break;
676
+ case 'ArrowUp':
677
+ event.preventDefault();
678
+ triggers[idx - 1]?.focus();
679
+ break;
680
+ case 'ArrowLeft':
681
+ case 'Escape':
682
+ event.preventDefault();
683
+ closeFlyout();
684
+ break;
685
+ case 'Home':
686
+ event.preventDefault();
687
+ triggers[0]?.focus();
688
+ break;
689
+ case 'End':
690
+ event.preventDefault();
691
+ triggers[triggers.length - 1]?.focus();
692
+ break;
693
+ }
694
+ }
695
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDualTierNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
696
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiDualTierNavigationComponent, isStandalone: true, selector: "fui-dual-tier-navigation", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { attributes: { "role": "navigation" }, properties: { "attr.aria-label": "ariaLabel()" }, classAttribute: "fui-dual-tier-navigation" }, ngImport: i0, template: `
697
+ <ul class="fui-dual-tier-nav__bar" role="menu" aria-orientation="vertical">
698
+ @for (item of _readyItems(); track item.id) {
699
+ <fui-dual-tier-nav-trigger
700
+ [item]="item"
701
+ [isExpanded]="_expandedId() === item.id"
702
+ [flyoutId]="item.id ?? ''"
703
+ (toggle)="_onToggle($event, item)"
704
+ (itemClick)="_onItemClick($event)"
705
+ (keydown)="_onTriggerKeydown($event, item)"
706
+ />
707
+ }
708
+ </ul>
709
+ <div
710
+ class="fui-dual-tier-nav__flyout"
711
+ role="menu"
712
+ [class.fui-dual-tier-nav__flyout--open]="!!_expandedItem()"
713
+ [id]="_expandedItem() ? 'fui-dtn-flyout-' + (_expandedItem()!.id ?? '') : null"
714
+ [attr.aria-label]="_expandedItem()?.label ?? null"
715
+ >
716
+ @if (_expandedItem(); as expanded) {
717
+ <div animate.enter="fui-dtn-flyout-content--enter" animate.leave="fui-dtn-flyout-content--leave">
718
+ <fui-dual-tier-nav-submenu
719
+ [title]="expanded.label ?? ''"
720
+ [items]="expanded.items ?? []"
721
+ (itemClick)="_onItemClick($event)"
722
+ (closePanel)="_closeFlyout()"
723
+ />
724
+ </div>
725
+ }
726
+ </div>
727
+ `, isInline: true, styles: [":host{--fui-dtn-bg: var(--fui-bg-subtle);--fui-dtn-flyout-width: 200px;display:flex;flex-direction:row;background-color:var(--fui-dtn-bg);box-sizing:border-box}.fui-dual-tier-nav__bar{display:flex;flex-direction:column;list-style:none;margin:0;padding:var(--fui-spacing-4) var(--fui-spacing-4);gap:var(--fui-spacing-2);flex-shrink:0;border-right:1px solid var(--fui-border-default)}.fui-dual-tier-nav__flyout{display:flex;flex-direction:column;width:0;flex-shrink:0;background:var(--fui-dtn-bg);clip-path:inset(0 100% 0 0);overflow:hidden;transition:width var(--fui-duration-moderate) cubic-bezier(.16,1,.3,1),clip-path var(--fui-duration-moderate) cubic-bezier(.16,1,.3,1)}.fui-dual-tier-nav__flyout--open{width:var(--fui-dtn-flyout-width);clip-path:inset(0 0 0 0);overflow-y:auto;padding-right:var(--fui-spacing-2)}@keyframes fui-dtn-flyout-content-enter{0%{opacity:0}to{opacity:1}}@keyframes fui-dtn-flyout-content-leave{0%{opacity:1}to{opacity:0}}.fui-dtn-flyout-content--enter{animation:fui-dtn-flyout-content-enter var(--fui-duration-fast) var(--fui-ease-out)}.fui-dtn-flyout-content--leave{animation:fui-dtn-flyout-content-leave var(--fui-duration-fast) var(--fui-ease-in)}\n"], dependencies: [{ kind: "component", type: DualTierNavTriggerComponent, selector: "fui-dual-tier-nav-trigger", inputs: ["item", "isExpanded", "flyoutId"], outputs: ["itemClick", "toggle", "keydown"] }, { kind: "component", type: DualTierNavSubmenuComponent, selector: "fui-dual-tier-nav-submenu", inputs: ["title", "items", "showHeader", "closable"], outputs: ["itemClick", "closePanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
728
+ }
729
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDualTierNavigationComponent, decorators: [{
730
+ type: Component,
731
+ args: [{ selector: 'fui-dual-tier-navigation', standalone: true, imports: [DualTierNavTriggerComponent, DualTierNavSubmenuComponent], template: `
732
+ <ul class="fui-dual-tier-nav__bar" role="menu" aria-orientation="vertical">
733
+ @for (item of _readyItems(); track item.id) {
734
+ <fui-dual-tier-nav-trigger
735
+ [item]="item"
736
+ [isExpanded]="_expandedId() === item.id"
737
+ [flyoutId]="item.id ?? ''"
738
+ (toggle)="_onToggle($event, item)"
739
+ (itemClick)="_onItemClick($event)"
740
+ (keydown)="_onTriggerKeydown($event, item)"
741
+ />
742
+ }
743
+ </ul>
744
+ <div
745
+ class="fui-dual-tier-nav__flyout"
746
+ role="menu"
747
+ [class.fui-dual-tier-nav__flyout--open]="!!_expandedItem()"
748
+ [id]="_expandedItem() ? 'fui-dtn-flyout-' + (_expandedItem()!.id ?? '') : null"
749
+ [attr.aria-label]="_expandedItem()?.label ?? null"
750
+ >
751
+ @if (_expandedItem(); as expanded) {
752
+ <div animate.enter="fui-dtn-flyout-content--enter" animate.leave="fui-dtn-flyout-content--leave">
753
+ <fui-dual-tier-nav-submenu
754
+ [title]="expanded.label ?? ''"
755
+ [items]="expanded.items ?? []"
756
+ (itemClick)="_onItemClick($event)"
757
+ (closePanel)="_closeFlyout()"
758
+ />
759
+ </div>
760
+ }
761
+ </div>
762
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
763
+ role: 'navigation',
764
+ '[attr.aria-label]': 'ariaLabel()',
765
+ class: 'fui-dual-tier-navigation',
766
+ }, styles: [":host{--fui-dtn-bg: var(--fui-bg-subtle);--fui-dtn-flyout-width: 200px;display:flex;flex-direction:row;background-color:var(--fui-dtn-bg);box-sizing:border-box}.fui-dual-tier-nav__bar{display:flex;flex-direction:column;list-style:none;margin:0;padding:var(--fui-spacing-4) var(--fui-spacing-4);gap:var(--fui-spacing-2);flex-shrink:0;border-right:1px solid var(--fui-border-default)}.fui-dual-tier-nav__flyout{display:flex;flex-direction:column;width:0;flex-shrink:0;background:var(--fui-dtn-bg);clip-path:inset(0 100% 0 0);overflow:hidden;transition:width var(--fui-duration-moderate) cubic-bezier(.16,1,.3,1),clip-path var(--fui-duration-moderate) cubic-bezier(.16,1,.3,1)}.fui-dual-tier-nav__flyout--open{width:var(--fui-dtn-flyout-width);clip-path:inset(0 0 0 0);overflow-y:auto;padding-right:var(--fui-spacing-2)}@keyframes fui-dtn-flyout-content-enter{0%{opacity:0}to{opacity:1}}@keyframes fui-dtn-flyout-content-leave{0%{opacity:1}to{opacity:0}}.fui-dtn-flyout-content--enter{animation:fui-dtn-flyout-content-enter var(--fui-duration-fast) var(--fui-ease-out)}.fui-dtn-flyout-content--leave{animation:fui-dtn-flyout-content-leave var(--fui-duration-fast) var(--fui-ease-in)}\n"] }]
767
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
768
+
769
+ /**
770
+ * Generated bundle index. Do not edit.
771
+ */
772
+
773
+ export { DualTierNavSubmenuComponent, DualTierNavSubmenuHeaderComponent, DualTierNavSubmenuItemComponent, DualTierNavTriggerComponent, FuiDualTierNavigationComponent };
774
+ //# sourceMappingURL=raintonic-formaui-components-dual-tier-navigation.mjs.map