@raintonic/formaui 0.2.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 (240) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +145 -0
  3. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +806 -0
  4. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -0
  5. package/fesm2022/raintonic-formaui-cdk-form-field.mjs +86 -0
  6. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -0
  7. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +1757 -0
  8. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -0
  9. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +287 -0
  10. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -0
  11. package/fesm2022/raintonic-formaui-components-accordion.mjs +217 -0
  12. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -0
  13. package/fesm2022/raintonic-formaui-components-alert.mjs +161 -0
  14. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -0
  15. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +726 -0
  16. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -0
  17. package/fesm2022/raintonic-formaui-components-avatar.mjs +92 -0
  18. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -0
  19. package/fesm2022/raintonic-formaui-components-badge.mjs +107 -0
  20. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -0
  21. package/fesm2022/raintonic-formaui-components-big-menu.mjs +68 -0
  22. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -0
  23. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +55 -0
  24. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -0
  25. package/fesm2022/raintonic-formaui-components-button-group.mjs +103 -0
  26. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -0
  27. package/fesm2022/raintonic-formaui-components-button.mjs +241 -0
  28. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -0
  29. package/fesm2022/raintonic-formaui-components-card.mjs +270 -0
  30. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -0
  31. package/fesm2022/raintonic-formaui-components-checkbox.mjs +295 -0
  32. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -0
  33. package/fesm2022/raintonic-formaui-components-data-table.mjs +631 -0
  34. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -0
  35. package/fesm2022/raintonic-formaui-components-date-picker.mjs +1331 -0
  36. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -0
  37. package/fesm2022/raintonic-formaui-components-divider.mjs +41 -0
  38. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -0
  39. package/fesm2022/raintonic-formaui-components-drawer.mjs +190 -0
  40. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -0
  41. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs +266 -0
  42. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +1 -0
  43. package/fesm2022/raintonic-formaui-components-empty-state.mjs +33 -0
  44. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -0
  45. package/fesm2022/raintonic-formaui-components-file-upload.mjs +246 -0
  46. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -0
  47. package/fesm2022/raintonic-formaui-components-form-field.mjs +482 -0
  48. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -0
  49. package/fesm2022/raintonic-formaui-components-icon.mjs +117 -0
  50. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -0
  51. package/fesm2022/raintonic-formaui-components-input.mjs +327 -0
  52. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -0
  53. package/fesm2022/raintonic-formaui-components-list.mjs +149 -0
  54. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -0
  55. package/fesm2022/raintonic-formaui-components-menu.mjs +896 -0
  56. package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -0
  57. package/fesm2022/raintonic-formaui-components-number-input.mjs +345 -0
  58. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -0
  59. package/fesm2022/raintonic-formaui-components-paginator.mjs +139 -0
  60. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -0
  61. package/fesm2022/raintonic-formaui-components-password-input.mjs +306 -0
  62. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -0
  63. package/fesm2022/raintonic-formaui-components-popover.mjs +451 -0
  64. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -0
  65. package/fesm2022/raintonic-formaui-components-progressbar.mjs +148 -0
  66. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -0
  67. package/fesm2022/raintonic-formaui-components-radio.mjs +260 -0
  68. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -0
  69. package/fesm2022/raintonic-formaui-components-select.mjs +1011 -0
  70. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -0
  71. package/fesm2022/raintonic-formaui-components-side-panel.mjs +150 -0
  72. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -0
  73. package/fesm2022/raintonic-formaui-components-sidebar.mjs +257 -0
  74. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -0
  75. package/fesm2022/raintonic-formaui-components-skeleton.mjs +50 -0
  76. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -0
  77. package/fesm2022/raintonic-formaui-components-slider.mjs +347 -0
  78. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -0
  79. package/fesm2022/raintonic-formaui-components-spinner.mjs +63 -0
  80. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -0
  81. package/fesm2022/raintonic-formaui-components-stepper.mjs +317 -0
  82. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -0
  83. package/fesm2022/raintonic-formaui-components-tab.mjs +197 -0
  84. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -0
  85. package/fesm2022/raintonic-formaui-components-tag.mjs +78 -0
  86. package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -0
  87. package/fesm2022/raintonic-formaui-components-time-picker.mjs +644 -0
  88. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -0
  89. package/fesm2022/raintonic-formaui-components-toggle.mjs +171 -0
  90. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -0
  91. package/fesm2022/raintonic-formaui-components-toolbar.mjs +140 -0
  92. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -0
  93. package/fesm2022/raintonic-formaui-components-tooltip.mjs +555 -0
  94. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -0
  95. package/fesm2022/raintonic-formaui-components-tree-select.mjs +314 -0
  96. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -0
  97. package/fesm2022/raintonic-formaui-components-tree-table.mjs +103 -0
  98. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -0
  99. package/fesm2022/raintonic-formaui-components-tree.mjs +430 -0
  100. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -0
  101. package/fesm2022/raintonic-formaui-core.mjs +62 -0
  102. package/fesm2022/raintonic-formaui-core.mjs.map +1 -0
  103. package/fesm2022/raintonic-formaui-services-dialog.mjs +798 -0
  104. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -0
  105. package/fesm2022/raintonic-formaui-services-notification.mjs +391 -0
  106. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -0
  107. package/fesm2022/raintonic-formaui-services-theme.mjs +248 -0
  108. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -0
  109. package/fesm2022/raintonic-formaui-test-utils.mjs +66 -0
  110. package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -0
  111. package/fesm2022/raintonic-formaui.mjs +15 -0
  112. package/fesm2022/raintonic-formaui.mjs.map +1 -0
  113. package/llms-full.txt +1627 -0
  114. package/llms.txt +60 -0
  115. package/package.json +251 -0
  116. package/styles/_fonts-entry.scss +3 -0
  117. package/styles/fonts/dm-mono-400-latin.woff2 +0 -0
  118. package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
  119. package/styles/fonts/inter-tight-latin.woff2 +0 -0
  120. package/styles/index.scss +127 -0
  121. package/styles/partials/_constants.scss +29 -0
  122. package/styles/partials/_fonts.scss +36 -0
  123. package/styles/partials/_grid.scss +171 -0
  124. package/styles/partials/_mixins.scss +145 -0
  125. package/styles/partials/_motion.scss +252 -0
  126. package/styles/partials/_theme.scss +275 -0
  127. package/styles/partials/_typography.scss +112 -0
  128. package/styles/partials/_utilities.scss +480 -0
  129. package/styles/partials/themes/_dark.scss +254 -0
  130. package/styles/partials/themes/_light.scss +254 -0
  131. package/types/raintonic-formaui-cdk-drag-drop.d.ts +196 -0
  132. package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -0
  133. package/types/raintonic-formaui-cdk-form-field.d.ts +62 -0
  134. package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -0
  135. package/types/raintonic-formaui-cdk-overlay.d.ts +843 -0
  136. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -0
  137. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +112 -0
  138. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -0
  139. package/types/raintonic-formaui-components-accordion.d.ts +124 -0
  140. package/types/raintonic-formaui-components-accordion.d.ts.map +1 -0
  141. package/types/raintonic-formaui-components-alert.d.ts +143 -0
  142. package/types/raintonic-formaui-components-alert.d.ts.map +1 -0
  143. package/types/raintonic-formaui-components-autocomplete.d.ts +193 -0
  144. package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -0
  145. package/types/raintonic-formaui-components-avatar.d.ts +52 -0
  146. package/types/raintonic-formaui-components-avatar.d.ts.map +1 -0
  147. package/types/raintonic-formaui-components-badge.d.ts +47 -0
  148. package/types/raintonic-formaui-components-badge.d.ts.map +1 -0
  149. package/types/raintonic-formaui-components-big-menu.d.ts +62 -0
  150. package/types/raintonic-formaui-components-big-menu.d.ts.map +1 -0
  151. package/types/raintonic-formaui-components-breadcrumb.d.ts +26 -0
  152. package/types/raintonic-formaui-components-breadcrumb.d.ts.map +1 -0
  153. package/types/raintonic-formaui-components-button-group.d.ts +61 -0
  154. package/types/raintonic-formaui-components-button-group.d.ts.map +1 -0
  155. package/types/raintonic-formaui-components-button.d.ts +116 -0
  156. package/types/raintonic-formaui-components-button.d.ts.map +1 -0
  157. package/types/raintonic-formaui-components-card.d.ts +191 -0
  158. package/types/raintonic-formaui-components-card.d.ts.map +1 -0
  159. package/types/raintonic-formaui-components-checkbox.d.ts +132 -0
  160. package/types/raintonic-formaui-components-checkbox.d.ts.map +1 -0
  161. package/types/raintonic-formaui-components-data-table.d.ts +368 -0
  162. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -0
  163. package/types/raintonic-formaui-components-date-picker.d.ts +341 -0
  164. package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -0
  165. package/types/raintonic-formaui-components-divider.d.ts +21 -0
  166. package/types/raintonic-formaui-components-divider.d.ts.map +1 -0
  167. package/types/raintonic-formaui-components-drawer.d.ts +48 -0
  168. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -0
  169. package/types/raintonic-formaui-components-dynamic-form.d.ts +412 -0
  170. package/types/raintonic-formaui-components-dynamic-form.d.ts.map +1 -0
  171. package/types/raintonic-formaui-components-empty-state.d.ts +14 -0
  172. package/types/raintonic-formaui-components-empty-state.d.ts.map +1 -0
  173. package/types/raintonic-formaui-components-file-upload.d.ts +77 -0
  174. package/types/raintonic-formaui-components-file-upload.d.ts.map +1 -0
  175. package/types/raintonic-formaui-components-form-field.d.ts +271 -0
  176. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -0
  177. package/types/raintonic-formaui-components-icon.d.ts +61 -0
  178. package/types/raintonic-formaui-components-icon.d.ts.map +1 -0
  179. package/types/raintonic-formaui-components-input.d.ts +149 -0
  180. package/types/raintonic-formaui-components-input.d.ts.map +1 -0
  181. package/types/raintonic-formaui-components-list.d.ts +48 -0
  182. package/types/raintonic-formaui-components-list.d.ts.map +1 -0
  183. package/types/raintonic-formaui-components-menu.d.ts +403 -0
  184. package/types/raintonic-formaui-components-menu.d.ts.map +1 -0
  185. package/types/raintonic-formaui-components-number-input.d.ts +127 -0
  186. package/types/raintonic-formaui-components-number-input.d.ts.map +1 -0
  187. package/types/raintonic-formaui-components-paginator.d.ts +37 -0
  188. package/types/raintonic-formaui-components-paginator.d.ts.map +1 -0
  189. package/types/raintonic-formaui-components-password-input.d.ts +111 -0
  190. package/types/raintonic-formaui-components-password-input.d.ts.map +1 -0
  191. package/types/raintonic-formaui-components-popover.d.ts +131 -0
  192. package/types/raintonic-formaui-components-popover.d.ts.map +1 -0
  193. package/types/raintonic-formaui-components-progressbar.d.ts +111 -0
  194. package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -0
  195. package/types/raintonic-formaui-components-radio.d.ts +95 -0
  196. package/types/raintonic-formaui-components-radio.d.ts.map +1 -0
  197. package/types/raintonic-formaui-components-select.d.ts +307 -0
  198. package/types/raintonic-formaui-components-select.d.ts.map +1 -0
  199. package/types/raintonic-formaui-components-side-panel.d.ts +51 -0
  200. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -0
  201. package/types/raintonic-formaui-components-sidebar.d.ts +174 -0
  202. package/types/raintonic-formaui-components-sidebar.d.ts.map +1 -0
  203. package/types/raintonic-formaui-components-skeleton.d.ts +20 -0
  204. package/types/raintonic-formaui-components-skeleton.d.ts.map +1 -0
  205. package/types/raintonic-formaui-components-slider.d.ts +108 -0
  206. package/types/raintonic-formaui-components-slider.d.ts.map +1 -0
  207. package/types/raintonic-formaui-components-spinner.d.ts +42 -0
  208. package/types/raintonic-formaui-components-spinner.d.ts.map +1 -0
  209. package/types/raintonic-formaui-components-stepper.d.ts +126 -0
  210. package/types/raintonic-formaui-components-stepper.d.ts.map +1 -0
  211. package/types/raintonic-formaui-components-tab.d.ts +96 -0
  212. package/types/raintonic-formaui-components-tab.d.ts.map +1 -0
  213. package/types/raintonic-formaui-components-tag.d.ts +34 -0
  214. package/types/raintonic-formaui-components-tag.d.ts.map +1 -0
  215. package/types/raintonic-formaui-components-time-picker.d.ts +172 -0
  216. package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -0
  217. package/types/raintonic-formaui-components-toggle.d.ts +70 -0
  218. package/types/raintonic-formaui-components-toggle.d.ts.map +1 -0
  219. package/types/raintonic-formaui-components-toolbar.d.ts +128 -0
  220. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -0
  221. package/types/raintonic-formaui-components-tooltip.d.ts +268 -0
  222. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -0
  223. package/types/raintonic-formaui-components-tree-select.d.ts +80 -0
  224. package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -0
  225. package/types/raintonic-formaui-components-tree-table.d.ts +90 -0
  226. package/types/raintonic-formaui-components-tree-table.d.ts.map +1 -0
  227. package/types/raintonic-formaui-components-tree.d.ts +104 -0
  228. package/types/raintonic-formaui-components-tree.d.ts.map +1 -0
  229. package/types/raintonic-formaui-core.d.ts +115 -0
  230. package/types/raintonic-formaui-core.d.ts.map +1 -0
  231. package/types/raintonic-formaui-services-dialog.d.ts +451 -0
  232. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -0
  233. package/types/raintonic-formaui-services-notification.d.ts +221 -0
  234. package/types/raintonic-formaui-services-notification.d.ts.map +1 -0
  235. package/types/raintonic-formaui-services-theme.d.ts +126 -0
  236. package/types/raintonic-formaui-services-theme.d.ts.map +1 -0
  237. package/types/raintonic-formaui-test-utils.d.ts +24 -0
  238. package/types/raintonic-formaui-test-utils.d.ts.map +1 -0
  239. package/types/raintonic-formaui.d.ts +4 -0
  240. package/types/raintonic-formaui.d.ts.map +1 -0
