@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
@@ -1,49 +1,29 @@
1
+ import * as _raintonic_formaui_components_select from '@raintonic/formaui/components/select';
1
2
  import * as i0 from '@angular/core';
2
- import { OnDestroy, AfterViewInit, InputSignal, OutputEmitterRef, WritableSignal, InjectionToken, DoCheck, AfterContentInit, Signal, ElementRef } from '@angular/core';
3
+ import { InjectionToken, OnDestroy, InputSignal, OutputEmitterRef, WritableSignal, ElementRef, Signal, AfterContentInit, AfterViewInit } from '@angular/core';
3
4
  import { Subject } from 'rxjs';
4
5
  import { ControlValueAccessor, NgControl } from '@angular/forms';
5
6
  import { FuiFormFieldControl, ErrorStateMatcher } from '@raintonic/formaui/core';
7
+ import * as i1 from '@raintonic/formaui/cdk/form-field';
6
8
 
7
9
  /**
8
- * # FuiOption Component
9
- *
10
- * Individual option component for use within fui-select.
11
- * Works like Angular Material's mat-option with full accessibility support.
12
- *
13
- * ## Features
14
- * - Disabled state support
15
- * - Selection state management
16
- * - Full accessibility support (ARIA attributes)
17
- * - Keyboard navigation support
18
- * - Custom content projection
19
- * - Smooth hover animations
10
+ * Injection token for querying all option-like components
11
+ * via contentChildren from parent components.
20
12
  *
21
- * ## Usage
13
+ * FuiOptionComponent provides this token so a single
14
+ * contentChildren(FUI_OPTION) query captures all options.
15
+ */
16
+ declare const FUI_OPTION: InjectionToken<FuiOptionBase>;
17
+ /**
18
+ * Abstract base class for FuiOptionComponent.
22
19
  *
23
- * ### Basic Option
24
- * ```html
25
- * <fui-select placeholder="Select a status">
26
- * <fui-option value="active">Active</fui-option>
27
- * <fui-option value="inactive">Inactive</fui-option>
28
- * <fui-option value="pending" [disabled]="true">Pending (Disabled)</fui-option>
29
- * </fui-select>
30
- * ```
20
+ * Defines the contract that parent components rely on.
21
+ * FuiOptionComponent provides FUI_OPTION for DI-based querying.
31
22
  *
32
- * ### Option with Custom Content
33
- * ```html
34
- * <fui-select placeholder="Select a country">
35
- * <fui-option value="us">
36
- * <fui-icon name="flag-us"></fui-icon>
37
- * United States
38
- * </fui-option>
39
- * <fui-option value="ca">
40
- * <fui-icon name="flag-ca"></fui-icon>
41
- * Canada
42
- * </fui-option>
43
- * </fui-select>
44
- * ```
23
+ * Uses @Directive() so Angular recognises input()/output()/signal()/HostListener
24
+ * calls as valid (they are only valid on @Component or @Directive classes).
45
25
  */