@@ -0,0 +1,482 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, input, contentChild, computed, signal, effect, ViewChild, ContentChildren, ViewEncapsulation, ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { FUI_FORM_FIELD_CONTROL } from '@raintonic/formaui/core';
4
+ import { FuiIconComponent } from '@raintonic/formaui/components/icon';
5
+
6
+ /**
7
+ * Prefix directive for content to be placed before the input in fui-form-field
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <fui-form-field>
12
+ * <fui-label>Price</fui-label>
13
+ * <span fuiPrefix>$</span>
14
+ * <input fuiInput type="number">
15
+ * </fui-form-field>
16
+ * ```
17
+ */
18
+ class FuiPrefixDirective {
19
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiPrefixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
20
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.6", type: FuiPrefixDirective, isStandalone: true, selector: "[fuiPrefix]", host: { classAttribute: "fui-prefix" }, ngImport: i0 });
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiPrefixDirective, decorators: [{
23
+ type: Directive,
24
+ args: [{
25
+ selector: '[fuiPrefix]',
26
+ standalone: true,
27
+ host: {
28
+ class: 'fui-prefix',
29
+ },
30
+ }]
31
+ }] });
32
+
33
+ /**
34
+ * Suffix directive for content to be placed after the input in fui-form-field
35
+ *
36
+ * @example
37
+ * ```html
38
+ * <fui-form-field>
39
+ * <fui-label>Weight</fui-label>
40
+ * <input fuiInput type="number">
41
+ * <span fuiSuffix>kg</span>
42
+ * </fui-form-field>
43
+ * ```
44
+ */
45
+ class FuiSuffixDirective {
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSuffixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
47
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.6", type: FuiSuffixDirective, isStandalone: true, selector: "[fuiSuffix]", host: { classAttribute: "fui-suffix" }, ngImport: i0 });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSuffixDirective, decorators: [{
50
+ type: Directive,
51
+ args: [{
52
+ selector: '[fuiSuffix]',
53
+ standalone: true,
54
+ host: {
55
+ class: 'fui-suffix',
56
+ },
57
+ }]
58
+ }] });
59
+
60
+ /**
61
+ * # FormField Component
62
+ *
63
+ * A form field wrapper component that provides consistent styling and behavior
64
+ * for form controls. Follows Angular Material patterns with Carbon Design System styling.
65
+ *
66
+ * ## Features
67
+ * - Floating labels with configurable behavior
68
+ * - Error message display with animations
69
+ * - Helper text support
70
+ * - Prefix and suffix support
71
+ * - Outline appearance with Carbon Design System styling
72
+ * - Full accessibility support
73
+ * - Automatic integration with form controls
74
+ *
75
+ * ## Usage
76
+ *
77
+ * ### Basic Form Field
78
+ * ```html
79
+ * <fui-form-field>
80
+ * <fui-label>Email</fui-label>
81
+ * <input fuiInput type="email" placeholder="Enter your email">
82
+ * </fui-form-field>
83
+ * ```
84
+ *
85
+ * ### With Error Messages
86
+ * ```html
87
+ * <fui-form-field>
88
+ * <fui-label>Username</fui-label>
89
+ * <input fuiInput formControlName="username">
90
+ * <fui-error key="required">Username is required</fui-error>
91
+ * <fui-error key="minlength">Username must be at least 3 characters</fui-error>
92
+ * </fui-form-field>
93
+ * ```
94
+ *
95
+ * ### With Helper Text and Icons
96
+ * ```html
97
+ * <fui-form-field>
98
+ * <fui-label>Password</fui-label>
99
+ * <fui-icon fuiPrefix name="lock"></fui-icon>
100
+ * <input fuiInput type="password">
101
+ * <button fuiSuffix fuiButton variant="ghost" (click)="togglePasswordVisibility()">
102
+ * <fui-icon [name]="showPassword ? 'eye-slash' : 'eye'"></fui-icon>
103
+ * </button>
104
+ * <fui-hint>Must be at least 8 characters</fui-hint>
105
+ * </fui-form-field>
106
+ * ```
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * import { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';
111
+ * import { FuiInputDirective } from '@raintonic/formaui/components/input';
112
+ *
113
+ * @Component({
114
+ * standalone: true,
115
+ * imports: [FuiFormFieldComponent, FuiInputDirective, ReactiveFormsModule],
116
+ * template: `
117
+ * <form [formGroup]="form">
118
+ * <fui-form-field>
119
+ * <fui-label>Email Address</fui-label>
120
+ * <input fuiInput type="email" formControlName="email">
121
+ * <fui-error key="required">Email is required</fui-error>
122
+ * <fui-error key="email">Please enter a valid email</fui-error>
123
+ * </fui-form-field>
124
+ * </form>
125
+ * `
126
+ * })
127
+ * export class MyFormComponent {
128
+ * form = this.fb.group({
129
+ * email: ['', [Validators.required, Validators.email]]
130
+ * });
131
+ *
132
+ * get emailControl() {
133
+ * return this.form.get('email');
134
+ * }
135
+ * }
136
+ * ```
137
+ */
138
+ class FuiFormFieldComponent {
139
+ /**
140
+ * Whether the form field is in read-only mode.
141
+ * When true, hides the input and shows a plain text value instead.
142
+ * @default false
143
+ */
144
+ readOnly = input(false, ...(ngDevMode ? [{ debugName: "readOnly" }] : /* istanbul ignore next */ []));
145
+ /**
146
+ * Visual appearance variant.
147
+ * - `'outline'` (default): bordered input with label above
148
+ * - `'fill'`: filled background with bottom-border accent
149
+ * - `'float'`: label floats from inside the input to above it on focus/value
150
+ */
151
+ appearance = input('outline', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
152
+ /**
153
+ * Whether to hide the required marker
154
+ * @default false
155
+ */
156
+ hideRequiredMarker = input(false, ...(ngDevMode ? [{ debugName: "hideRequiredMarker" }] : /* istanbul ignore next */ []));
157
+ // Content children
158
+ control = contentChild(FUI_FORM_FIELD_CONTROL, ...(ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []));
159
+ _prefixes;
160
+ _suffixes;
161
+ _connectionContainerRef;
162
+ hideSubscript = input(false, ...(ngDevMode ? [{ debugName: "hideSubscript" }] : /* istanbul ignore next */ []));
163
+ // Read-only display value derived from the control's value
164
+ // For select/autocomplete controls, uses their displayValue signal to show the label
165
+ displayValue = computed(() => {
166
+ const control = this.control();
167
+ if (!control)
168
+ return '\u2014';
169
+ // Select and autocomplete controls expose a displayValue signal with the option label
170
+ if ('displayValue' in control &&
171
+ typeof control['displayValue'] === 'function') {
172
+ const label = control['displayValue']();
173
+ return label || '\u2014';
174
+ }
175
+ const val = control.value();
176
+ if (val == null || val === '')
177
+ return '\u2014';
178
+ return String(val);
179
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
180
+ // State signals
181
+ isFocused = computed(() => {
182
+ return this.control()?.focused() ?? false;
183
+ }, ...(ngDevMode ? [{ debugName: "isFocused" }] : /* istanbul ignore next */ []));
184
+ hasError = computed(() => {
185
+ return this.control()?.errorState() ?? false;
186
+ }, ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
187
+ isDisabled = computed(() => {
188
+ return this.control()?.disabled() ?? false;
189
+ }, ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
190
+ isEmpty = computed(() => {
191
+ return this.control()?.empty() ?? false;
192
+ }, ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
193
+ isRequired = computed(() => {
194
+ return this.control()?.required() ?? false;
195
+ }, ...(ngDevMode ? [{ debugName: "isRequired" }] : /* istanbul ignore next */ []));
196
+ /**
197
+ * Whether the floating label should be in its "floated" (raised) position.
198
+ * Only meaningful when `appearance === 'float'`. True when the field is
199
+ * focused or contains a non-empty value.
200
+ */
201
+ shouldFloat = computed(() => {
202
+ if (this.appearance() !== 'float')
203
+ return false;
204
+ return this.isFocused() || !this.isEmpty();
205
+ }, ...(ngDevMode ? [{ debugName: "shouldFloat" }] : /* istanbul ignore next */ []));
206
+ /** Whether control-specific icons (dropdown caret, calendar) should be hidden in readOnly mode */
207
+ hideControlIcons = computed(() => {
208
+ if (!this.readOnly())
209
+ return false;
210
+ const ct = this.control()?.controlType;
211
+ return ct === 'fui-select' || ct === 'fui-autocomplete' || ct === 'fui-date-picker';
212
+ }, ...(ngDevMode ? [{ debugName: "hideControlIcons" }] : /* istanbul ignore next */ []));
213
+ /** Whether the "copied" feedback indicator is active */
214
+ copied = signal(false, ...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
215
+ _copiedTimeout = null;
216
+ // Generate unique IDs
217
+ labelId = `fui-form-field-label-${Math.random().toString(36).substring(2, 11)}`;
218
+ hintId = `fui-form-field-hint-${Math.random().toString(36).substring(2, 11)}`;
219
+ errorId = `fui-form-field-error-${Math.random().toString(36).substring(2, 11)}`;
220
+ constructor() {
221
+ // Effect to update aria-describedby when state changes
222
+ effect(() => {
223
+ const control = this.control();
224
+ if (control) {
225
+ const ids = [];
226
+ if (this.hasError()) {
227
+ ids.push(this.errorId);
228
+ }
229
+ else {
230
+ ids.push(this.hintId);
231
+ }
232
+ control.setDescribedByIds(ids);
233
+ }
234
+ else {
235
+ // FuiFormField must contain an FuiFormFieldControl
236
+ }
237
+ });
238
+ // Effect to propagate readOnly state to child controls
239
+ effect(() => {
240
+ const control = this.control();
241
+ const ro = this.readOnly();
242
+ if (control?.setReadOnly) {
243
+ control.setReadOnly(ro);
244
+ }
245
+ });
246
+ }
247
+ /**
248
+ * Handles click on the form field container
249
+ */
250
+ onContainerClick(event) {
251
+ const control = this.control();
252
+ if (control && !this.isDisabled() && !this.readOnly()) {
253
+ control.onContainerClick(event);
254
+ }
255
+ }
256
+ /**
257
+ * Copies the display value to the clipboard
258
+ */
259
+ copyValue() {
260
+ const text = this.displayValue();
261
+ if (!text || text === '\u2014')
262
+ return;
263
+ void navigator.clipboard.writeText(text).then(() => {
264
+ this.copied.set(true);
265
+ if (this._copiedTimeout)
266
+ clearTimeout(this._copiedTimeout);
267
+ this._copiedTimeout = setTimeout(() => {
268
+ this.copied.set(false);
269
+ this._copiedTimeout = null;
270
+ }, 1500);
271
+ });
272
+ }
273
+ /**
274
+ * Gets the current error messages
275
+ */
276
+ getErrorMessages() {
277
+ // This would be populated by projected fui-error components
278
+ // Implementation would query ContentChildren for error components
279
+ return [];
280
+ }
281
+ /**
282
+ * Checks if the form field contains a select control
283
+ */
284
+ hasSelectControl() {
285
+ const control = this.control();
286
+ if (!control)
287
+ return false;
288
+ // Check if it's the full fui-select component
289
+ if (control.controlType === 'fui-select') {
290
+ return true;
291
+ }
292
+ // Check if it's fuiInput directive on a select element
293
+ if (control.controlType === 'fui-input' &&
294
+ typeof control['isSelect'] === 'function') {
295
+ return control['isSelect']();
296
+ }
297
+ return false;
298
+ }
299
+ /**
300
+ * Checks if the select control is a multiple select
301
+ */
302
+ isMultipleSelect() {
303
+ if (!this.hasSelectControl()) {
304
+ return false;
305
+ }
306
+ // Check if the control has a multiple property and it's true
307
+ const ctrl = this.control();
308
+ return typeof ctrl?.['multiple'] === 'function' ? ctrl['multiple']() : false;
309
+ }
310
+ /**
311
+ * Whether there is projected prefix content
312
+ */
313
+ hasPrefix() {
314
+ return (this._prefixes?.length ?? 0) > 0;
315
+ }
316
+ /**
317
+ * Whether there is projected suffix content
318
+ */
319
+ hasSuffix() {
320
+ return (this._suffixes?.length ?? 0) > 0;
321
+ }
322
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
323
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiFormFieldComponent, isStandalone: true, selector: "fui-form-field", inputs: { readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, hideRequiredMarker: { classPropertyName: "hideRequiredMarker", publicName: "hideRequiredMarker", isSignal: true, isRequired: false, transformFunction: null }, hideSubscript: { classPropertyName: "hideSubscript", publicName: "hideSubscript", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "class.fui-form-field--disabled": "isDisabled()", "class.fui-form-field--focused": "isFocused()", "class.fui-form-field--error": "hasError()", "class.fui-form-field--empty": "isEmpty()", "class.fui-form-field--readonly": "readOnly()", "class.fui-form-field--float": "appearance() === \"float\"", "class.fui-form-field--fill": "appearance() === \"fill\"", "class.fui-form-field--float-active": "shouldFloat()", "attr.aria-labelledby": "labelId", "attr.aria-disabled": "isDisabled() || null" }, classAttribute: "fui-form-field" }, queries: [{ propertyName: "control", first: true, predicate: FUI_FORM_FIELD_CONTROL, descendants: true, isSignal: true }, { propertyName: "_prefixes", predicate: FuiPrefixDirective, descendants: true }, { propertyName: "_suffixes", predicate: FuiSuffixDirective, descendants: true }], viewQueries: [{ propertyName: "_connectionContainerRef", first: true, predicate: ["connectionContainer"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !readOnly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper \u2014 always visible, styled as read-only when applicable -->\r\n <div\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"readOnly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || (hasSelectControl() && !isMultipleSelect()) || readOnly()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n\r\n <!-- Dropdown icon for select elements (not multiple) \u2014 hidden in readOnly -->\r\n @if (hasSelectControl() && !isMultipleSelect() && !readOnly()) {\r\n <div class=\"fui-form-field__select-icon\">\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </div>\r\n }\r\n\r\n <!-- Copy button \u2014 visible only in readOnly on hover -->\r\n @if (readOnly()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? 'Copied' : 'Copy value'\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n @if (hasError()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Hint text -->\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-form-field{--fui-form-field-height: var(--fui-input-height);--fui-form-field-font-size: var(--fui-font-size-02);--fui-form-field-border-radius: var(--fui-border-radius-sm);--fui-form-field-padding-x: var(--fui-spacing-04);--fui-form-field-bg: var(--fui-surface-02);--fui-form-field-border-color: var(--fui-border-color);--fui-form-field-label-color: var(--fui-text-primary);--fui-form-field-label-font-size: var(--fui-font-size-01);--fui-form-field-label-spacing: var(--fui-spacing-02);--fui-form-field-hint-color: var(--fui-text-secondary);--fui-form-field-error-color: var(--fui-field-border-error);display:block;position:relative;font-family:var(--fui-font-family-sans);font-size:var(--fui-form-field-font-size)}.fui-form-field__container{display:block;width:100%}.fui-form-field__wrapper{position:relative;display:flex;align-items:center;width:100%;min-height:var(--fui-form-field-height);cursor:text;transition:background-color,border-color,box-shadow var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms;background-color:var(--fui-form-field-bg);border:var(--fui-border-width-sm) solid var(--fui-form-field-border-color);border-radius:var(--fui-form-field-border-radius);padding:0 var(--fui-form-field-padding-x);box-shadow:var(--fui-shadow-01)}.fui-form-field:hover:not(.fui-form-field--disabled):not(.fui-form-field--readonly) .fui-form-field__wrapper{background-color:var(--fui-surface-01);border-color:var(--fui-primary)}.fui-form-field.fui-form-field--error .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-state-error);box-shadow:0 0 0 4px var(--fui-danger-50)}.fui-form-field.fui-form-field--error.fui-form-field--focused .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-field-border-error)}.fui-form-field:has(input:focus) .fui-form-field__wrapper,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-primary)!important;background-color:var(--fui-surface-01);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(input:focus) .fui-form-field__prefix,.fui-form-field:has(input:focus) .fui-form-field__suffix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__prefix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__suffix{color:var(--fui-primary)}.fui-form-field--disabled:not(.fui-form-field--readonly){opacity:.5}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__wrapper{box-shadow:none;cursor:not-allowed}.fui-form-field--disabled:not(.fui-form-field--readonly) input,.fui-form-field--disabled:not(.fui-form-field--readonly) textarea,.fui-form-field--disabled:not(.fui-form-field--readonly) select{cursor:not-allowed}.fui-form-field--readonly .fui-form-field__label{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__wrapper{cursor:default;background-color:var(--fui-surface-02);border-color:var(--fui-border-color);box-shadow:none}.fui-form-field--readonly:has(input:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-color)!important;box-shadow:none;background-color:var(--fui-surface-00)}.fui-form-field--readonly:has(input:focus) .fui-form-field__prefix,.fui-form-field--readonly:has(input:focus) .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__input input,.fui-form-field--readonly .fui-form-field__input textarea,.fui-form-field--readonly .fui-form-field__input select{color:var(--fui-text-primary)!important;-webkit-text-fill-color:var(--fui-text-primary)!important;cursor:default;opacity:1}.fui-form-field--readonly .fui-form-field__input input::placeholder,.fui-form-field--readonly .fui-form-field__input textarea::placeholder,.fui-form-field--readonly .fui-form-field__input select::placeholder{color:transparent;-webkit-text-fill-color:transparent}.fui-form-field--readonly .fui-form-field__wrapper:hover .fui-form-field__copy-btn{opacity:1;pointer-events:auto}.fui-form-field__prefix,.fui-form-field__suffix{display:flex;align-items:center;white-space:nowrap;flex:0 0 auto;position:relative;z-index:2;padding:0 var(--fui-spacing-02);color:var(--fui-text-secondary);font-size:var(--fui-font-size-02);transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field--focused .fui-form-field__prefix,.fui-form-field--focused .fui-form-field__suffix{color:var(--fui-field-border-focus)}.fui-form-field--error .fui-form-field__prefix,.fui-form-field--error .fui-form-field__suffix{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__prefix,.fui-form-field--disabled .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field__select-icon{display:flex;align-items:center;justify-content:center;width:var(--fui-icon-size-sm);height:var(--fui-icon-size-sm);margin-left:var(--fui-spacing-02);color:var(--fui-icon-secondary);pointer-events:none;transition:color,transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field:has(.fui-select--open) .fui-form-field__select-icon{color:var(--fui-field-border-focus);transform:rotate(180deg)}.fui-form-field--error .fui-form-field__select-icon{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__select-icon{color:var(--fui-text-secondary)}.fui-form-field__infix{position:relative;flex:1 1 auto;min-width:0;padding:0;z-index:2}.fui-form-field__label{display:block;text-transform:uppercase;margin-bottom:var(--fui-form-field-label-spacing);font-size:var(--fui-form-field-label-font-size);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-wide);color:var(--fui-form-field-label-color);transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__required-marker{color:var(--fui-state-error);margin-left:var(--fui-spacing-02);font-weight:var(--fui-font-weight-regular)}.fui-form-field__input{position:relative;width:100%}.fui-form-field__input input,.fui-form-field__input textarea,.fui-form-field__input select{width:100%;height:100%;border:none;outline:none;background:transparent;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-normal);color:var(--fui-text-primary);transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__input input::placeholder,.fui-form-field__input textarea::placeholder,.fui-form-field__input select::placeholder{color:var(--fui-text-disabled);opacity:1;transition:opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__input input:focus,.fui-form-field__input textarea:focus,.fui-form-field__input select:focus{outline:none}.fui-form-field__input input:focus-visible,.fui-form-field__input textarea:focus-visible,.fui-form-field__input select:focus-visible{outline:none}.fui-form-field__input input:disabled,.fui-form-field__input textarea:disabled,.fui-form-field__input select:disabled{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary)}.fui-form-field__input input:-webkit-autofill,.fui-form-field__input textarea:-webkit-autofill,.fui-form-field__input select:-webkit-autofill{-webkit-box-shadow:0 0 0 100px var(--fui-field-background) inset;-webkit-text-fill-color:var(--fui-text-primary);transition:background-color 5000s ease-in-out 0s}.fui-form-field__copy-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__copy-btn:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-form-field__copy-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-border-radius-sm);color:var(--fui-text-secondary);opacity:0;pointer-events:none;transition:opacity,color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__copy-btn:hover{color:var(--fui-primary)}.fui-form-field__subscript-wrapper{position:relative;min-height:1.25rem;padding:var(--fui-spacing-02) 0 0;font-size:var(--fui-font-size-01);line-height:var(--fui-line-height-03);letter-spacing:var(--fui-letter-spacing-wide)}.fui-form-field__error-wrapper{color:var(--fui-form-field-error-color)}.fui-form-field__error{transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms;font-weight:var(--fui-font-weight-regular)}.fui-form-field__hint-wrapper{color:var(--fui-form-field-hint-color)}.fui-form-field__hint{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms;font-weight:var(--fui-font-weight-regular)}.fui-form-field--error .fui-form-field__hint{opacity:0}.fui-form-field--float .fui-form-field__container{position:relative}.fui-form-field--float .fui-form-field__label{position:absolute;left:var(--fui-spacing-04);top:50%;transform:translateY(-50%);transform-origin:left center;pointer-events:none;z-index:3;margin-bottom:0;font-size:var(--fui-font-size-02);text-transform:none;color:var(--fui-text-secondary);transition:transform,font-size,top,color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field--float.fui-form-field--float-active .fui-form-field__label{top:-.5em;transform:translateY(0) scale(.75);font-size:var(--fui-font-size-01);color:var(--fui-primary);background-color:var(--fui-surface-00);padding:0 var(--fui-spacing-02)}.fui-form-field--float.fui-form-field--error.fui-form-field--float-active .fui-form-field__label{color:var(--fui-state-error)}.fui-form-field--float .fui-form-field__wrapper{margin-top:var(--fui-spacing-03)}.fui-form-field--fill .fui-form-field__wrapper{background-color:var(--fui-surface-03);border-bottom:var(--fui-border-width-md) solid var(--fui-form-field-border-color);border-top:none;border-left:none;border-right:none;border-radius:var(--fui-border-radius-sm) var(--fui-border-radius-sm) 0 0;box-shadow:none}.fui-form-field--fill:hover:not(.fui-form-field--disabled) .fui-form-field__wrapper{background-color:var(--fui-surface-04);border-top:none;border-left:none;border-right:none}.fui-form-field--fill.fui-form-field--focused .fui-form-field__wrapper,.fui-form-field--fill:has(input:focus) .fui-form-field__wrapper,.fui-form-field--fill:has(select:focus) .fui-form-field__wrapper{border-bottom-color:var(--fui-primary);border-top:none!important;border-left:none!important;border-right:none!important;box-shadow:none}.fui-form-field--fill.fui-form-field--error .fui-form-field__wrapper{border-bottom-color:var(--fui-state-error);border-top:none;border-left:none;border-right:none;box-shadow:none}.fui-form-field__input textarea{min-height:5rem;resize:vertical;padding:var(--fui-spacing-03) 0;line-height:1.4}.fui-form-field__input select{cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:var(--fui-spacing-06)}.fui-form-field__input select::-ms-expand{display:none}.fui-form-field__input select:disabled{cursor:not-allowed}.fui-form-field__input select option{padding:var(--fui-spacing-02);background-color:var(--fui-surface-00);color:var(--fui-text-primary)}.fui-form-field:has(select:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-primary)!important;background-color:var(--fui-surface-01);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(select:focus) .fui-form-field__prefix,.fui-form-field:has(select:focus) .fui-form-field__suffix{color:var(--fui-primary)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
324
+ }
325
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormFieldComponent, decorators: [{
326
+ type: Component,
327
+ args: [{ selector: 'fui-form-field', standalone: true, imports: [FuiIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
328
+ class: 'fui-form-field',
329
+ '[class.fui-form-field--disabled]': 'isDisabled()',
330
+ '[class.fui-form-field--focused]': 'isFocused()',
331
+ '[class.fui-form-field--error]': 'hasError()',
332
+ '[class.fui-form-field--empty]': 'isEmpty()',
333
+ '[class.fui-form-field--readonly]': 'readOnly()',
334
+ '[class.fui-form-field--float]': 'appearance() === "float"',
335
+ '[class.fui-form-field--fill]': 'appearance() === "fill"',
336
+ '[class.fui-form-field--float-active]': 'shouldFloat()',
337
+ role: 'group',
338
+ '[attr.aria-labelledby]': 'labelId',
339
+ '[attr.aria-disabled]': 'isDisabled() || null',
340
+ }, template: "<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !readOnly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper \u2014 always visible, styled as read-only when applicable -->\r\n <div\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"readOnly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || (hasSelectControl() && !isMultipleSelect()) || readOnly()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n\r\n <!-- Dropdown icon for select elements (not multiple) \u2014 hidden in readOnly -->\r\n @if (hasSelectControl() && !isMultipleSelect() && !readOnly()) {\r\n <div class=\"fui-form-field__select-icon\">\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </div>\r\n }\r\n\r\n <!-- Copy button \u2014 visible only in readOnly on hover -->\r\n @if (readOnly()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? 'Copied' : 'Copy value'\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n @if (hasError()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Hint text -->\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-form-field{--fui-form-field-height: var(--fui-input-height);--fui-form-field-font-size: var(--fui-font-size-02);--fui-form-field-border-radius: var(--fui-border-radius-sm);--fui-form-field-padding-x: var(--fui-spacing-04);--fui-form-field-bg: var(--fui-surface-02);--fui-form-field-border-color: var(--fui-border-color);--fui-form-field-label-color: var(--fui-text-primary);--fui-form-field-label-font-size: var(--fui-font-size-01);--fui-form-field-label-spacing: var(--fui-spacing-02);--fui-form-field-hint-color: var(--fui-text-secondary);--fui-form-field-error-color: var(--fui-field-border-error);display:block;position:relative;font-family:var(--fui-font-family-sans);font-size:var(--fui-form-field-font-size)}.fui-form-field__container{display:block;width:100%}.fui-form-field__wrapper{position:relative;display:flex;align-items:center;width:100%;min-height:var(--fui-form-field-height);cursor:text;transition:background-color,border-color,box-shadow var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms;background-color:var(--fui-form-field-bg);border:var(--fui-border-width-sm) solid var(--fui-form-field-border-color);border-radius:var(--fui-form-field-border-radius);padding:0 var(--fui-form-field-padding-x);box-shadow:var(--fui-shadow-01)}.fui-form-field:hover:not(.fui-form-field--disabled):not(.fui-form-field--readonly) .fui-form-field__wrapper{background-color:var(--fui-surface-01);border-color:var(--fui-primary)}.fui-form-field.fui-form-field--error .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-state-error);box-shadow:0 0 0 4px var(--fui-danger-50)}.fui-form-field.fui-form-field--error.fui-form-field--focused .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-field-border-error)}.fui-form-field:has(input:focus) .fui-form-field__wrapper,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-primary)!important;background-color:var(--fui-surface-01);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(input:focus) .fui-form-field__prefix,.fui-form-field:has(input:focus) .fui-form-field__suffix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__prefix,.fui-form-field--focused:not(.fui-form-field--error) .fui-form-field__suffix{color:var(--fui-primary)}.fui-form-field--disabled:not(.fui-form-field--readonly){opacity:.5}.fui-form-field--disabled:not(.fui-form-field--readonly) .fui-form-field__wrapper{box-shadow:none;cursor:not-allowed}.fui-form-field--disabled:not(.fui-form-field--readonly) input,.fui-form-field--disabled:not(.fui-form-field--readonly) textarea,.fui-form-field--disabled:not(.fui-form-field--readonly) select{cursor:not-allowed}.fui-form-field--readonly .fui-form-field__label{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__wrapper{cursor:default;background-color:var(--fui-surface-02);border-color:var(--fui-border-color);box-shadow:none}.fui-form-field--readonly:has(input:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-border-color)!important;box-shadow:none;background-color:var(--fui-surface-00)}.fui-form-field--readonly:has(input:focus) .fui-form-field__prefix,.fui-form-field--readonly:has(input:focus) .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field--readonly .fui-form-field__input input,.fui-form-field--readonly .fui-form-field__input textarea,.fui-form-field--readonly .fui-form-field__input select{color:var(--fui-text-primary)!important;-webkit-text-fill-color:var(--fui-text-primary)!important;cursor:default;opacity:1}.fui-form-field--readonly .fui-form-field__input input::placeholder,.fui-form-field--readonly .fui-form-field__input textarea::placeholder,.fui-form-field--readonly .fui-form-field__input select::placeholder{color:transparent;-webkit-text-fill-color:transparent}.fui-form-field--readonly .fui-form-field__wrapper:hover .fui-form-field__copy-btn{opacity:1;pointer-events:auto}.fui-form-field__prefix,.fui-form-field__suffix{display:flex;align-items:center;white-space:nowrap;flex:0 0 auto;position:relative;z-index:2;padding:0 var(--fui-spacing-02);color:var(--fui-text-secondary);font-size:var(--fui-font-size-02);transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field--focused .fui-form-field__prefix,.fui-form-field--focused .fui-form-field__suffix{color:var(--fui-field-border-focus)}.fui-form-field--error .fui-form-field__prefix,.fui-form-field--error .fui-form-field__suffix{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__prefix,.fui-form-field--disabled .fui-form-field__suffix{color:var(--fui-text-secondary)}.fui-form-field__select-icon{display:flex;align-items:center;justify-content:center;width:var(--fui-icon-size-sm);height:var(--fui-icon-size-sm);margin-left:var(--fui-spacing-02);color:var(--fui-icon-secondary);pointer-events:none;transition:color,transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field:has(.fui-select--open) .fui-form-field__select-icon{color:var(--fui-field-border-focus);transform:rotate(180deg)}.fui-form-field--error .fui-form-field__select-icon{color:var(--fui-field-border-error)}.fui-form-field--disabled .fui-form-field__select-icon{color:var(--fui-text-secondary)}.fui-form-field__infix{position:relative;flex:1 1 auto;min-width:0;padding:0;z-index:2}.fui-form-field__label{display:block;text-transform:uppercase;margin-bottom:var(--fui-form-field-label-spacing);font-size:var(--fui-form-field-label-font-size);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-wide);color:var(--fui-form-field-label-color);transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__required-marker{color:var(--fui-state-error);margin-left:var(--fui-spacing-02);font-weight:var(--fui-font-weight-regular)}.fui-form-field__input{position:relative;width:100%}.fui-form-field__input input,.fui-form-field__input textarea,.fui-form-field__input select{width:100%;height:100%;border:none;outline:none;background:transparent;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-normal);color:var(--fui-text-primary);transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__input input::placeholder,.fui-form-field__input textarea::placeholder,.fui-form-field__input select::placeholder{color:var(--fui-text-disabled);opacity:1;transition:opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__input input:focus,.fui-form-field__input textarea:focus,.fui-form-field__input select:focus{outline:none}.fui-form-field__input input:focus-visible,.fui-form-field__input textarea:focus-visible,.fui-form-field__input select:focus-visible{outline:none}.fui-form-field__input input:disabled,.fui-form-field__input textarea:disabled,.fui-form-field__input select:disabled{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary)}.fui-form-field__input input:-webkit-autofill,.fui-form-field__input textarea:-webkit-autofill,.fui-form-field__input select:-webkit-autofill{-webkit-box-shadow:0 0 0 100px var(--fui-field-background) inset;-webkit-text-fill-color:var(--fui-text-primary);transition:background-color 5000s ease-in-out 0s}.fui-form-field__copy-btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-form-field__copy-btn:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-form-field__copy-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5rem;height:1.5rem;border-radius:var(--fui-border-radius-sm);color:var(--fui-text-secondary);opacity:0;pointer-events:none;transition:opacity,color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field__copy-btn:hover{color:var(--fui-primary)}.fui-form-field__subscript-wrapper{position:relative;min-height:1.25rem;padding:var(--fui-spacing-02) 0 0;font-size:var(--fui-font-size-01);line-height:var(--fui-line-height-03);letter-spacing:var(--fui-letter-spacing-wide)}.fui-form-field__error-wrapper{color:var(--fui-form-field-error-color)}.fui-form-field__error{transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms;font-weight:var(--fui-font-weight-regular)}.fui-form-field__hint-wrapper{color:var(--fui-form-field-hint-color)}.fui-form-field__hint{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms;font-weight:var(--fui-font-weight-regular)}.fui-form-field--error .fui-form-field__hint{opacity:0}.fui-form-field--float .fui-form-field__container{position:relative}.fui-form-field--float .fui-form-field__label{position:absolute;left:var(--fui-spacing-04);top:50%;transform:translateY(-50%);transform-origin:left center;pointer-events:none;z-index:3;margin-bottom:0;font-size:var(--fui-font-size-02);text-transform:none;color:var(--fui-text-secondary);transition:transform,font-size,top,color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-form-field--float.fui-form-field--float-active .fui-form-field__label{top:-.5em;transform:translateY(0) scale(.75);font-size:var(--fui-font-size-01);color:var(--fui-primary);background-color:var(--fui-surface-00);padding:0 var(--fui-spacing-02)}.fui-form-field--float.fui-form-field--error.fui-form-field--float-active .fui-form-field__label{color:var(--fui-state-error)}.fui-form-field--float .fui-form-field__wrapper{margin-top:var(--fui-spacing-03)}.fui-form-field--fill .fui-form-field__wrapper{background-color:var(--fui-surface-03);border-bottom:var(--fui-border-width-md) solid var(--fui-form-field-border-color);border-top:none;border-left:none;border-right:none;border-radius:var(--fui-border-radius-sm) var(--fui-border-radius-sm) 0 0;box-shadow:none}.fui-form-field--fill:hover:not(.fui-form-field--disabled) .fui-form-field__wrapper{background-color:var(--fui-surface-04);border-top:none;border-left:none;border-right:none}.fui-form-field--fill.fui-form-field--focused .fui-form-field__wrapper,.fui-form-field--fill:has(input:focus) .fui-form-field__wrapper,.fui-form-field--fill:has(select:focus) .fui-form-field__wrapper{border-bottom-color:var(--fui-primary);border-top:none!important;border-left:none!important;border-right:none!important;box-shadow:none}.fui-form-field--fill.fui-form-field--error .fui-form-field__wrapper{border-bottom-color:var(--fui-state-error);border-top:none;border-left:none;border-right:none;box-shadow:none}.fui-form-field__input textarea{min-height:5rem;resize:vertical;padding:var(--fui-spacing-03) 0;line-height:1.4}.fui-form-field__input select{cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:var(--fui-spacing-06)}.fui-form-field__input select::-ms-expand{display:none}.fui-form-field__input select:disabled{cursor:not-allowed}.fui-form-field__input select option{padding:var(--fui-spacing-02);background-color:var(--fui-surface-00);color:var(--fui-text-primary)}.fui-form-field:has(select:focus) .fui-form-field__wrapper{border:var(--fui-border-width-sm) solid var(--fui-primary)!important;background-color:var(--fui-surface-01);position:relative;box-shadow:0 0 0 4px var(--fui-primary-20)}.fui-form-field:has(select:focus) .fui-form-field__prefix,.fui-form-field:has(select:focus) .fui-form-field__suffix{color:var(--fui-primary)}\n"] }]
341
+ }], ctorParameters: () => [], propDecorators: { readOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readOnly", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], hideRequiredMarker: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideRequiredMarker", required: false }] }], control: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FUI_FORM_FIELD_CONTROL), { isSignal: true }] }], _prefixes: [{
342
+ type: ContentChildren,
343
+ args: [FuiPrefixDirective, { descendants: true }]
344
+ }], _suffixes: [{
345
+ type: ContentChildren,
346
+ args: [FuiSuffixDirective, { descendants: true }]
347
+ }], _connectionContainerRef: [{
348
+ type: ViewChild,
349
+ args: ['connectionContainer', { static: true }]
350
+ }], hideSubscript: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideSubscript", required: false }] }] } });
351
+
352
+ /**
353
+ * FuiErrorComponent
354
+ *
355
+ * Validation error message shown under the form field. Can automatically show/hide
356
+ * based on a specific error key, or use with *ngIf for custom control logic.
357
+ * The component provides proper accessibility roles and live region behavior.
358
+ *
359
+ * @example
360
+ * ```html
361
+ * <!-- Automatic error key handling -->
362
+ * <fui-error key="required">This field is required</fui-error>
363
+ * <fui-error key="email">Please enter a valid email</fui-error>
364
+ *
365
+ * <!-- Manual control (backward compatible) -->
366
+ * <fui-error *ngIf="control.hasError('custom')">Custom error</fui-error>
367
+ * ```
368
+ */
369
+ class FuiErrorComponent {
370
+ /**
371
+ * Optional error key to match against form control errors.
372
+ * When provided, the error will only show if the control has this specific error.
373
+ * When not provided, the error will always show (backward compatible behavior).
374
+ */
375
+ key = input(...(ngDevMode ? [undefined, { debugName: "key" }] : /* istanbul ignore next */ []));
376
+ _parent = inject(FuiFormFieldComponent, { host: true });
377
+ /**
378
+ * Computed signal to determine if this error should be hidden
379
+ */
380
+ _shouldHide = computed(() => {
381
+ if (!this._parent.control()?.errorState()) {
382
+ return true;
383
+ }
384
+ const errorKey = this.key();
385
+ // If no key is provided, always show (backward compatible)
386
+ if (!errorKey) {
387
+ return false;
388
+ }
389
+ // If no form field control is available, show the error
390
+ const formFieldControl = this._parent.control();
391
+ if (!formFieldControl) {
392
+ return false;
393
+ }
394
+ // Get the ngControl from the form field control
395
+ const ngControl = formFieldControl.ngControl;
396
+ if (!ngControl?.control) {
397
+ return false;
398
+ }
399
+ // Hide if the control doesn't have this specific error
400
+ return !ngControl.control.hasError(errorKey);
401
+ }, ...(ngDevMode ? [{ debugName: "_shouldHide" }] : /* istanbul ignore next */ []));
402
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
403
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiErrorComponent, isStandalone: true, selector: "fui-error", inputs: { key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "alert", "aria-live": "assertive" }, properties: { "style.display": "_shouldHide() ? \"none\" : null" }, classAttribute: "fui-error" }, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true });
404
+ }
405
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiErrorComponent, decorators: [{
406
+ type: Component,
407
+ args: [{
408
+ selector: 'fui-error',
409
+ standalone: true,
410
+ template: ` <ng-content></ng-content> `,
411
+ host: {
412
+ class: 'fui-error',
413
+ role: 'alert',
414
+ 'aria-live': 'assertive',
415
+ '[style.display]': '_shouldHide() ? "none" : null',
416
+ },
417
+ }]
418
+ }], propDecorators: { key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: false }] }] } });
419
+
420
+ /**
421
+ * @component FuiHintComponent
422
+ * @selector fui-hint
423
+ * @description Helper text displayed below the form field input when there is no error.
424
+ * Automatically hidden when the parent form field is in an error state.
425
+ *
426
+ * @example
427
+ * <fui-form-field>
428
+ * <fui-label>Email</fui-label>
429
+ * <input fuiInput type="email">
430
+ * <fui-hint>We will never share your email</fui-hint>
431
+ * </fui-form-field>
432
+ */
433
+ class FuiHintComponent {
434
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiHintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
435
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiHintComponent, isStandalone: true, selector: "fui-hint", host: { classAttribute: "fui-hint" }, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true });
436
+ }
437
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiHintComponent, decorators: [{
438
+ type: Component,
439
+ args: [{
440
+ selector: 'fui-hint',
441
+ standalone: true,
442
+ template: ` <ng-content></ng-content> `,
443
+ host: {
444
+ class: 'fui-hint',
445
+ },
446
+ }]
447
+ }] });
448
+
449
+ /**
450
+ * @component FuiLabelComponent
451
+ * @selector fui-label
452
+ * @description Label element projected inside `fui-form-field` to provide an accessible
453
+ * field label. Automatically linked to the form control via `aria-labelledby`.
454
+ *
455
+ * @example
456
+ * <fui-form-field>
457
+ * <fui-label>Email</fui-label>
458
+ * <input fuiInput type="email">
459
+ * </fui-form-field>
460
+ */
461
+ class FuiLabelComponent {
462
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
463
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiLabelComponent, isStandalone: true, selector: "fui-label", host: { classAttribute: "fui-label" }, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true });
464
+ }
465
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiLabelComponent, decorators: [{
466
+ type: Component,
467
+ args: [{
468
+ selector: 'fui-label',
469
+ standalone: true,
470
+ template: ` <ng-content></ng-content> `,
471
+ host: {
472
+ class: 'fui-label',
473
+ },
474
+ }]
475
+ }] });
476
+
477
+ /**
478
+ * Generated bundle index. Do not edit.
479
+ */
480
+
481
+ export { FuiErrorComponent, FuiFormFieldComponent, FuiHintComponent, FuiLabelComponent, FuiPrefixDirective, FuiSuffixDirective };
482
+ //# sourceMappingURL=raintonic-formaui-components-form-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-form-field.mjs","sources":["../../../lib/components/form-field/prefix.directive.ts","../../../lib/components/form-field/suffix.directive.ts","../../../lib/components/form-field/form-field.component.ts","../../../lib/components/form-field/form-field.component.html","../../../lib/components/form-field/error.component.ts","../../../lib/components/form-field/hint.component.ts","../../../lib/components/form-field/label.component.ts","../../../lib/components/form-field/raintonic-formaui-components-form-field.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Prefix directive for content to be placed before the input in fui-form-field\n *\n * @example\n * ```html\n * <fui-form-field>\n * <fui-label>Price</fui-label>\n * <span fuiPrefix>$</span>\n * <input fuiInput type=\"number\">\n * </fui-form-field>\n * ```\n */\n@Directive({\n selector: '[fuiPrefix]',\n standalone: true,\n host: {\n class: 'fui-prefix',\n },\n})\nexport class FuiPrefixDirective {}\n","import { Directive } from '@angular/core';\n\n/**\n * Suffix directive for content to be placed after the input in fui-form-field\n *\n * @example\n * ```html\n * <fui-form-field>\n * <fui-label>Weight</fui-label>\n * <input fuiInput type=\"number\">\n * <span fuiSuffix>kg</span>\n * </fui-form-field>\n * ```\n */\n@Directive({\n selector: '[fuiSuffix]',\n standalone: true,\n host: {\n class: 'fui-suffix',\n },\n})\nexport class FuiSuffixDirective {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ContentChildren,\n effect,\n ElementRef,\n input,\n InputSignal,\n QueryList,\n Signal,\n signal,\n ViewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { FuiPrefixDirective } from './prefix.directive';\nimport { FuiSuffixDirective } from './suffix.directive';\nimport { FUI_FORM_FIELD_CONTROL } from '@raintonic/formaui/core';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\n\n/**\n * Available form field appearance modes.\n * - `'outline'` — default bordered appearance (Carbon Design System style)\n * - `'fill'` — filled background with bottom-border only\n * - `'float'` — floating-label that animates above the input on focus / value\n */\nexport type FormFieldAppearance = 'outline' | 'fill' | 'float';\n\n/**\n * # FormField Component\n *\n * A form field wrapper component that provides consistent styling and behavior\n * for form controls. Follows Angular Material patterns with Carbon Design System styling.\n *\n * ## Features\n * - Floating labels with configurable behavior\n * - Error message display with animations\n * - Helper text support\n * - Prefix and suffix support\n * - Outline appearance with Carbon Design System styling\n * - Full accessibility support\n * - Automatic integration with form controls\n *\n * ## Usage\n *\n * ### Basic Form Field\n * ```html\n * <fui-form-field>\n * <fui-label>Email</fui-label>\n * <input fuiInput type=\"email\" placeholder=\"Enter your email\">\n * </fui-form-field>\n * ```\n *\n * ### With Error Messages\n * ```html\n * <fui-form-field>\n * <fui-label>Username</fui-label>\n * <input fuiInput formControlName=\"username\">\n * <fui-error key=\"required\">Username is required</fui-error>\n * <fui-error key=\"minlength\">Username must be at least 3 characters</fui-error>\n * </fui-form-field>\n * ```\n *\n * ### With Helper Text and Icons\n * ```html\n * <fui-form-field>\n * <fui-label>Password</fui-label>\n * <fui-icon fuiPrefix name=\"lock\"></fui-icon>\n * <input fuiInput type=\"password\">\n * <button fuiSuffix fuiButton variant=\"ghost\" (click)=\"togglePasswordVisibility()\">\n * <fui-icon [name]=\"showPassword ? 'eye-slash' : 'eye'\"></fui-icon>\n * </button>\n * <fui-hint>Must be at least 8 characters</fui-hint>\n * </fui-form-field>\n * ```\n *\n * @example\n * ```typescript\n * import { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\n * import { FuiInputDirective } from '@raintonic/formaui/components/input';\n *\n * @Component({\n * standalone: true,\n * imports: [FuiFormFieldComponent, FuiInputDirective, ReactiveFormsModule],\n * template: `\n * <form [formGroup]=\"form\">\n * <fui-form-field>\n * <fui-label>Email Address</fui-label>\n * <input fuiInput type=\"email\" formControlName=\"email\">\n * <fui-error key=\"required\">Email is required</fui-error>\n * <fui-error key=\"email\">Please enter a valid email</fui-error>\n * </fui-form-field>\n * </form>\n * `\n * })\n * export class MyFormComponent {\n * form = this.fb.group({\n * email: ['', [Validators.required, Validators.email]]\n * });\n *\n * get emailControl() {\n * return this.form.get('email');\n * }\n * }\n * ```\n */\n@Component({\n selector: 'fui-form-field',\n standalone: true,\n imports: [FuiIconComponent],\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-form-field',\n '[class.fui-form-field--disabled]': 'isDisabled()',\n '[class.fui-form-field--focused]': 'isFocused()',\n '[class.fui-form-field--error]': 'hasError()',\n '[class.fui-form-field--empty]': 'isEmpty()',\n '[class.fui-form-field--readonly]': 'readOnly()',\n '[class.fui-form-field--float]': 'appearance() === \"float\"',\n '[class.fui-form-field--fill]': 'appearance() === \"fill\"',\n '[class.fui-form-field--float-active]': 'shouldFloat()',\n role: 'group',\n '[attr.aria-labelledby]': 'labelId',\n '[attr.aria-disabled]': 'isDisabled() || null',\n },\n})\nexport class FuiFormFieldComponent {\n /**\n * Whether the form field is in read-only mode.\n * When true, hides the input and shows a plain text value instead.\n * @default false\n */\n readonly readOnly: InputSignal<boolean> = input(false);\n\n /**\n * Visual appearance variant.\n * - `'outline'` (default): bordered input with label above\n * - `'fill'`: filled background with bottom-border accent\n * - `'float'`: label floats from inside the input to above it on focus/value\n */\n readonly appearance = input<FormFieldAppearance>('outline');\n\n /**\n * Whether to hide the required marker\n * @default false\n */\n readonly hideRequiredMarker: InputSignal<boolean> = input(false);\n\n // Content children\n control = contentChild(FUI_FORM_FIELD_CONTROL);\n\n @ContentChildren(FuiPrefixDirective, { descendants: true }) _prefixes?: QueryList<FuiPrefixDirective>;\n @ContentChildren(FuiSuffixDirective, { descendants: true }) _suffixes?: QueryList<FuiSuffixDirective>;\n @ViewChild('connectionContainer', { static: true }) _connectionContainerRef?: ElementRef<HTMLElement>;\n\n hideSubscript = input(false);\n\n // Read-only display value derived from the control's value\n // For select/autocomplete controls, uses their displayValue signal to show the label\n readonly displayValue: Signal<string> = computed(() => {\n const control = this.control();\n if (!control) return '\\u2014';\n\n // Select and autocomplete controls expose a displayValue signal with the option label\n if (\n 'displayValue' in control &&\n typeof (control as unknown as Record<string, unknown>)['displayValue'] === 'function'\n ) {\n const label = ((control as unknown as Record<string, unknown>)['displayValue'] as () => string)();\n return label || '\\u2014';\n }\n\n const val = control.value();\n if (val == null || val === '') return '\\u2014';\n return String(val);\n });\n\n // State signals\n readonly isFocused: Signal<boolean> = computed(() => {\n return this.control()?.focused() ?? false;\n });\n readonly hasError: Signal<boolean> = computed(() => {\n return this.control()?.errorState() ?? false;\n });\n readonly isDisabled: Signal<boolean> = computed(() => {\n return this.control()?.disabled() ?? false;\n });\n readonly isEmpty: Signal<boolean> = computed(() => {\n return this.control()?.empty() ?? false;\n });\n readonly isRequired: Signal<boolean> = computed(() => {\n return this.control()?.required() ?? false;\n });\n\n /**\n * Whether the floating label should be in its \"floated\" (raised) position.\n * Only meaningful when `appearance === 'float'`. True when the field is\n * focused or contains a non-empty value.\n */\n readonly shouldFloat: Signal<boolean> = computed(() => {\n if (this.appearance() !== 'float') return false;\n return this.isFocused() || !this.isEmpty();\n });\n\n /** Whether control-specific icons (dropdown caret, calendar) should be hidden in readOnly mode */\n readonly hideControlIcons: Signal<boolean> = computed(() => {\n if (!this.readOnly()) return false;\n const ct = this.control()?.controlType;\n return ct === 'fui-select' || ct === 'fui-autocomplete' || ct === 'fui-date-picker';\n });\n\n /** Whether the \"copied\" feedback indicator is active */\n readonly copied: WritableSignal<boolean> = signal(false);\n private _copiedTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Generate unique IDs\n readonly labelId = `fui-form-field-label-${Math.random().toString(36).substring(2, 11)}`;\n readonly hintId = `fui-form-field-hint-${Math.random().toString(36).substring(2, 11)}`;\n readonly errorId = `fui-form-field-error-${Math.random().toString(36).substring(2, 11)}`;\n\n constructor() {\n // Effect to update aria-describedby when state changes\n effect(() => {\n const control = this.control();\n if (control) {\n const ids: string[] = [];\n\n if (this.hasError()) {\n ids.push(this.errorId);\n } else {\n ids.push(this.hintId);\n }\n\n control.setDescribedByIds(ids);\n } else {\n // FuiFormField must contain an FuiFormFieldControl\n }\n });\n\n // Effect to propagate readOnly state to child controls\n effect(() => {\n const control = this.control();\n const ro = this.readOnly();\n if (control?.setReadOnly) {\n control.setReadOnly(ro);\n }\n });\n }\n\n /**\n * Handles click on the form field container\n */\n onContainerClick(event: MouseEvent): void {\n const control = this.control();\n if (control && !this.isDisabled() && !this.readOnly()) {\n control.onContainerClick(event);\n }\n }\n\n /**\n * Copies the display value to the clipboard\n */\n copyValue(): void {\n const text = this.displayValue();\n if (!text || text === '\\u2014') return;\n\n void navigator.clipboard.writeText(text).then(() => {\n this.copied.set(true);\n if (this._copiedTimeout) clearTimeout(this._copiedTimeout);\n this._copiedTimeout = setTimeout(() => {\n this.copied.set(false);\n this._copiedTimeout = null;\n }, 1500);\n });\n }\n\n /**\n * Gets the current error messages\n */\n getErrorMessages(): string[] {\n // This would be populated by projected fui-error components\n // Implementation would query ContentChildren for error components\n return [];\n }\n\n /**\n * Checks if the form field contains a select control\n */\n hasSelectControl(): boolean {\n const control = this.control();\n if (!control) return false;\n\n // Check if it's the full fui-select component\n if (control.controlType === 'fui-select') {\n return true;\n }\n\n // Check if it's fuiInput directive on a select element\n if (\n control.controlType === 'fui-input' &&\n typeof (control as unknown as Record<string, unknown>)['isSelect'] === 'function'\n ) {\n return ((control as unknown as Record<string, unknown>)['isSelect'] as () => boolean)();\n }\n\n return false;\n }\n\n /**\n * Checks if the select control is a multiple select\n */\n isMultipleSelect(): boolean {\n if (!this.hasSelectControl()) {\n return false;\n }\n // Check if the control has a multiple property and it's true\n const ctrl = this.control() as unknown as Record<string, unknown> | undefined;\n return typeof ctrl?.['multiple'] === 'function' ? (ctrl['multiple'] as () => boolean)() : false;\n }\n\n /**\n * Whether there is projected prefix content\n */\n hasPrefix(): boolean {\n return (this._prefixes?.length ?? 0) > 0;\n }\n\n /**\n * Whether there is projected suffix content\n */\n hasSuffix(): boolean {\n return (this._suffixes?.length ?? 0) > 0;\n }\n}\n","<div class=\"fui-form-field__container\">\r\n <!-- Label - Carbon Design System style (outside wrapper) -->\r\n <label class=\"fui-form-field__label fui-animate-fade\" [attr.id]=\"labelId\" [attr.for]=\"control()?.id\">\r\n <ng-content select=\"fui-label\"></ng-content>\r\n @if (isRequired() && !readOnly()) {\r\n <span class=\"fui-form-field__required-marker\" [class.--has-error]=\"hasError()\">*</span>\r\n }\r\n </label>\r\n\r\n <!-- Wrapper — always visible, styled as read-only when applicable -->\r\n <div\r\n class=\"fui-form-field__wrapper\"\r\n [class.fui-form-field__wrapper--readonly]=\"readOnly()\"\r\n (click)=\"onContainerClick($event)\"\r\n >\r\n <!-- Prefix -->\r\n @if (hasPrefix()) {\r\n <div class=\"fui-form-field__prefix\">\r\n <ng-content select=\"[fuiPrefix]\"></ng-content>\r\n </div>\r\n }\r\n\r\n <!-- Infix (contains input) -->\r\n <div class=\"fui-form-field__infix\">\r\n <!-- Input container -->\r\n <div class=\"fui-form-field__input\" #connectionContainer>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <!-- Suffix -->\r\n @if (hasSuffix() || (hasSelectControl() && !isMultipleSelect()) || readOnly()) {\r\n <div class=\"fui-form-field__suffix\">\r\n <!-- User-projected suffix content -->\r\n <ng-content select=\"[fuiSuffix]\"></ng-content>\r\n\r\n <!-- Dropdown icon for select elements (not multiple) — hidden in readOnly -->\r\n @if (hasSelectControl() && !isMultipleSelect() && !readOnly()) {\r\n <div class=\"fui-form-field__select-icon\">\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </div>\r\n }\r\n\r\n <!-- Copy button — visible only in readOnly on hover -->\r\n @if (readOnly()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-form-field__copy-btn\"\r\n (click)=\"copyValue(); $event.stopPropagation()\"\r\n [attr.aria-label]=\"copied() ? 'Copied' : 'Copy value'\"\r\n >\r\n <fui-icon [name]=\"copied() ? 'check' : 'copy'\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!hideSubscript()) {\r\n <!-- Helper text and error messages container -->\r\n <div class=\"fui-form-field__subscript-wrapper\">\r\n <!-- Error messages -->\r\n @if (hasError()) {\r\n <div class=\"fui-form-field__error-wrapper fui-animate-slide-in-top\">\r\n <div class=\"fui-form-field__error\" [attr.id]=\"errorId\">\r\n <ng-content select=\"fui-error\"></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Hint text -->\r\n <div class=\"fui-form-field__hint-wrapper fui-animate-fade\">\r\n <div class=\"fui-form-field__hint\" [attr.id]=\"hintId\">\r\n <ng-content select=\"fui-hint\"></ng-content>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { Component, computed, inject, input, Signal } from '@angular/core';\nimport { FuiFormFieldComponent } from './form-field.component';\n\n/**\n * FuiErrorComponent\n *\n * Validation error message shown under the form field. Can automatically show/hide\n * based on a specific error key, or use with *ngIf for custom control logic.\n * The component provides proper accessibility roles and live region behavior.\n *\n * @example\n * ```html\n * <!-- Automatic error key handling -->\n * <fui-error key=\"required\">This field is required</fui-error>\n * <fui-error key=\"email\">Please enter a valid email</fui-error>\n *\n * <!-- Manual control (backward compatible) -->\n * <fui-error *ngIf=\"control.hasError('custom')\">Custom error</fui-error>\n * ```\n */\n@Component({\n selector: 'fui-error',\n standalone: true,\n template: ` <ng-content></ng-content> `,\n host: {\n class: 'fui-error',\n role: 'alert',\n 'aria-live': 'assertive',\n '[style.display]': '_shouldHide() ? \"none\" : null',\n },\n})\nexport class FuiErrorComponent {\n /**\n * Optional error key to match against form control errors.\n * When provided, the error will only show if the control has this specific error.\n * When not provided, the error will always show (backward compatible behavior).\n */\n readonly key = input<string>();\n\n private readonly _parent = inject(FuiFormFieldComponent, { host: true });\n\n /**\n * Computed signal to determine if this error should be hidden\n */\n protected readonly _shouldHide: Signal<boolean> = computed(() => {\n if (!this._parent.control()?.errorState()) {\n return true;\n }\n const errorKey = this.key();\n // If no key is provided, always show (backward compatible)\n if (!errorKey) {\n return false;\n }\n\n // If no form field control is available, show the error\n const formFieldControl = this._parent.control();\n if (!formFieldControl) {\n return false;\n }\n\n // Get the ngControl from the form field control\n const ngControl = formFieldControl.ngControl;\n if (!ngControl?.control) {\n return false;\n }\n\n // Hide if the control doesn't have this specific error\n return !ngControl.control.hasError(errorKey);\n });\n}\n","import { Component } from '@angular/core';\n\n/**\n * @component FuiHintComponent\n * @selector fui-hint\n * @description Helper text displayed below the form field input when there is no error.\n * Automatically hidden when the parent form field is in an error state.\n *\n * @example\n * <fui-form-field>\n * <fui-label>Email</fui-label>\n * <input fuiInput type=\"email\">\n * <fui-hint>We will never share your email</fui-hint>\n * </fui-form-field>\n */\n@Component({\n selector: 'fui-hint',\n standalone: true,\n template: ` <ng-content></ng-content> `,\n host: {\n class: 'fui-hint',\n },\n})\nexport class FuiHintComponent {}\n","import { Component } from '@angular/core';\n\n/**\n * @component FuiLabelComponent\n * @selector fui-label\n * @description Label element projected inside `fui-form-field` to provide an accessible\n * field label. Automatically linked to the form control via `aria-labelledby`.\n *\n * @example\n * <fui-form-field>\n * <fui-label>Email</fui-label>\n * <input fuiInput type=\"email\">\n * </fui-form-field>\n */\n@Component({\n selector: 'fui-label',\n standalone: true,\n template: ` <ng-content></ng-content> `,\n host: {\n class: 'fui-label',\n },\n})\nexport class FuiLabelComponent {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}