46
- declare class FuiOptionComponent implements OnDestroy, AfterViewInit {
26
+ declare abstract class FuiOptionBase implements OnDestroy {
47
27
  static nextId: number;
48
28
  /**
49
29
  * The value of the option
@@ -58,17 +38,15 @@ declare class FuiOptionComponent implements OnDestroy, AfterViewInit {
58
38
  * Event emitted when the option is selected
59
39
  */
60
40
  readonly selectionChange: OutputEmitterRef<{
61
- source: FuiOptionComponent;
41
+ source: FuiOptionBase;
62
42
  value: unknown;
63
43
  }>;
64
44
  readonly _selected: WritableSignal<boolean>;
65
45
  readonly _active: WritableSignal<boolean>;
66
46
  readonly stateChanges: Subject<void>;
67
- private readonly _element;
68
- private readonly _parentSelect;
47
+ protected readonly _element: ElementRef<HTMLElement>;
48
+ protected readonly _parentSelect: _raintonic_formaui_components_select.FuiSelectParent | null;
69
49
  readonly id: string;
70
- readonly _showCheckmark: WritableSignal<boolean>;
71
- ngAfterViewInit(): void;
72
50
  ngOnDestroy(): void;
73
51
  get viewValue(): string;
74
52
  _handleClick(event: Event): void;
@@ -102,12 +80,67 @@ declare class FuiOptionComponent implements OnDestroy, AfterViewInit {
102
80
  * Gets the host element
103
81
  */
104
82
  _getHostElement(): HTMLElement;
105
- /** Update checkmark visibility based on selection and multiple mode */
106
- private _updateCheckmarkVisibility;
107
83
  /** Emits the selection change event */
108
84
  private _emitSelectionChangeEvent;
85
+ static ɵfac: i0.ɵɵFactoryDeclaration<FuiOptionBase, never>;
86
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FuiOptionBase, never, never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
87
+ }
88
+
89
+ /**
90
+ * # FuiOption Component
91
+ *
92
+ * Individual option component for use within fui-select.
93
+ * Works like Angular Material's mat-option with full accessibility support.
94
+ *
95
+ * ## Features
96
+ * - Disabled state support
97
+ * - Selection state management
98
+ * - Full accessibility support (ARIA attributes)
99
+ * - Keyboard navigation support
100
+ * - Custom content projection
101
+ * - Smooth hover animations
102
+ *
103
+ * ## Usage
104
+ *
105
+ * ### Basic Option
106
+ * ```html
107
+ * <fui-select placeholder="Select a status">
108
+ * <fui-option value="active">Active</fui-option>
109
+ * <fui-option value="inactive">Inactive</fui-option>
110
+ * <fui-option value="pending" [disabled]="true">Pending (Disabled)</fui-option>
111
+ * </fui-select>
112
+ * ```
113
+ *
114
+ * ### Option with Custom Content
115
+ * ```html
116
+ * <fui-select placeholder="Select a country">
117
+ * <fui-option value="us">
118
+ * <fui-icon name="flag-us"></fui-icon>
119
+ * United States
120
+ * </fui-option>
121
+ * <fui-option value="ca">
122
+ * <fui-icon name="flag-ca"></fui-icon>
123
+ * Canada
124
+ * </fui-option>
125
+ * </fui-select>
126
+ * ```
127
+ *
128
+ * ### Multi-Select Options
129
+ * When `fui-select` has `[multiple]="true"`, `<fui-option>` automatically renders
130
+ * a checkbox indicator:
131
+ * ```html
132
+ * <fui-select [multiple]="true" placeholder="Select skills">
133
+ * <fui-option value="js">JavaScript</fui-option>
134
+ * <fui-option value="ts">TypeScript</fui-option>
135
+ * <fui-option value="py">Python</fui-option>
136
+ * </fui-select>
137
+ * ```
138
+ */
139
+ declare class FuiOptionComponent extends FuiOptionBase {
140
+ /** Whether the parent select is in multi-select mode */
141
+ readonly _isMultiParent: Signal<boolean>;
109
142
  static ɵfac: i0.ɵɵFactoryDeclaration<FuiOptionComponent, never>;
110
- static ɵcmp: i0.ɵɵComponentDeclaration<FuiOptionComponent, "fui-option", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, ["*"], true, never>;
143
+ static ɵcmp: i0.ɵɵComponentDeclaration<FuiOptionComponent, "fui-option", never, {}, {}, never, ["*"], true, never>;
111
144
  }
112
145
 
113
146
  /**
@@ -197,33 +230,34 @@ interface FuiSelectChange {
197
230
  * </fui-form-field>
198
231
  * ```
199
232
  */
200
- declare class FuiSelectComponent implements ControlValueAccessor, FuiFormFieldControl, DoCheck, OnDestroy, AfterContentInit {
233
+ declare class FuiSelectComponent implements ControlValueAccessor, FuiFormFieldControl, OnDestroy, AfterContentInit, AfterViewInit {
201
234
  static nextId: number;
202
235
  readonly controlType = "fui-select";
236
+ private readonly _popup;
237
+ private readonly _formSync;
238
+ private readonly _parentFormField;
203
239
  readonly placeholderInput: InputSignal<string>;
204
240
  readonly disabledInput: InputSignal<boolean>;
205
- readonly readonly: InputSignal<boolean>;
241
+ readonly readonlyInput: InputSignal<boolean>;
206
242
  readonly multiple: InputSignal<boolean>;
207
- readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null>;
208
243
  /**
209
- * Whether to compare option values using object identity or deep equality
244
+ * Comparison function for option values.
245
+ * Defaults to strict equality (`===`). Override when options use object
246
+ * values and you need to match by a property (e.g. comparing by `id`).
210
247
  */
211
248
  readonly compareWith: InputSignal<(o1: unknown, o2: unknown) => boolean>;
249
+ readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null>;
212
250
  readonly valueChange: OutputEmitterRef<unknown>;
213
251
  readonly selectionChange: OutputEmitterRef<FuiSelectChange>;
214
252
  readonly openedChange: OutputEmitterRef<boolean>;
215
253
  private readonly _value;
216
254
  private readonly _focused;
217
255
  private readonly _disabled;
218
- readonly _readOnly: WritableSignal<boolean>;
219
256
  readonly stateChanges: Subject<void>;
220
257
  private _uid;
221
258
  _ariaDescribedby: string | null;
222
259
  private readonly _errorState;
223
260
  readonly errorState: WritableSignal<boolean>;
224
- private _parentForm;
225
- private _parentFormGroup;
226
- private _defaultErrorStateMatcher;
227
261
  private readonly _ngControlRef;
228
262
  get ngControl(): NgControl | null;
229
263
  readonly placeholder: Signal<string>;
@@ -233,49 +267,52 @@ declare class FuiSelectComponent implements ControlValueAccessor, FuiFormFieldCo
233
267
  readonly focused: WritableSignal<boolean>;
234
268
  private readonly _ngControlDisabled;
235
269
  readonly disabled: Signal<boolean>;
270
+ readonly readonly: Signal<boolean>;
236
271
  readonly empty: Signal<boolean>;
237
272
  readonly id: string;
238
273
  trigger?: ElementRef<HTMLDivElement>;
239
274
  panel?: ElementRef<HTMLDivElement>;
240
- readonly options: Signal<readonly FuiOptionComponent[]>;
241
- readonly panelOpen: WritableSignal<boolean>;
275
+ readonly options: Signal<readonly FuiOptionBase[]>;
276
+ readonly panelOpen: Signal<boolean>;
242
277
  private readonly _activeOptionIndex;
243
278
  readonly activeOptionIndex: Signal<number>;
244
279
  readonly _liveAnnouncement: WritableSignal<string>;
245
- private _overlayRef;
246
- private _overlaySubscriptions;
247
- private readonly _overlayService;
248
- private readonly _elementRef;
249
- private readonly _document;
250
- private readonly _ngZone;
251
- private _outsideClickSub?;
252
- private _typeaheadBuffer;
253
- private _typeaheadTimeout;
280
+ private readonly _typeaheadBuffer;
281
+ private _typeaheadResetTimer;
254
282
  private readonly TYPE_AHEAD_DEBOUNCE;
255
283
  private _onChange;
256
284
  private _onTouched;
257
285
  readonly displayValue: Signal<string>;
258
286
  constructor();
259
- ngDoCheck(): void;
260
287
  ngOnDestroy(): void;
261
288
  ngAfterContentInit(): void;
289
+ ngAfterViewInit(): void;
290
+ /** Sets the select value from the form model. Null/undefined coerces to null. */
262
291
  writeValue(value: unknown): void;
292
+ /** Registers the callback Angular calls when the value should propagate to the model. */
263
293
  registerOnChange(fn: (value: unknown) => void): void;
294
+ /** Registers the callback Angular calls when the control should be marked as touched. */
264
295
  registerOnTouched(fn: () => void): void;
296
+ /** Enables or disables the control programmatically; mirrors the `disabled` form-control state. */
265
297
  setDisabledState(isDisabled: boolean): void;
298
+ /** Opens the panel when the form-field container is clicked, unless disabled or readonly. */
266
299
  onContainerClick(_event: MouseEvent): void;
300
+ /** Stores the space-separated list of IDs for the aria-describedby attribute. */
267
301
  setDescribedByIds(ids: string[]): void;
268
- setReadOnly(readOnly: boolean): void;
269
302
  private _syncOptionsSelection;
270
303
  _onFocus(): void;
271
304
  _onBlur(event?: FocusEvent): void;
305
+ /** Focuses the select trigger element. */
272
306
  focus(): void;
307
+ /** Blurs the select trigger element. */
273
308
  blur(): void;
309
+ /** Toggles the select panel. No-op if disabled. */
274
310
  toggle(): void;
311
+ /** Opens the select panel. No-op if disabled, readonly, or already open. */
275
312
  open(): void;
313
+ /** Closes the select panel and restores focus to the trigger unless `restoreFocus` is false. No-op if already closed. */
276
314
  close(restoreFocus?: boolean): void;
277
- _onOptionSelected(option: FuiOptionComponent): void;
278
- _getDisplayValue(): string;
315
+ _onOptionSelected(option: FuiOptionBase): void;
279
316
  _handleKeydown(event: KeyboardEvent): void;
280
317
  private _handleClosedKeydown;
281
318
  private _handleOpenKeydown;
@@ -287,21 +324,15 @@ declare class FuiSelectComponent implements ControlValueAccessor, FuiFormFieldCo
287
324
  private _selectFirstOption;
288
325
  private _selectLastOption;
289
326
  private _getEnabledOptions;
290
- private _listenForOutsideClicks;
291
- private _createOverlay;
292
- private _disposeOverlay;
293
327
  _getActiveDescendant(): string | null;
294
- /**
295
- * Announces a message to screen readers via the aria-live region.
296
- * Clears the message after a brief delay to allow repeated announcements.
297
- */
298
328
  private _announce;
299
329
  get selected(): Signal<unknown>;
330
+ /** @internal Helper to check if a value is an array. Used by tests. */
300
331
  isArray(value: unknown): value is unknown[];
301
332
  static ɵfac: i0.ɵɵFactoryDeclaration<FuiSelectComponent, never>;
302
- static ɵcmp: i0.ɵɵComponentDeclaration<FuiSelectComponent, "fui-select", never, { "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "selectionChange": "selectionChange"; "openedChange": "openedChange"; }, ["options"], ["*"], true, never>;
333
+ static ɵcmp: i0.ɵɵComponentDeclaration<FuiSelectComponent, "fui-select", never, { "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonlyInput": { "alias": "readonly"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "selectionChange": "selectionChange"; "openedChange": "openedChange"; }, ["options"], ["*"], true, [{ directive: typeof i1.FuiPopupOverlayDirective; inputs: { "positions": "positions"; "panelClass": "panelClass"; "backdropClass": "backdropClass"; "scrollStrategy": "scrollStrategy"; "minWidthFromTrigger": "minWidthFromTrigger"; }; outputs: { "openedChange": "openedChange"; "escapeKey": "escapeKey"; }; }, { directive: typeof i1.FuiFormControlSyncDirective; inputs: {}; outputs: {}; }]>;
303
334
  }
304
335
 
305
- export { FUI_SELECT, FuiOptionComponent, FuiSelectComponent };
336
+ export { FUI_OPTION, FUI_SELECT, FuiOptionBase, FuiOptionComponent, FuiSelectComponent };
306
337
  export type { FuiSelectChange, FuiSelectParent, FuiSelectSize, FuiSelectVariant };
307
338
  //# sourceMappingURL=raintonic-formaui-components-select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-select.d.ts","sources":["../../../lib/components/select/option.component.ts","../../../lib/components/select/select-tokens.ts","../../../lib/components/select/select.component.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;AACH,cA+Ba,kBAAmB,YAAW,SAAS,EAAE,aAAa;;AAGjE;;AAEG;AACH,oBAAgB,WAAW;AAE3B;;;AAGG;AACH,uBAAmB,WAAW;AAE9B;;AAEG;AACH,8BAA0B,gBAAgB;gBAAW,kBAAkB;;AAAkB;AAGzF,wBAAoB,cAAc;AAClC,sBAAkB,cAAc;2BACX,OAAA;AAGrB;AAGA;;6BAMuB,cAAA;AAEvB;AAKA;;AAUA,wBAAoB,KAAK;AAgBzB;AAOA;AAIA;;AAEG;AACH;AAQA;;AAEG;AACH;AAQA;;AAEG;AACH;AAOA;;AAEG;AACH;AAOA;;AAEG;AACH;AAOA;;AAEG;AACH;AAIA;;AAEG;AACH,uBAAmB,WAAW;;AAK9B;;AAMA;yCAvJW,kBAAkB;2CAAlB,kBAAkB;AA0J9B;;AClPD;;;AAGG;UACc,eAAe;;AAE9B;AACD;AAED;;AAEG;AACH,cAAa,UAAU,EAAA,cAAA,CAAA,eAAA;;AC2BvB;;AAEG;AACG,KAAM,aAAa;AAEzB;;AAEG;KACS,gBAAgB;AAE5B;;AAEG;UACc,eAAe;YACtB,kBAAkB;;AAE3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DG;AACH,cAgCa,kBACX,YAAW,oBAAoB,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB;;;AAO1F,+BAA2B,WAAW;AACtC,4BAAwB,WAAW;AACnC,uBAAmB,WAAW;AAC9B,uBAAmB,WAAW;gCACF,WAAW,CAAC,iBAAiB;AAEzD;;AAEG;AACH,0BAAsB,WAAW;AAKjC,0BAAsB,gBAAgB;AACtC,8BAA0B,gBAAgB,CAAC,eAAe;AAC1D,2BAAuB,gBAAgB;AAGvC;AACA;AACA;AACA,wBAAoB,cAAc;2BAGb,OAAA;;AAErB;AAGA;yBACmB,cAAA;;;;AAMnB;AACA,qBAAiB,SAAS;0BAKN,MAAA;AACpB;uBACiB,cAAA;oBAEH,cAAA;sBAEE,cAAA;AAEhB;uBACiB,MAAA;oBAEH,MAAA;;AAQ2B,cAAU,UAAU,CAAC,cAAc;AACrC,YAAQ,UAAU,CAAC,cAAc;sBAGxD,MAAA,UAAA,kBAAA;wBAGE,cAAA;AAGlB;gCAC0B,MAAA;AAG1B,gCAA4B,cAAc;;;AAO1C;AACA;AACA;AACA;;;;AAMA;;;AAWA,2BAAuB,MAAM;;AAqF7B;AAgBA;AASA;AAMA;;AAUA;AAIA;AAMA,6BAAyB,UAAU;AAMnC;AAIA;AAKA;AA6BA;AAKA,oBAAgB,UAAU;AAkB1B;AAIA;AAKA;AAUA;AAsBA;AAoBA,8BAA0B,kBAAkB;AAkD5C;AAKA,0BAAsB,aAAa;AAanC;AA6BA;AA+DA;AAkBA;AAwBA;AAuBA;AAyBA;AA2BA;AAQA;AAQA;AAKA;AAgCA;AAsDA;;AAkBA;;;AAGG;AACH;AASA,oBAAgB,MAAM;;yCAtxBX,kBAAkB;2CAAlB,kBAAkB;AA8xB9B;;;;","names":[]}
1
+ {"version":3,"file":"raintonic-formaui-components-select.d.ts","sources":["../../../lib/components/select/option-base.ts","../../../lib/components/select/option.component.ts","../../../lib/components/select/select-tokens.ts","../../../lib/components/select/select.component.ts"],"mappings":";;;;;;;;AAkBA;;;;;;AAMG;AACH,cAAa,UAAU,EAAA,cAAA,CAAA,aAAA;AAEvB;;;;;;;;AAQG;AACH,uBACsB,aAAc,YAAW,SAAS;;AAGtD;;AAEG;AACH,oBAAgB,WAAW;AAE3B;;;AAGG;AACH,uBAAmB,WAAW;AAE9B;;AAEG;AACH,8BAA0B,gBAAgB;gBAAW,aAAa;;AAAkB;AAGpF,wBAAoB,cAAc;AAClC,sBAAkB,cAAc;2BACX,OAAA;iCAGQ,UAAU,CAAC,WAAW;AAGnD,sCAAgC,oCAAA,CAAA,eAAA;;AAKhC;;AAUA,wBAAoB,KAAK;AAgBzB;AAOA;AAIA;;AAEG;AACH;AAOA;;AAEG;AACH;AAOA;;AAEG;AACH;AAOA;;AAEG;AACH;AAOA;;AAEG;AACH;AAOA;;AAEG;AACH;AAIA;;AAEG;AACH,uBAAmB,WAAW;;AAK9B;yCAvIoB,aAAa;2CAAb,aAAa;AA0IlC;;AC1KD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDG;AACH,cAuCa,kBAAmB,SAAQ,aAAa;;AAEnD,6BAAyB,MAAM;yCAFpB,kBAAkB;2CAAlB,kBAAkB;AAG9B;;AC/FD;;;AAGG;UACc,eAAe;;AAE9B;AACD;AAED;;AAEG;AACH,cAAa,UAAU,EAAA,cAAA,CAAA,eAAA;;ACkCvB;;AAEG;AACG,KAAM,aAAa;AAEzB;;AAEG;KACS,gBAAgB;AAE5B;;AAEG;UACc,eAAe;YACtB,kBAAkB;;AAE3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DG;AACH,cAyCa,kBACX,YAAW,oBAAoB,EAAE,mBAAmB,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa;;;AAOhG;AACA;AAGA;AAGA,+BAA2B,WAAW;AACtC,4BAAwB,WAAW;AACnC,4BAAwB,WAAW;AACnC,uBAAmB,WAAW;AAE9B;;;;AAIG;AACH,0BAAsB,WAAW;gCAIL,WAAW,CAAC,iBAAiB;AAGzD,0BAAsB,gBAAgB;AACtC,8BAA0B,gBAAgB,CAAC,eAAe;AAC1D,2BAAuB,gBAAgB;AAGvC;AACA;AACA;2BAEqB,OAAA;;AAErB;AAGA;yBACmB,cAAA;AAGnB;AACA,qBAAiB,SAAS;0BAKN,MAAA;AACpB;uBACiB,cAAA;oBAEH,cAAA;sBAEE,cAAA;AAEhB;uBACiB,MAAA;uBACA,MAAA;oBAEH,MAAA;;AAK0B,cAAU,UAAU,CAAC,cAAc;AACrC,YAAQ,UAAU,CAAC,cAAc;sBAGvD,MAAA,UAAA,aAAA;wBAGE,MAAA;AAGlB;gCAC0B,MAAA;AAG1B,gCAA4B,cAAc;AAG1C;;AAEA;;;AAWA,2BAAuB,MAAM;;AAqC7B;AAOA;AAKA;;AAoCA;;;;AAWA;;AAKA;;AAOA,6BAAyB,UAAU;;AAOnC;AAKA;AAKA;AAKA,oBAAgB,UAAU;;AAmB1B;;AAKA;;AAKA;;AAUA;;AAcA;AAiBA,8BAA0B,aAAa;AAqBvC,0BAAsB,aAAa;AAanC;AA6BA;AA6DA;AAOA;AAwBA;AAYA;AAQA;AA2BA;AAQA;AAQA;;AASA;AAKA,oBAAgB,MAAM;;;yCAvhBX,kBAAkB;2CAAlB,kBAAkB,mqBAAA,EAAA,CAAA,wBAAA,wRAAA,EAAA,CAAA,2BAAA;AA+hB9B;;;;","names":[]}
@@ -0,0 +1,223 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { MenuItem, FuiIntlBase } from '@raintonic/formaui/core';
3
+
4
+ /**
5
+ * # FuiSidebarNavMenuComponent
6
+ *
7
+ * A standalone sidebar navigation menu component with recursive,
8
+ * multi-level submenus. Inspired by PrimeNG's TieredMenu model
9
+ * with a minimal, structural approach.
10
+ *
11
+ * ## Features
12
+ * - Unlimited nesting depth via recursive submenu template
13
+ * - Inline expand/collapse submenus
14
+ * - Built-in search input with clear button
15
+ * - Routing integration via `routerLink` with automatic active detection
16
+ * - Keyboard navigation (Arrow keys, Enter/Space, Home/End)
17
+ * - Full ARIA support (`role="navigation"`, `aria-expanded`, `aria-haspopup`)
18
+ *
19
+ * ## Usage
20
+ *
21
+ * ```html
22
+ * <fui-sidebar-nav-menu
23
+ * [items]="menuItems"
24
+ * [(filterString)]="myFilter"
25
+ * (itemClick)="onMenuItemClick($event)"
26
+ * />
27
+ * ```
28
+ *
29
+ * ```typescript
30
+ * import { FuiSidebarNavMenuComponent, MenuItem } from '@raintonic/formaui/components/sidebar-nav-menu';
31
+ *
32
+ * @Component({
33
+ * standalone: true,
34
+ * imports: [FuiSidebarNavMenuComponent],
35
+ * template: `...`,
36
+ * })
37
+ * export class MyLayout {
38
+ * menuItems: MenuItem[] = [
39
+ * { label: 'Dashboard', icon: 'house', routerLink: '/dashboard' },
40
+ * {
41
+ * label: 'Products',
42
+ * icon: 'package',
43
+ * items: [
44
+ * { label: 'List', routerLink: '/products' },
45
+ * { label: 'Categories', routerLink: '/categories' },
46
+ * ],
47
+ * },
48
+ * { separator: true },
49
+ * { label: 'Logout', command: () => this.logout() },
50
+ * ];
51
+ *
52
+ * onMenuItemClick(item: MenuItem): void {
53
+ * console.log('Menu item:', item.label);
54
+ * }
55
+ * }
56
+ * ```
57
+ */
58
+ declare class FuiSidebarNavMenuComponent {
59
+ /**
60
+ * Array of menu items to render.
61
+ */
62
+ readonly items: _angular_core.InputSignal<MenuItem[]>;
63
+ /**
64
+ * Accessible label for the navigation region.
65
+ * @default 'Sidebar menu'
66
+ */
67
+ readonly ariaLabel: _angular_core.InputSignal<string>;
68
+ /**
69
+ * Optional filter string. When set, the menu displays only items whose label
70
+ * contains the filter text (case-insensitive, substring match). Parent items
71
+ * with matching descendants remain visible so the filtered child can be reached.
72
+ * Separators and section headers are hidden during filtering.
73
+ *
74
+ * This is a two-way bindable model signal — set it programmatically or wire it
75
+ * to the built-in search component.
76
+ */
77
+ readonly filterString: _angular_core.ModelSignal<string>;
78
+ /**
79
+ * Emitted when any clickable menu item is activated.
80
+ */
81
+ readonly itemClick: _angular_core.OutputEmitterRef<MenuItem>;
82
+ /**
83
+ * Pure derivation that assigns unique IDs without mutating consumer data.
84
+ * Each item is shallow-copied; the tree is walked recursively.
85
+ */
86
+ readonly _readyItems: _angular_core.Signal<MenuItem[]>;
87
+ /**
88
+ * Filtered items based on `filterString`. When the filter is non-empty,
89
+ * items are kept if their label matches (case-insensitive substring) or
90
+ * if any descendant matches. Separators and section headers are hidden
91
+ * during filtering.
92
+ */
93
+ readonly _filteredItems: _angular_core.Signal<MenuItem[]>;
94
+ /** @internal Pass-through handler from submenu */
95
+ _onItemClick(item: MenuItem): void;
96
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FuiSidebarNavMenuComponent, never>;
97
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FuiSidebarNavMenuComponent, "fui-sidebar-nav-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "filterString": { "alias": "filterString"; "required": false; "isSignal": true; }; }, { "filterString": "filterStringChange"; "itemClick": "itemClick"; }, never, ["[fuiSidebarNavHeader]", "[fuiSidebarNavFooter]"], true, never>;
98
+ }
99
+
100
+ /**
101
+ * Recursive submenu component for rendering nested menu items.
102
+ *
103
+ * Used internally by FuiSidebarNavMenuComponent. Renders a flat list
104
+ * of items and recurses via &lt;sidebar-nav-submenu&gt; in the template
105
+ * when an item has children.
106
+ *
107
+ * Keyboard navigation follows WAI-ARIA menu patterns:
108
+ * - ArrowDown / ArrowUp: navigate between siblings
109
+ * - ArrowRight: expand submenu
110
+ * - ArrowLeft: collapse submenu / move focus to parent
111
+ * - Enter / Space: activate item
112
+ * - Home / End: first / last item
113
+ */
114
+ declare class SidebarNavSubmenuComponent {
115
+ /** Menu items to render (IDs already assigned by parent) */
116
+ readonly items: _angular_core.InputSignal<MenuItem[]>;
117
+ /** Accessible label for this submenu group */
118
+ readonly submenuLabel: _angular_core.InputSignal<string>;
119
+ /** Whether this is the root level (applies root-level styles) */
120
+ readonly isRoot: _angular_core.InputSignal<boolean>;
121
+ /** Nesting depth (0 = root). Used to compute aria-level on section headers. */
122
+ readonly depth: _angular_core.InputSignal<number>;
123
+ /** Emitted when any clickable item is activated */
124
+ readonly itemClick: _angular_core.OutputEmitterRef<MenuItem>;
125
+ readonly _expanded: _angular_core.WritableSignal<Set<string>>;
126
+ constructor();
127
+ /** @internal Whether the item has child submenu items */
128
+ hasChildren(item: MenuItem): boolean;
129
+ /** @internal Whether the item's submenu is currently expanded */
130
+ isExpanded(item: MenuItem): boolean;
131
+ /** @internal Toggle submenu open/closed */
132
+ toggleExpand(event: Event, item: MenuItem): void;
133
+ /** @internal Handle click on a leaf (non-parent) item */
134
+ onLeafClick(event: Event, item: MenuItem): void;
135
+ /** @internal Keyboard event handler */
136
+ onKeydown(event: KeyboardEvent, item: MenuItem): void;
137
+ private _focusItemAt;
138
+ private _hasParentSubmenu;
139
+ private _focusParent;
140
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarNavSubmenuComponent, never>;
141
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidebarNavSubmenuComponent, "fui-sidebar-nav-submenu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "submenuLabel": { "alias": "submenuLabel"; "required": false; "isSignal": true; }; "isRoot": { "alias": "isRoot"; "required": false; "isSignal": true; }; "depth": { "alias": "depth"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, never, true, never>;
142
+ }
143
+
144
+ declare class FuiSidebarNavSearchIntl extends FuiIntlBase {
145
+ /** Placeholder text for the search input. */
146
+ searchPlaceholder: string;
147
+ /** aria-label for the search input. */
148
+ searchInputAriaLabel: string;
149
+ /** aria-label for the clear-search button. */
150
+ clearSearchAriaLabel: string;
151
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FuiSidebarNavSearchIntl, never>;
152
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FuiSidebarNavSearchIntl>;
153
+ }
154
+
155
+ /**
156
+ * # FuiSidebarNavSearchComponent
157
+ *
158
+ * A standalone search input component designed to be placed inside the sidebar
159
+ * navigation menu. Emits the current filter string so the parent component can
160
+ * reactively filter menu items.
161
+ *
162
+ * ## Features
163
+ * - Search input with magnifying-glass icon
164
+ * - Clear button that appears when a query is entered
165
+ * - Configurable placeholder text (falls back to `FuiSidebarNavSearchIntl` default)
166
+ * - Two-way binding via `filterString` model
167
+ * - Aria labels via `FuiSidebarNavSearchIntl` (overridable via DI)
168
+ *
169
+ * ## Usage
170
+ *
171
+ * ```html
172
+ * <fui-sidebar-nav-search
173
+ * [(filterString)]="myFilter"
174
+ * placeholder="Search…"
175
+ * />
176
+ * ```
177
+ */
178
+ declare class FuiSidebarNavSearchComponent {
179
+ readonly intl: FuiSidebarNavSearchIntl;
180
+ private readonly _cdr;
181
+ constructor();
182
+ /**
183
+ * The current filter string. Two-way bindable.
184
+ */
185
+ readonly filterString: _angular_core.ModelSignal<string>;
186
+ /**
187
+ * Placeholder text for the search input.
188
+ * Falls back to the Intl default when not set.
189
+ */
190
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
191
+ /** Resolved placeholder: input override -> Intl default. */
192
+ readonly resolvedPlaceholder: _angular_core.Signal<string>;
193
+ /** Resolved search-input aria-label: Intl default. */
194
+ readonly resolvedSearchInputAriaLabel: _angular_core.Signal<string>;
195
+ /** Resolved clear-button aria-label: Intl default. */
196
+ readonly resolvedClearSearchAriaLabel: _angular_core.Signal<string>;
197
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FuiSidebarNavSearchComponent, never>;
198
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FuiSidebarNavSearchComponent, "fui-sidebar-nav-search", never, { "filterString": { "alias": "filterString"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "filterString": "filterStringChange"; }, never, never, true, never>;
199
+ }
200
+
201
+ /**
202
+ * Walk a menu item tree and set `expanded: true` on every parent whose
203
+ * descendant chain contains a `routerLink` that matches the current URL.
204
+ *
205
+ * The function is **immutable** — it clones items only when it needs to mutate
206
+ * them, returning the same reference for untouched subtrees.
207
+ *
208
+ * ## Usage
209
+ *
210
+ * ```typescript
211
+ * import { expandMenuItems } from '@raintonic/formaui/components/sidebar-nav-menu';
212
+ *
213
+ * const items = expandMenuItems(myMenuItems, '/products/categories');
214
+ * ```
215
+ *
216
+ * @param items - Menu item tree
217
+ * @param currentUrl - The current URL path (e.g. `'/products/categories'`)
218
+ * @returns A new tree with `expanded` set on matching parent items
219
+ */
220
+ declare function expandMenuItems(items: readonly MenuItem[], currentUrl: string): MenuItem[];
221
+
222
+ export { FuiSidebarNavMenuComponent, FuiSidebarNavSearchComponent, SidebarNavSubmenuComponent, expandMenuItems };
223
+ //# sourceMappingURL=raintonic-formaui-components-sidebar-nav-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-sidebar-nav-menu.d.ts","sources":["../../../lib/components/sidebar-nav-menu/sidebar-nav-menu.component.ts","../../../lib/components/sidebar-nav-menu/sidebar-nav-submenu.component.ts","../../../lib/components/sidebar-nav-menu/sidebar-nav-search.intl.ts","../../../lib/components/sidebar-nav-menu/sidebar-nav-search.component.ts","../../../lib/components/sidebar-nav-menu/expand-menu-items.ts"],"mappings":";;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDG;AACH,cAaa,0BAA0B;AACrC;;AAEG;oBACW,aAAA,CAAA,WAAA,CAAA,QAAA;AAEd;;;AAGG;wBACe,aAAA,CAAA,WAAA;AAElB;;;;;;;;AAQG;2BACkB,aAAA,CAAA,WAAA;AAErB;;AAEG;wBACe,aAAA,CAAA,gBAAA,CAAA,QAAA;AAElB;;;AAGG;0BACiB,aAAA,CAAA,MAAA,CAAA,QAAA;AAWpB;;;;;AAKG;6BACoB,aAAA,CAAA,MAAA,CAAA,QAAA;;AAsBvB,uBAAmB,QAAQ;oDAvEhB,0BAA0B;sDAA1B,0BAA0B;AA0EtC;;AC7ID;;;;;;;;;;;;;AAaG;AACH,cAOa,0BAA0B;;oBAEvB,aAAA,CAAA,WAAA,CAAA,QAAA;;2BAGO,aAAA,CAAA,WAAA;;qBAGN,aAAA,CAAA,WAAA;;oBAGD,aAAA,CAAA,WAAA;;wBAGI,aAAA,CAAA,gBAAA,CAAA,QAAA;wBAGA,aAAA,CAAA,cAAA,CAAA,GAAA;;;AA4BlB,sBAAkB,QAAQ;;AAK1B,qBAAiB,QAAQ;;wBAML,KAAK,QAAQ,QAAQ;;uBAiCtB,KAAK,QAAQ,QAAQ;;qBAcvB,aAAa,QAAQ,QAAQ;AAwE9C;AAWA;AAIA;oDA9LW,0BAA0B;sDAA1B,0BAA0B;AAsMtC;;AC7ND,cACa,uBAAwB,SAAQ,WAAW;;AAEtD;;AAEA;;AAEA;oDANW,uBAAuB;wDAAvB,uBAAuB;AAOnC;;ACJD;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACH,cA8Ba,4BAA4B;mBAC1B,uBAAA;AACb;;AAQA;;AAEG;2BACkB,aAAA,CAAA,WAAA;AAErB;;;AAGG;0BACiB,aAAA,CAAA,WAAA;;kCAGQ,aAAA,CAAA,MAAA;;2CAGS,aAAA,CAAA,MAAA;;2CAGA,aAAA,CAAA,MAAA;oDA5B1B,4BAA4B;sDAA5B,4BAA4B;AA6BxC;;ACvFD;;;;;;;;;;;;;;;;;;AAkBG;AACH,iBAAgB,eAAe,iBAAiB,QAAQ,yBAAyB,QAAQ;;;;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, WritableSignal, Signal, TemplateRef } from '@angular/core';
2
+ import { InjectionToken, WritableSignal, Signal, TemplateRef, ElementRef } from '@angular/core';
3
3
  import { AbstractControl } from '@angular/forms';
4
4
 
5
5
  type StepperOrientation = 'horizontal' | 'vertical';
@@ -40,6 +40,7 @@ declare class FuiStepComponent {
40
40
  readonly errorMessage: _angular_core.InputSignal<string>;
41
41
  readonly stepControl: _angular_core.InputSignal<AbstractControl<any, any, any> | null>;
42
42
  readonly optional: _angular_core.InputSignalWithTransform<boolean, unknown>;
43
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
43
44
  readonly _interacted: WritableSignal<boolean>;
44
45
  readonly contentTemplate: Signal<TemplateRef<unknown> | undefined>;
45
46
  readonly hasError: Signal<boolean>;
@@ -49,7 +50,7 @@ declare class FuiStepComponent {
49
50
  /** Reset the step to its initial state. */
50
51
  reset(): void;
51
52
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FuiStepComponent, never>;
52
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FuiStepComponent, "fui-step", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "completed": { "alias": "completed"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "stepControl": { "alias": "stepControl"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
53
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FuiStepComponent, "fui-step", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "completed": { "alias": "completed"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "stepControl": { "alias": "stepControl"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
53
54
  }
54
55
 
55
56
  /**
@@ -97,6 +98,7 @@ declare class FuiStepperComponent {
97
98
  readonly selectionChange: _angular_core.OutputEmitterRef<StepSelectionChange>;
98
99
  readonly animationDone: _angular_core.OutputEmitterRef<void>;
99
100
  readonly steps: _angular_core.Signal<readonly FuiStepComponent[]>;
101
+ readonly stepHeaderButtons: _angular_core.Signal<readonly ElementRef<any>[]>;
100
102
  readonly _selectedIndex: WritableSignal<number>;
101
103
  readonly _uniqueId: number;
102
104
  readonly _selectedStep: _angular_core.Signal<FuiStepComponent>;
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-stepper.d.ts","sources":["../../../lib/components/stepper/stepper.types.ts","../../../lib/components/stepper/step.component.ts","../../../lib/components/stepper/stepper.component.ts"],"mappings":";;;;KAEY,kBAAkB;AACxB,KAAM,SAAS;UAEJ,mBAAmB;;;;;AAKnC;AAED,cAAa,eAAe,EAAA,cAAA;;ACI5B;;;;;;;;;;;;;;;;;;AAkBG;AACH,cAOa,gBAAgB;oBAEb,aAAA,CAAA,WAAA;0BACM,aAAA,CAAA,WAAA;mBACP,aAAA,CAAA,WAAA;wBACK,aAAA,CAAA,wBAAA;uBACD,aAAA,CAAA,wBAAA;2BACI,aAAA,CAAA,WAAA;0BACD,aAAA,CAAA,WAAA,CAAA,eAAA;uBACH,aAAA,CAAA,wBAAA;AAGjB,0BAAsB,cAAc;AAGpC,8BAA0B,MAAM,CAAC,WAAW;AAG5C,uBAAmB,MAAM;AASzB,oBAAgB,MAAM,CAAC,SAAS;;AAWhC;;AAKA;oDA3CW,gBAAgB;sDAAhB,gBAAgB;AAkD5B;;ACxED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCG;AACH,cAgBa,mBAAmB;0BAEV,aAAA,CAAA,WAAA,CAAA,kBAAA;qBACL,aAAA,CAAA,wBAAA;4BACO,aAAA,CAAA,WAAA;8BAGE,aAAA,CAAA,gBAAA,CAAA,mBAAA;4BACF,aAAA,CAAA,gBAAA;oBAGR,aAAA,CAAA,MAAA,UAAA,gBAAA;AAGd,6BAAyB,cAAc;;4BAMjB,aAAA,CAAA,MAAA,CAAA,gBAAA;;;AAetB;;AAuBA;;AAQA;;AAwBA;;AAQA;;AAKA;;4BA+BwB,aAAa;;AA8CrC;oDApLW,mBAAmB;sDAAnB,mBAAmB;AA6M/B;;;;","names":[]}
1
+ {"version":3,"file":"raintonic-formaui-components-stepper.d.ts","sources":["../../../lib/components/stepper/stepper.types.ts","../../../lib/components/stepper/step.component.ts","../../../lib/components/stepper/stepper.component.ts"],"mappings":";;;;KAEY,kBAAkB;AACxB,KAAM,SAAS;UAEJ,mBAAmB;;;;;AAKnC;AAED,cAAa,eAAe,EAAA,cAAA;;ACI5B;;;;;;;;;;;;;;;;;;AAkBG;AACH,cAOa,gBAAgB;oBAEb,aAAA,CAAA,WAAA;0BACM,aAAA,CAAA,WAAA;mBACP,aAAA,CAAA,WAAA;wBACK,aAAA,CAAA,wBAAA;uBACD,aAAA,CAAA,wBAAA;2BACI,aAAA,CAAA,WAAA;0BACD,aAAA,CAAA,WAAA,CAAA,eAAA;uBACH,aAAA,CAAA,wBAAA;uBACA,aAAA,CAAA,wBAAA;AAGjB,0BAAsB,cAAc;AAGpC,8BAA0B,MAAM,CAAC,WAAW;AAG5C,uBAAmB,MAAM;AASzB,oBAAgB,MAAM,CAAC,SAAS;;AAchC;;AAKA;oDA/CW,gBAAgB;sDAAhB,gBAAgB;AAsD5B;;AC1ED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCG;AACH,cAgBa,mBAAmB;0BAEV,aAAA,CAAA,WAAA,CAAA,kBAAA;qBACL,aAAA,CAAA,wBAAA;4BACO,aAAA,CAAA,WAAA;8BAGE,aAAA,CAAA,gBAAA,CAAA,mBAAA;4BACF,aAAA,CAAA,gBAAA;oBAGR,aAAA,CAAA,MAAA,UAAA,gBAAA;gCAGY,aAAA,CAAA,MAAA,UAAA,UAAA;AAG1B,6BAAyB,cAAc;;4BAMjB,aAAA,CAAA,MAAA,CAAA,gBAAA;;;AAsBtB;;AAMA;;AAMA;;AAuBA;;AAQA;;AAKA;;4BA2CwB,aAAa;;AA8CrC;oDAtLW,mBAAmB;sDAAnB,mBAAmB;AA+M/B;;;;","names":[]}