@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,148 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, numberAttribute, computed, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ /**
5
+ * # FuiProgressbar Component
6
+ *
7
+ * A progress bar component compatible with Angular Material's mat-progress-bar interface.
8
+ *
9
+ * ## Features
10
+ * - Multiple modes: determinate, indeterminate, buffer, query
11
+ * - Color variants: primary, accent, warn, success, info
12
+ * - Accessible with ARIA attributes
13
+ * - Smooth animations
14
+ *
15
+ * ## Usage
16
+ *
17
+ * ### Determinate Progress
18
+ * ```html
19
+ * <fui-progressbar [value]="50"></fui-progressbar>
20
+ * ```
21
+ *
22
+ * ### Indeterminate Progress
23
+ * ```html
24
+ * <fui-progressbar mode="indeterminate"></fui-progressbar>
25
+ * ```
26
+ *
27
+ * ### Buffer Progress
28
+ * ```html
29
+ * <fui-progressbar mode="buffer" [value]="50" [bufferValue]="75"></fui-progressbar>
30
+ * ```
31
+ *
32
+ * ### Query Progress
33
+ * ```html
34
+ * <fui-progressbar mode="query"></fui-progressbar>
35
+ * ```
36
+ *
37
+ * ### Color Variants
38
+ * ```html
39
+ * <fui-progressbar [value]="50" color="success"></fui-progressbar>
40
+ * ```
41
+ */
42
+ class FuiProgressbarComponent {
43
+ /**
44
+ * Progress bar mode (compatible with mat-progress-bar)
45
+ * - determinate: Shows a specific progress value
46
+ * - indeterminate: Shows an animation for unknown progress
47
+ * - buffer: Shows progress with a buffer indicator
48
+ * - query: Shows a query animation (reverse indeterminate)
49
+ */
50
+ mode = input('determinate', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
51
+ /**
52
+ * Progress value (0-100)
53
+ */
54
+ value = input(0, { ...(ngDevMode ? { debugName: "value" } : /* istanbul ignore next */ {}), transform: numberAttribute });
55
+ /**
56
+ * Buffer value for buffer mode (0-100)
57
+ */
58
+ bufferValue = input(0, { ...(ngDevMode ? { debugName: "bufferValue" } : /* istanbul ignore next */ {}), transform: numberAttribute });
59
+ /**
60
+ * Color variant
61
+ */
62
+ color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
63
+ /**
64
+ * ARIA label for accessibility.
65
+ * When neither aria-label nor aria-labelledby is provided, a default label
66
+ * is computed based on the mode (e.g. "Loading" for indeterminate/query).
67
+ */
68
+ ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
69
+ /**
70
+ * ARIA labelledby for accessibility
71
+ */
72
+ ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
73
+ /**
74
+ * Effective aria-label: uses the explicit input, or falls back to a
75
+ * default when no aria-labelledby is provided either.
76
+ */
77
+ effectiveAriaLabel = computed(() => {
78
+ const explicit = this.ariaLabel();
79
+ if (explicit)
80
+ return explicit;
81
+ // If aria-labelledby is set, don't add a redundant label
82
+ if (this.ariaLabelledby())
83
+ return null;
84
+ // Default labels per mode
85
+ const m = this.mode();
86
+ if (m === 'indeterminate' || m === 'query')
87
+ return 'Loading';
88
+ return 'Progress';
89
+ }, ...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
90
+ /**
91
+ * Clamped progress value (0-100)
92
+ */
93
+ clampedValue = computed(() => this._clamp(this.value()), ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
94
+ /**
95
+ * Clamped buffer value (0-100)
96
+ */
97
+ clampedBufferValue = computed(() => this._clamp(this.bufferValue()), ...(ngDevMode ? [{ debugName: "clampedBufferValue" }] : /* istanbul ignore next */ []));
98
+ /**
99
+ * Transform for the primary progress bar
100
+ */
101
+ primaryTransform = computed(() => {
102
+ const value = this.clampedValue();
103
+ return `scaleX(${value / 100})`;
104
+ }, ...(ngDevMode ? [{ debugName: "primaryTransform" }] : /* istanbul ignore next */ []));
105
+ /**
106
+ * Transform for the buffer bar
107
+ */
108
+ bufferTransform = computed(() => {
109
+ const bufferValue = this.clampedBufferValue();
110
+ return `scaleX(${bufferValue / 100})`;
111
+ }, ...(ngDevMode ? [{ debugName: "bufferTransform" }] : /* istanbul ignore next */ []));
112
+ /**
113
+ * Clamps a value between 0 and 100
114
+ */
115
+ _clamp(value) {
116
+ return Math.max(0, Math.min(100, value || 0));
117
+ }
118
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiProgressbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
119
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiProgressbarComponent, isStandalone: true, selector: "fui-progressbar", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, bufferValue: { classPropertyName: "bufferValue", publicName: "bufferValue", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar" }, properties: { "class.fui-progressbar--determinate": "mode() === \"determinate\"", "class.fui-progressbar--indeterminate": "mode() === \"indeterminate\"", "class.fui-progressbar--buffer": "mode() === \"buffer\"", "class.fui-progressbar--query": "mode() === \"query\"", "class.fui-progressbar--primary": "color() === \"primary\"", "class.fui-progressbar--accent": "color() === \"accent\"", "class.fui-progressbar--warn": "color() === \"warn\"", "class.fui-progressbar--success": "color() === \"success\"", "class.fui-progressbar--info": "color() === \"info\"", "attr.aria-valuenow": "mode() === \"determinate\" || mode() === \"buffer\" ? clampedValue() : null", "attr.aria-valuemin": "0", "attr.aria-valuemax": "100", "attr.aria-label": "effectiveAriaLabel()", "attr.aria-labelledby": "ariaLabelledby()" }, classAttribute: "fui-progressbar" }, ngImport: i0, template: "<!-- Track (background) -->\r\n<div class=\"fui-progressbar__track\">\r\n <!-- Buffer bar (for buffer mode) -->\r\n @if (mode() === 'buffer') {\r\n <div class=\"fui-progressbar__buffer\" [style.transform]=\"bufferTransform()\"></div>\r\n <div class=\"fui-progressbar__buffer-dots\"></div>\r\n }\r\n\r\n <!-- Primary progress bar -->\r\n <div\r\n class=\"fui-progressbar__bar fui-progressbar__primary-bar\"\r\n [style.transform]=\"mode() === 'determinate' || mode() === 'buffer' ? primaryTransform() : null\"\r\n ></div>\r\n\r\n <!-- Secondary bar (for indeterminate/query modes) -->\r\n @if (mode() === 'indeterminate' || mode() === 'query') {\r\n <div class=\"fui-progressbar__bar fui-progressbar__secondary-bar\"></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)}@keyframes fui-progressbar-primary-indeterminate{0%{transform:scaleX(0)}20%{transform:scaleX(.4)}50%{transform:scaleX(.6)}75%{transform:scaleX(.8)}to{transform:scaleX(1)}}@keyframes fui-progressbar-secondary-indeterminate{0%{transform:scaleX(0)}20%{transform:scaleX(.5)}50%{transform:scaleX(.7)}75%{transform:scaleX(.9)}to{transform:scaleX(1)}}@keyframes fui-progressbar-buffer-dots{0%{background-position:0 0}to{background-position:-10px 0}}.fui-progressbar{--fui-progressbar-height: 4px;--fui-progressbar-border-radius: var(--fui-border-radius-pill);--fui-progressbar-track: var(--fui-secondary-40);--fui-progressbar-bar: var(--fui-primary);--fui-progressbar-buffer: var(--fui-primary-30);display:block;width:100%;height:var(--fui-progressbar-height);overflow:hidden;position:relative;contain:content}.fui-progressbar__track{position:relative;width:100%;height:100%;background-color:var(--fui-progressbar-track, var(--fui-secondary-40));border-radius:var(--fui-border-radius-pill);overflow:hidden}.fui-progressbar__bar{position:absolute;top:0;left:0;height:100%;width:100%;transform-origin:left center;border-radius:var(--fui-border-radius-pill);transition:transform var(--fui-duration-moderate-02) var(--fui-ease-standard) 0ms}.fui-progressbar__primary-bar{background-color:var(--fui-progressbar-bar, var(--fui-primary))}.fui-progressbar__secondary-bar{background-color:var(--fui-progressbar-bar, var(--fui-primary));opacity:.4}.fui-progressbar__buffer{position:absolute;top:0;left:0;height:100%;width:100%;transform-origin:left center;background-color:var(--fui-progressbar-buffer, var(--fui-primary-30));border-radius:var(--fui-border-radius-pill);transition:transform var(--fui-duration-moderate-02) var(--fui-ease-standard) 0ms}.fui-progressbar__buffer-dots{position:absolute;top:0;left:0;width:100%;height:100%;background-image:repeating-linear-gradient(90deg,var(--fui-progressbar-track, var(--fui-secondary-40)) 0px,var(--fui-progressbar-track, var(--fui-secondary-40)) 2px,transparent 2px,transparent 8px);background-size:10px 100%;animation:fui-progressbar-buffer-dots .5s linear infinite}.fui-progressbar--determinate .fui-progressbar__primary-bar{transform:scaleX(0)}.fui-progressbar--indeterminate .fui-progressbar__primary-bar{transform-origin:center;animation:fui-progressbar-primary-indeterminate 2s linear infinite}.fui-progressbar--indeterminate .fui-progressbar__secondary-bar{transform-origin:center;animation:fui-progressbar-secondary-indeterminate 2s linear infinite}.fui-progressbar--buffer .fui-progressbar__primary-bar{transform:scaleX(0);z-index:1}.fui-progressbar--query .fui-progressbar__primary-bar{transform-origin:center;animation:fui-progressbar-primary-indeterminate 2s linear infinite reverse}.fui-progressbar--query .fui-progressbar__secondary-bar{transform-origin:center;animation:fui-progressbar-secondary-indeterminate 2s linear infinite reverse;animation-delay:.7s}.fui-progressbar--primary{--fui-progressbar-bar: var(--fui-primary);--fui-progressbar-buffer: var(--fui-primary-30);--fui-progressbar-track: var(--fui-primary-20)}.fui-progressbar--accent{--fui-progressbar-bar: var(--fui-secondary-80);--fui-progressbar-buffer: var(--fui-secondary-50);--fui-progressbar-track: var(--fui-secondary-30)}.fui-progressbar--warn{--fui-progressbar-bar: var(--fui-danger-90);--fui-progressbar-buffer: var(--fui-danger-50);--fui-progressbar-track: var(--fui-danger-30)}.fui-progressbar--success{--fui-progressbar-bar: var(--fui-success-90);--fui-progressbar-buffer: var(--fui-success-50);--fui-progressbar-track: var(--fui-success-30)}.fui-progressbar--info{--fui-progressbar-bar: var(--fui-info-90);--fui-progressbar-buffer: var(--fui-info-50);--fui-progressbar-track: var(--fui-info-30)}@media(prefers-reduced-motion:reduce){.fui-progressbar__bar,.fui-progressbar__buffer,.fui-progressbar__buffer-dots{animation:none;transition:none}.fui-progressbar--indeterminate .fui-progressbar__primary-bar,.fui-progressbar--query .fui-progressbar__primary-bar{animation:none;transform:scaleX(1);opacity:.5}.fui-progressbar--indeterminate .fui-progressbar__secondary-bar,.fui-progressbar--query .fui-progressbar__secondary-bar{display:none}}@media(prefers-contrast:high){.fui-progressbar__track{border:1px solid currentColor}.fui-progressbar__bar{background-color:currentColor}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
120
+ }
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiProgressbarComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'fui-progressbar', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
124
+ class: 'fui-progressbar',
125
+ '[class.fui-progressbar--determinate]': 'mode() === "determinate"',
126
+ '[class.fui-progressbar--indeterminate]': 'mode() === "indeterminate"',
127
+ '[class.fui-progressbar--buffer]': 'mode() === "buffer"',
128
+ '[class.fui-progressbar--query]': 'mode() === "query"',
129
+ '[class.fui-progressbar--primary]': 'color() === "primary"',
130
+ '[class.fui-progressbar--accent]': 'color() === "accent"',
131
+ '[class.fui-progressbar--warn]': 'color() === "warn"',
132
+ '[class.fui-progressbar--success]': 'color() === "success"',
133
+ '[class.fui-progressbar--info]': 'color() === "info"',
134
+ role: 'progressbar',
135
+ '[attr.aria-valuenow]': 'mode() === "determinate" || mode() === "buffer" ? clampedValue() : null',
136
+ '[attr.aria-valuemin]': '0',
137
+ '[attr.aria-valuemax]': '100',
138
+ '[attr.aria-label]': 'effectiveAriaLabel()',
139
+ '[attr.aria-labelledby]': 'ariaLabelledby()',
140
+ }, template: "<!-- Track (background) -->\r\n<div class=\"fui-progressbar__track\">\r\n <!-- Buffer bar (for buffer mode) -->\r\n @if (mode() === 'buffer') {\r\n <div class=\"fui-progressbar__buffer\" [style.transform]=\"bufferTransform()\"></div>\r\n <div class=\"fui-progressbar__buffer-dots\"></div>\r\n }\r\n\r\n <!-- Primary progress bar -->\r\n <div\r\n class=\"fui-progressbar__bar fui-progressbar__primary-bar\"\r\n [style.transform]=\"mode() === 'determinate' || mode() === 'buffer' ? primaryTransform() : null\"\r\n ></div>\r\n\r\n <!-- Secondary bar (for indeterminate/query modes) -->\r\n @if (mode() === 'indeterminate' || mode() === 'query') {\r\n <div class=\"fui-progressbar__bar fui-progressbar__secondary-bar\"></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)}@keyframes fui-progressbar-primary-indeterminate{0%{transform:scaleX(0)}20%{transform:scaleX(.4)}50%{transform:scaleX(.6)}75%{transform:scaleX(.8)}to{transform:scaleX(1)}}@keyframes fui-progressbar-secondary-indeterminate{0%{transform:scaleX(0)}20%{transform:scaleX(.5)}50%{transform:scaleX(.7)}75%{transform:scaleX(.9)}to{transform:scaleX(1)}}@keyframes fui-progressbar-buffer-dots{0%{background-position:0 0}to{background-position:-10px 0}}.fui-progressbar{--fui-progressbar-height: 4px;--fui-progressbar-border-radius: var(--fui-border-radius-pill);--fui-progressbar-track: var(--fui-secondary-40);--fui-progressbar-bar: var(--fui-primary);--fui-progressbar-buffer: var(--fui-primary-30);display:block;width:100%;height:var(--fui-progressbar-height);overflow:hidden;position:relative;contain:content}.fui-progressbar__track{position:relative;width:100%;height:100%;background-color:var(--fui-progressbar-track, var(--fui-secondary-40));border-radius:var(--fui-border-radius-pill);overflow:hidden}.fui-progressbar__bar{position:absolute;top:0;left:0;height:100%;width:100%;transform-origin:left center;border-radius:var(--fui-border-radius-pill);transition:transform var(--fui-duration-moderate-02) var(--fui-ease-standard) 0ms}.fui-progressbar__primary-bar{background-color:var(--fui-progressbar-bar, var(--fui-primary))}.fui-progressbar__secondary-bar{background-color:var(--fui-progressbar-bar, var(--fui-primary));opacity:.4}.fui-progressbar__buffer{position:absolute;top:0;left:0;height:100%;width:100%;transform-origin:left center;background-color:var(--fui-progressbar-buffer, var(--fui-primary-30));border-radius:var(--fui-border-radius-pill);transition:transform var(--fui-duration-moderate-02) var(--fui-ease-standard) 0ms}.fui-progressbar__buffer-dots{position:absolute;top:0;left:0;width:100%;height:100%;background-image:repeating-linear-gradient(90deg,var(--fui-progressbar-track, var(--fui-secondary-40)) 0px,var(--fui-progressbar-track, var(--fui-secondary-40)) 2px,transparent 2px,transparent 8px);background-size:10px 100%;animation:fui-progressbar-buffer-dots .5s linear infinite}.fui-progressbar--determinate .fui-progressbar__primary-bar{transform:scaleX(0)}.fui-progressbar--indeterminate .fui-progressbar__primary-bar{transform-origin:center;animation:fui-progressbar-primary-indeterminate 2s linear infinite}.fui-progressbar--indeterminate .fui-progressbar__secondary-bar{transform-origin:center;animation:fui-progressbar-secondary-indeterminate 2s linear infinite}.fui-progressbar--buffer .fui-progressbar__primary-bar{transform:scaleX(0);z-index:1}.fui-progressbar--query .fui-progressbar__primary-bar{transform-origin:center;animation:fui-progressbar-primary-indeterminate 2s linear infinite reverse}.fui-progressbar--query .fui-progressbar__secondary-bar{transform-origin:center;animation:fui-progressbar-secondary-indeterminate 2s linear infinite reverse;animation-delay:.7s}.fui-progressbar--primary{--fui-progressbar-bar: var(--fui-primary);--fui-progressbar-buffer: var(--fui-primary-30);--fui-progressbar-track: var(--fui-primary-20)}.fui-progressbar--accent{--fui-progressbar-bar: var(--fui-secondary-80);--fui-progressbar-buffer: var(--fui-secondary-50);--fui-progressbar-track: var(--fui-secondary-30)}.fui-progressbar--warn{--fui-progressbar-bar: var(--fui-danger-90);--fui-progressbar-buffer: var(--fui-danger-50);--fui-progressbar-track: var(--fui-danger-30)}.fui-progressbar--success{--fui-progressbar-bar: var(--fui-success-90);--fui-progressbar-buffer: var(--fui-success-50);--fui-progressbar-track: var(--fui-success-30)}.fui-progressbar--info{--fui-progressbar-bar: var(--fui-info-90);--fui-progressbar-buffer: var(--fui-info-50);--fui-progressbar-track: var(--fui-info-30)}@media(prefers-reduced-motion:reduce){.fui-progressbar__bar,.fui-progressbar__buffer,.fui-progressbar__buffer-dots{animation:none;transition:none}.fui-progressbar--indeterminate .fui-progressbar__primary-bar,.fui-progressbar--query .fui-progressbar__primary-bar{animation:none;transform:scaleX(1);opacity:.5}.fui-progressbar--indeterminate .fui-progressbar__secondary-bar,.fui-progressbar--query .fui-progressbar__secondary-bar{display:none}}@media(prefers-contrast:high){.fui-progressbar__track{border:1px solid currentColor}.fui-progressbar__bar{background-color:currentColor}}\n"] }]
141
+ }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], bufferValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "bufferValue", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }] } });
142
+
143
+ /**
144
+ * Generated bundle index. Do not edit.
145
+ */
146
+
147
+ export { FuiProgressbarComponent };
148
+ //# sourceMappingURL=raintonic-formaui-components-progressbar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-progressbar.mjs","sources":["../../../lib/components/progressbar/progressbar.component.ts","../../../lib/components/progressbar/progressbar.component.html","../../../lib/components/progressbar/raintonic-formaui-components-progressbar.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, ViewEncapsulation, input, computed, numberAttribute } from '@angular/core';\n\n/**\n * Progress bar mode types (compatible with mat-progress-bar)\n */\nexport type ProgressBarMode = 'determinate' | 'indeterminate' | 'buffer' | 'query';\n\n/**\n * Progress bar color variants\n */\nexport type ProgressBarColor = 'primary' | 'accent' | 'warn' | 'success' | 'info';\n\n/**\n * # FuiProgressbar Component\n *\n * A progress bar component compatible with Angular Material's mat-progress-bar interface.\n *\n * ## Features\n * - Multiple modes: determinate, indeterminate, buffer, query\n * - Color variants: primary, accent, warn, success, info\n * - Accessible with ARIA attributes\n * - Smooth animations\n *\n * ## Usage\n *\n * ### Determinate Progress\n * ```html\n * <fui-progressbar [value]=\"50\"></fui-progressbar>\n * ```\n *\n * ### Indeterminate Progress\n * ```html\n * <fui-progressbar mode=\"indeterminate\"></fui-progressbar>\n * ```\n *\n * ### Buffer Progress\n * ```html\n * <fui-progressbar mode=\"buffer\" [value]=\"50\" [bufferValue]=\"75\"></fui-progressbar>\n * ```\n *\n * ### Query Progress\n * ```html\n * <fui-progressbar mode=\"query\"></fui-progressbar>\n * ```\n *\n * ### Color Variants\n * ```html\n * <fui-progressbar [value]=\"50\" color=\"success\"></fui-progressbar>\n * ```\n */\n@Component({\n selector: 'fui-progressbar',\n standalone: true,\n imports: [],\n templateUrl: './progressbar.component.html',\n styleUrls: ['./progressbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-progressbar',\n '[class.fui-progressbar--determinate]': 'mode() === \"determinate\"',\n '[class.fui-progressbar--indeterminate]': 'mode() === \"indeterminate\"',\n '[class.fui-progressbar--buffer]': 'mode() === \"buffer\"',\n '[class.fui-progressbar--query]': 'mode() === \"query\"',\n '[class.fui-progressbar--primary]': 'color() === \"primary\"',\n '[class.fui-progressbar--accent]': 'color() === \"accent\"',\n '[class.fui-progressbar--warn]': 'color() === \"warn\"',\n '[class.fui-progressbar--success]': 'color() === \"success\"',\n '[class.fui-progressbar--info]': 'color() === \"info\"',\n role: 'progressbar',\n '[attr.aria-valuenow]': 'mode() === \"determinate\" || mode() === \"buffer\" ? clampedValue() : null',\n '[attr.aria-valuemin]': '0',\n '[attr.aria-valuemax]': '100',\n '[attr.aria-label]': 'effectiveAriaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n },\n})\nexport class FuiProgressbarComponent {\n /**\n * Progress bar mode (compatible with mat-progress-bar)\n * - determinate: Shows a specific progress value\n * - indeterminate: Shows an animation for unknown progress\n * - buffer: Shows progress with a buffer indicator\n * - query: Shows a query animation (reverse indeterminate)\n */\n readonly mode = input<ProgressBarMode>('determinate');\n\n /**\n * Progress value (0-100)\n */\n readonly value = input<number, unknown>(0, {\n transform: numberAttribute,\n });\n\n /**\n * Buffer value for buffer mode (0-100)\n */\n readonly bufferValue = input<number, unknown>(0, {\n transform: numberAttribute,\n });\n\n /**\n * Color variant\n */\n readonly color = input<ProgressBarColor>('primary');\n\n /**\n * ARIA label for accessibility.\n * When neither aria-label nor aria-labelledby is provided, a default label\n * is computed based on the mode (e.g. \"Loading\" for indeterminate/query).\n */\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n\n /**\n * ARIA labelledby for accessibility\n */\n readonly ariaLabelledby = input<string | null>(null, { alias: 'aria-labelledby' });\n\n /**\n * Effective aria-label: uses the explicit input, or falls back to a\n * default when no aria-labelledby is provided either.\n */\n readonly effectiveAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n // If aria-labelledby is set, don't add a redundant label\n if (this.ariaLabelledby()) return null;\n // Default labels per mode\n const m = this.mode();\n if (m === 'indeterminate' || m === 'query') return 'Loading';\n return 'Progress';\n });\n\n /**\n * Clamped progress value (0-100)\n */\n readonly clampedValue = computed(() => this._clamp(this.value()));\n\n /**\n * Clamped buffer value (0-100)\n */\n readonly clampedBufferValue = computed(() => this._clamp(this.bufferValue()));\n\n /**\n * Transform for the primary progress bar\n */\n readonly primaryTransform = computed(() => {\n const value = this.clampedValue();\n return `scaleX(${value / 100})`;\n });\n\n /**\n * Transform for the buffer bar\n */\n readonly bufferTransform = computed(() => {\n const bufferValue = this.clampedBufferValue();\n return `scaleX(${bufferValue / 100})`;\n });\n\n /**\n * Clamps a value between 0 and 100\n */\n private _clamp(value: number): number {\n return Math.max(0, Math.min(100, value || 0));\n }\n}\n","<!-- Track (background) -->\r\n<div class=\"fui-progressbar__track\">\r\n <!-- Buffer bar (for buffer mode) -->\r\n @if (mode() === 'buffer') {\r\n <div class=\"fui-progressbar__buffer\" [style.transform]=\"bufferTransform()\"></div>\r\n <div class=\"fui-progressbar__buffer-dots\"></div>\r\n }\r\n\r\n <!-- Primary progress bar -->\r\n <div\r\n class=\"fui-progressbar__bar fui-progressbar__primary-bar\"\r\n [style.transform]=\"mode() === 'determinate' || mode() === 'buffer' ? primaryTransform() : null\"\r\n ></div>\r\n\r\n <!-- Secondary bar (for indeterminate/query modes) -->\r\n @if (mode() === 'indeterminate' || mode() === 'query') {\r\n <div class=\"fui-progressbar__bar fui-progressbar__secondary-bar\"></div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, input, booleanAttribute, signal, inject, viewChild, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, output, contentChildren, effect } from '@angular/core';
3
+ import { NgForm, FormGroupDirective, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { Subject } from 'rxjs';
5
+ import { DefaultErrorStateMatcher } from '@raintonic/formaui/core';
6
+ import { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';
7
+
8
+ const FUI_RADIO_GROUP = new InjectionToken('FUI_RADIO_GROUP');
9
+
10
+ class FuiRadioButtonComponent {
11
+ static nextId = 0;
12
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
13
+ disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled',
14
+ transform: booleanAttribute });
15
+ ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
16
+ ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
17
+ // Internal state (set by parent group)
18
+ _checked = signal(false, ...(ngDevMode ? [{ debugName: "_checked" }] : /* istanbul ignore next */ []));
19
+ _disabled = signal(false, ...(ngDevMode ? [{ debugName: "_disabled" }] : /* istanbul ignore next */ []));
20
+ _focused = signal(false, ...(ngDevMode ? [{ debugName: "_focused" }] : /* istanbul ignore next */ []));
21
+ _name = signal('', ...(ngDevMode ? [{ debugName: "_name" }] : /* istanbul ignore next */ []));
22
+ _tabIndex = signal(-1, ...(ngDevMode ? [{ debugName: "_tabIndex" }] : /* istanbul ignore next */ []));
23
+ _uid = `fui-radio-button-${FuiRadioButtonComponent.nextId++}`;
24
+ id = this._uid;
25
+ inputId = `${this._uid}-input`;
26
+ _radioGroup = inject(FUI_RADIO_GROUP, { optional: true });
27
+ inputElement = viewChild('inputElement', ...(ngDevMode ? [{ debugName: "inputElement" }] : /* istanbul ignore next */ []));
28
+ isDisabled = computed(() => this._disabled() || this.disabledInput() || (this._radioGroup?.disabled() ?? false), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
29
+ onInputChange(event) {
30
+ event.stopPropagation();
31
+ if (this.isDisabled())
32
+ return;
33
+ if (this._radioGroup) {
34
+ this._radioGroup.selectValue(this.value(), this);
35
+ }
36
+ }
37
+ onFocus() {
38
+ this._focused.set(true);
39
+ if (this._radioGroup)
40
+ this._radioGroup.setFocused(true);
41
+ }
42
+ onBlur() {
43
+ this._focused.set(false);
44
+ if (this._radioGroup)
45
+ this._radioGroup.setFocused(false);
46
+ }
47
+ onKeydown(event) {
48
+ if (this.isDisabled() || !this._radioGroup)
49
+ return;
50
+ switch (event.key) {
51
+ case 'ArrowDown':
52
+ case 'ArrowRight':
53
+ event.preventDefault();
54
+ this._radioGroup.selectAdjacentRadio(1);
55
+ break;
56
+ case 'ArrowUp':
57
+ case 'ArrowLeft':
58
+ event.preventDefault();
59
+ this._radioGroup.selectAdjacentRadio(-1);
60
+ break;
61
+ }
62
+ }
63
+ focus() {
64
+ this.inputElement()?.nativeElement.focus();
65
+ }
66
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiRadioButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
67
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiRadioButtonComponent, isStandalone: true, selector: "fui-radio-button", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fui-radio-button--checked": "_checked()", "class.fui-radio-button--disabled": "isDisabled()", "class.fui-radio-button--focused": "_focused()", "attr.id": "id" }, classAttribute: "fui-radio-button" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<label class=\"fui-radio-button__container\" [attr.for]=\"inputId\">\n <span class=\"fui-radio-button__frame\">\n <input\n #inputElement\n type=\"radio\"\n class=\"fui-radio-button__native-control\"\n [id]=\"inputId\"\n [name]=\"_name()\"\n [value]=\"value()\"\n [checked]=\"_checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-checked]=\"_checked()\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.tabindex]=\"_tabIndex()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n <span class=\"fui-radio-button__outer-circle\"></span>\n <span class=\"fui-radio-button__inner-circle\"></span>\n </span>\n <span class=\"fui-radio-button__label\">\n <ng-content></ng-content>\n </span>\n</label>\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-radio-group{display:flex;flex-direction:column;gap:var(--fui-gap-12, .75rem)}.fui-radio-group--horizontal{flex-direction:row;gap:var(--fui-gap-20, 1.25rem)}.fui-radio-group--disabled{opacity:var(--fui-opacity-disabled, .38);cursor:not-allowed}.fui-radio-button{display:inline-flex}.fui-radio-button__container{display:inline-flex;align-items:center;gap:var(--fui-gap-8, .5rem);cursor:pointer}.fui-radio-button--disabled .fui-radio-button__container{cursor:not-allowed}.fui-radio-button__frame{position:relative;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;flex-shrink:0}.fui-radio-button__native-control{position:absolute;width:100%;height:100%;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1}.fui-radio-button__native-control:focus-visible~.fui-radio-button__outer-circle{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-radio-button__outer-circle{position:absolute;width:1.125rem;height:1.125rem;border:2px solid var(--fui-secondary-80, #475569);border-radius:50%;transition:border-color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-radio-button__inner-circle{position:absolute;width:.5rem;height:.5rem;border-radius:50%;background-color:var(--fui-primary);transform:scale(0);transition:transform var(--fui-duration-fast-02, .15s) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-radio-button--checked .fui-radio-button__inner-circle{transform:scale(1)}.fui-radio-button--checked .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button--disabled{opacity:var(--fui-opacity-disabled, .38);pointer-events:none}.fui-radio-button--focused .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button__label{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary);-webkit-user-select:none;user-select:none}.fui-radio-group--error .fui-radio-button__outer-circle{border-color:var(--fui-state-error)}.fui-radio-group--error .fui-radio-button--checked .fui-radio-button__inner-circle{background-color:var(--fui-state-error)}@media(prefers-contrast:high){.fui-radio-button__outer-circle{border-color:CanvasText}}@media(prefers-reduced-motion:reduce){.fui-radio-button__inner-circle,.fui-radio-button__outer-circle{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiRadioButtonComponent, decorators: [{
70
+ type: Component,
71
+ args: [{ selector: 'fui-radio-button', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
72
+ class: 'fui-radio-button',
73
+ '[class.fui-radio-button--checked]': '_checked()',
74
+ '[class.fui-radio-button--disabled]': 'isDisabled()',
75
+ '[class.fui-radio-button--focused]': '_focused()',
76
+ '[attr.id]': 'id',
77
+ }, template: "<label class=\"fui-radio-button__container\" [attr.for]=\"inputId\">\n <span class=\"fui-radio-button__frame\">\n <input\n #inputElement\n type=\"radio\"\n class=\"fui-radio-button__native-control\"\n [id]=\"inputId\"\n [name]=\"_name()\"\n [value]=\"value()\"\n [checked]=\"_checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-checked]=\"_checked()\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.tabindex]=\"_tabIndex()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n <span class=\"fui-radio-button__outer-circle\"></span>\n <span class=\"fui-radio-button__inner-circle\"></span>\n </span>\n <span class=\"fui-radio-button__label\">\n <ng-content></ng-content>\n </span>\n</label>\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-radio-group{display:flex;flex-direction:column;gap:var(--fui-gap-12, .75rem)}.fui-radio-group--horizontal{flex-direction:row;gap:var(--fui-gap-20, 1.25rem)}.fui-radio-group--disabled{opacity:var(--fui-opacity-disabled, .38);cursor:not-allowed}.fui-radio-button{display:inline-flex}.fui-radio-button__container{display:inline-flex;align-items:center;gap:var(--fui-gap-8, .5rem);cursor:pointer}.fui-radio-button--disabled .fui-radio-button__container{cursor:not-allowed}.fui-radio-button__frame{position:relative;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;flex-shrink:0}.fui-radio-button__native-control{position:absolute;width:100%;height:100%;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1}.fui-radio-button__native-control:focus-visible~.fui-radio-button__outer-circle{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-radio-button__outer-circle{position:absolute;width:1.125rem;height:1.125rem;border:2px solid var(--fui-secondary-80, #475569);border-radius:50%;transition:border-color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-radio-button__inner-circle{position:absolute;width:.5rem;height:.5rem;border-radius:50%;background-color:var(--fui-primary);transform:scale(0);transition:transform var(--fui-duration-fast-02, .15s) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-radio-button--checked .fui-radio-button__inner-circle{transform:scale(1)}.fui-radio-button--checked .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button--disabled{opacity:var(--fui-opacity-disabled, .38);pointer-events:none}.fui-radio-button--focused .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button__label{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary);-webkit-user-select:none;user-select:none}.fui-radio-group--error .fui-radio-button__outer-circle{border-color:var(--fui-state-error)}.fui-radio-group--error .fui-radio-button--checked .fui-radio-button__inner-circle{background-color:var(--fui-state-error)}@media(prefers-contrast:high){.fui-radio-button__outer-circle{border-color:CanvasText}}@media(prefers-reduced-motion:reduce){.fui-radio-button__inner-circle,.fui-radio-button__outer-circle{transition:none}}\n"] }]
78
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], inputElement: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }] } });
79
+
80
+ class FuiRadioGroupComponent {
81
+ static nextId = 0;
82
+ controlType = 'fui-radio-group';
83
+ // Inputs
84
+ name = input(`fui-radio-group-${FuiRadioGroupComponent.nextId++}`, ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
85
+ orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
86
+ disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled',
87
+ transform: booleanAttribute });
88
+ ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
89
+ ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
90
+ errorStateMatcher = input(null, ...(ngDevMode ? [{ debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
91
+ // Outputs
92
+ change = output();
93
+ // Content children
94
+ radioButtons = contentChildren(FuiRadioButtonComponent, ...(ngDevMode ? [{ debugName: "radioButtons" }] : /* istanbul ignore next */ []));
95
+ // Internal state
96
+ _value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
97
+ _focused = signal(false, ...(ngDevMode ? [{ debugName: "_focused" }] : /* istanbul ignore next */ []));
98
+ _disabled = signal(false, ...(ngDevMode ? [{ debugName: "_disabled" }] : /* istanbul ignore next */ []));
99
+ _required = signal(false, ...(ngDevMode ? [{ debugName: "_required" }] : /* istanbul ignore next */ []));
100
+ _ngControlDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_ngControlDisabled" }] : /* istanbul ignore next */ []));
101
+ _errorState = signal(false, ...(ngDevMode ? [{ debugName: "_errorState" }] : /* istanbul ignore next */ []));
102
+ value = this._value.asReadonly();
103
+ focused = this._focused.asReadonly();
104
+ errorState = this._errorState.asReadonly();
105
+ required = computed(() => this._required(), ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
106
+ disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
107
+ stateChanges = new Subject();
108
+ _uid = `fui-radio-group-${FuiRadioGroupComponent.nextId++}`;
109
+ id = this._uid;
110
+ // Form control
111
+ _parentForm = inject(NgForm, { optional: true });
112
+ _parentFormGroup = inject(FormGroupDirective, { optional: true });
113
+ _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);
114
+ _ngControlRef = injectNgControl();
115
+ get ngControl() {
116
+ return this._ngControlRef.ngControl;
117
+ }
118
+ _onChange = () => {
119
+ /* noop */
120
+ };
121
+ _onTouched = () => {
122
+ /* noop */
123
+ };
124
+ _formControlInitialized = false;
125
+ constructor() {
126
+ void Promise.resolve().then(() => {
127
+ if (this._ngControlRef.ngControl) {
128
+ this._ngControlRef.ngControl.valueAccessor = this;
129
+ }
130
+ });
131
+ // Sync radio buttons when they change or value changes
132
+ effect(() => {
133
+ const radios = this.radioButtons();
134
+ const currentValue = this._value();
135
+ const groupName = this.name();
136
+ const groupDisabled = this.disabled();
137
+ radios.forEach((radio, idx) => {
138
+ radio._name.set(groupName);
139
+ radio._checked.set(radio.value() === currentValue);
140
+ radio._disabled.set(groupDisabled);
141
+ // Set tabIndex: only selected (or first if none selected) gets 0
142
+ if (radio.value() === currentValue) {
143
+ radio._tabIndex.set(0);
144
+ }
145
+ else if (currentValue == null && idx === 0) {
146
+ radio._tabIndex.set(0);
147
+ }
148
+ else {
149
+ radio._tabIndex.set(-1);
150
+ }
151
+ });
152
+ });
153
+ effect(() => {
154
+ this._value();
155
+ this._focused();
156
+ this._disabled();
157
+ this._ngControlDisabled();
158
+ this._required();
159
+ this._errorState();
160
+ this.stateChanges.next();
161
+ });
162
+ }
163
+ ngDoCheck() {
164
+ if (this.ngControl) {
165
+ updateErrorState(this.ngControl, this._errorState, this.errorStateMatcher(), this._defaultErrorStateMatcher, this._parentForm, this._parentFormGroup, this.stateChanges);
166
+ syncRequiredState(this.ngControl, this._required, this.stateChanges);
167
+ syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);
168
+ }
169
+ }
170
+ ngOnDestroy() {
171
+ this.stateChanges.complete();
172
+ }
173
+ // CVA
174
+ writeValue(value) {
175
+ this._formControlInitialized = true;
176
+ this._value.set(value);
177
+ this.stateChanges.next();
178
+ }
179
+ registerOnChange(fn) {
180
+ this._onChange = fn;
181
+ }
182
+ registerOnTouched(fn) {
183
+ this._onTouched = fn;
184
+ }
185
+ setDisabledState(isDisabled) {
186
+ this._disabled.set(isDisabled);
187
+ this.stateChanges.next();
188
+ }
189
+ // Called by radio buttons when selected
190
+ selectValue(value, source) {
191
+ if (this.disabled())
192
+ return;
193
+ this._value.set(value);
194
+ this._onChange(value);
195
+ this.change.emit({ source, value });
196
+ this.stateChanges.next();
197
+ }
198
+ setFocused(focused) {
199
+ this._focused.set(focused);
200
+ if (!focused)
201
+ this._onTouched();
202
+ this.stateChanges.next();
203
+ }
204
+ // Keyboard navigation - select adjacent radio
205
+ selectAdjacentRadio(direction) {
206
+ const radios = this.radioButtons();
207
+ if (radios.length === 0)
208
+ return;
209
+ const enabledRadios = radios.filter((r) => !r.isDisabled());
210
+ if (enabledRadios.length === 0)
211
+ return;
212
+ const currentIdx = enabledRadios.findIndex((r) => r._checked());
213
+ let nextIdx;
214
+ if (currentIdx === -1) {
215
+ nextIdx = direction === 1 ? 0 : enabledRadios.length - 1;
216
+ }
217
+ else {
218
+ nextIdx = (currentIdx + direction + enabledRadios.length) % enabledRadios.length;
219
+ }
220
+ const nextRadio = enabledRadios[nextIdx];
221
+ this.selectValue(nextRadio.value(), nextRadio);
222
+ nextRadio.focus();
223
+ }
224
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiRadioGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
225
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiRadioGroupComponent, isStandalone: true, selector: "fui-radio-group", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { properties: { "class.fui-radio-group--horizontal": "orientation() === \"horizontal\"", "class.fui-radio-group--vertical": "orientation() === \"vertical\"", "class.fui-radio-group--disabled": "disabled()", "class.fui-radio-group--error": "errorState()", "attr.role": "\"radiogroup\"", "attr.aria-label": "ariaLabel()", "attr.aria-labelledby": "ariaLabelledby()" }, classAttribute: "fui-radio-group" }, providers: [
226
+ {
227
+ provide: NG_VALUE_ACCESSOR,
228
+ useExisting: FuiRadioGroupComponent,
229
+ multi: true,
230
+ },
231
+ { provide: FUI_RADIO_GROUP, useExisting: FuiRadioGroupComponent },
232
+ ], queries: [{ propertyName: "radioButtons", predicate: FuiRadioButtonComponent, isSignal: true }], ngImport: i0, template: "<ng-content></ng-content>\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-radio-group{display:flex;flex-direction:column;gap:var(--fui-gap-12, .75rem)}.fui-radio-group--horizontal{flex-direction:row;gap:var(--fui-gap-20, 1.25rem)}.fui-radio-group--disabled{opacity:var(--fui-opacity-disabled, .38);cursor:not-allowed}.fui-radio-button{display:inline-flex}.fui-radio-button__container{display:inline-flex;align-items:center;gap:var(--fui-gap-8, .5rem);cursor:pointer}.fui-radio-button--disabled .fui-radio-button__container{cursor:not-allowed}.fui-radio-button__frame{position:relative;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;flex-shrink:0}.fui-radio-button__native-control{position:absolute;width:100%;height:100%;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1}.fui-radio-button__native-control:focus-visible~.fui-radio-button__outer-circle{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-radio-button__outer-circle{position:absolute;width:1.125rem;height:1.125rem;border:2px solid var(--fui-secondary-80, #475569);border-radius:50%;transition:border-color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-radio-button__inner-circle{position:absolute;width:.5rem;height:.5rem;border-radius:50%;background-color:var(--fui-primary);transform:scale(0);transition:transform var(--fui-duration-fast-02, .15s) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-radio-button--checked .fui-radio-button__inner-circle{transform:scale(1)}.fui-radio-button--checked .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button--disabled{opacity:var(--fui-opacity-disabled, .38);pointer-events:none}.fui-radio-button--focused .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button__label{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary);-webkit-user-select:none;user-select:none}.fui-radio-group--error .fui-radio-button__outer-circle{border-color:var(--fui-state-error)}.fui-radio-group--error .fui-radio-button--checked .fui-radio-button__inner-circle{background-color:var(--fui-state-error)}@media(prefers-contrast:high){.fui-radio-button__outer-circle{border-color:CanvasText}}@media(prefers-reduced-motion:reduce){.fui-radio-button__inner-circle,.fui-radio-button__outer-circle{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
233
+ }
234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiRadioGroupComponent, decorators: [{
235
+ type: Component,
236
+ args: [{ selector: 'fui-radio-group', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
237
+ class: 'fui-radio-group',
238
+ '[class.fui-radio-group--horizontal]': 'orientation() === "horizontal"',
239
+ '[class.fui-radio-group--vertical]': 'orientation() === "vertical"',
240
+ '[class.fui-radio-group--disabled]': 'disabled()',
241
+ '[class.fui-radio-group--error]': 'errorState()',
242
+ '[attr.role]': '"radiogroup"',
243
+ '[attr.aria-label]': 'ariaLabel()',
244
+ '[attr.aria-labelledby]': 'ariaLabelledby()',
245
+ }, providers: [
246
+ {
247
+ provide: NG_VALUE_ACCESSOR,
248
+ useExisting: FuiRadioGroupComponent,
249
+ multi: true,
250
+ },
251
+ { provide: FUI_RADIO_GROUP, useExisting: FuiRadioGroupComponent },
252
+ ], template: "<ng-content></ng-content>\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-radio-group{display:flex;flex-direction:column;gap:var(--fui-gap-12, .75rem)}.fui-radio-group--horizontal{flex-direction:row;gap:var(--fui-gap-20, 1.25rem)}.fui-radio-group--disabled{opacity:var(--fui-opacity-disabled, .38);cursor:not-allowed}.fui-radio-button{display:inline-flex}.fui-radio-button__container{display:inline-flex;align-items:center;gap:var(--fui-gap-8, .5rem);cursor:pointer}.fui-radio-button--disabled .fui-radio-button__container{cursor:not-allowed}.fui-radio-button__frame{position:relative;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;flex-shrink:0}.fui-radio-button__native-control{position:absolute;width:100%;height:100%;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1}.fui-radio-button__native-control:focus-visible~.fui-radio-button__outer-circle{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-radio-button__outer-circle{position:absolute;width:1.125rem;height:1.125rem;border:2px solid var(--fui-secondary-80, #475569);border-radius:50%;transition:border-color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-radio-button__inner-circle{position:absolute;width:.5rem;height:.5rem;border-radius:50%;background-color:var(--fui-primary);transform:scale(0);transition:transform var(--fui-duration-fast-02, .15s) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-radio-button--checked .fui-radio-button__inner-circle{transform:scale(1)}.fui-radio-button--checked .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button--disabled{opacity:var(--fui-opacity-disabled, .38);pointer-events:none}.fui-radio-button--focused .fui-radio-button__outer-circle{border-color:var(--fui-primary)}.fui-radio-button__label{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary);-webkit-user-select:none;user-select:none}.fui-radio-group--error .fui-radio-button__outer-circle{border-color:var(--fui-state-error)}.fui-radio-group--error .fui-radio-button--checked .fui-radio-button__inner-circle{background-color:var(--fui-state-error)}@media(prefers-contrast:high){.fui-radio-button__outer-circle{border-color:CanvasText}}@media(prefers-reduced-motion:reduce){.fui-radio-button__inner-circle,.fui-radio-button__outer-circle{transition:none}}\n"] }]
253
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], change: [{ type: i0.Output, args: ["change"] }], radioButtons: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FuiRadioButtonComponent), { isSignal: true }] }] } });
254
+
255
+ /**
256
+ * Generated bundle index. Do not edit.
257
+ */
258
+
259
+ export { FUI_RADIO_GROUP, FuiRadioButtonComponent, FuiRadioGroupComponent };
260
+ //# sourceMappingURL=raintonic-formaui-components-radio.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-radio.mjs","sources":["../../../lib/components/radio/radio.types.ts","../../../lib/components/radio/radio-button.component.ts","../../../lib/components/radio/radio-button.component.html","../../../lib/components/radio/radio-group.component.ts","../../../lib/components/radio/radio-group.component.html","../../../lib/components/radio/raintonic-formaui-components-radio.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport type FuiRadioOrientation = 'horizontal' | 'vertical';\n\nexport interface FuiRadioChange<T = unknown> {\n source: unknown;\n value: T;\n}\n\nexport interface FuiRadioGroupHost {\n disabled(): boolean;\n selectValue(value: unknown, source: unknown): void;\n setFocused(focused: boolean): void;\n selectAdjacentRadio(direction: 1 | -1): void;\n}\n\nexport const FUI_RADIO_GROUP = new InjectionToken<FuiRadioGroupHost>('FUI_RADIO_GROUP');\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n computed,\n signal,\n viewChild,\n ElementRef,\n inject,\n booleanAttribute,\n} from '@angular/core';\nimport { FUI_RADIO_GROUP } from './radio.types';\n\n@Component({\n selector: 'fui-radio-button',\n standalone: true,\n imports: [],\n templateUrl: './radio-button.component.html',\n styleUrls: ['./radio.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-radio-button',\n '[class.fui-radio-button--checked]': '_checked()',\n '[class.fui-radio-button--disabled]': 'isDisabled()',\n '[class.fui-radio-button--focused]': '_focused()',\n '[attr.id]': 'id',\n },\n})\nexport class FuiRadioButtonComponent {\n static nextId = 0;\n\n readonly value = input.required<unknown>();\n readonly disabledInput = input<boolean, unknown>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby = input<string | null>(null, {\n alias: 'aria-labelledby',\n });\n\n // Internal state (set by parent group)\n readonly _checked = signal(false);\n readonly _disabled = signal(false);\n readonly _focused = signal(false);\n readonly _name = signal('');\n readonly _tabIndex = signal(-1);\n\n private _uid = `fui-radio-button-${FuiRadioButtonComponent.nextId++}`;\n readonly id = this._uid;\n readonly inputId = `${this._uid}-input`;\n\n private _radioGroup = inject(FUI_RADIO_GROUP, { optional: true });\n\n readonly inputElement = viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n readonly isDisabled = computed(\n () => this._disabled() || this.disabledInput() || (this._radioGroup?.disabled() ?? false),\n );\n\n onInputChange(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n if (this._radioGroup) {\n this._radioGroup.selectValue(this.value(), this);\n }\n }\n\n onFocus(): void {\n this._focused.set(true);\n if (this._radioGroup) this._radioGroup.setFocused(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n if (this._radioGroup) this._radioGroup.setFocused(false);\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled() || !this._radioGroup) return;\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n event.preventDefault();\n this._radioGroup.selectAdjacentRadio(1);\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n event.preventDefault();\n this._radioGroup.selectAdjacentRadio(-1);\n break;\n }\n }\n\n focus(): void {\n this.inputElement()?.nativeElement.focus();\n }\n}\n","<label class=\"fui-radio-button__container\" [attr.for]=\"inputId\">\n <span class=\"fui-radio-button__frame\">\n <input\n #inputElement\n type=\"radio\"\n class=\"fui-radio-button__native-control\"\n [id]=\"inputId\"\n [name]=\"_name()\"\n [value]=\"value()\"\n [checked]=\"_checked()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-checked]=\"_checked()\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.tabindex]=\"_tabIndex()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n <span class=\"fui-radio-button__outer-circle\"></span>\n <span class=\"fui-radio-button__inner-circle\"></span>\n </span>\n <span class=\"fui-radio-button__label\">\n <ng-content></ng-content>\n </span>\n</label>\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n output,\n computed,\n signal,\n contentChildren,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n OnDestroy,\n DoCheck,\n inject,\n effect,\n booleanAttribute,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\nimport { FuiRadioOrientation, FuiRadioChange, FUI_RADIO_GROUP } from './radio.types';\nimport { FuiRadioButtonComponent } from './radio-button.component';\n\n@Component({\n selector: 'fui-radio-group',\n standalone: true,\n imports: [],\n templateUrl: './radio-group.component.html',\n styleUrls: ['./radio.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-radio-group',\n '[class.fui-radio-group--horizontal]': 'orientation() === \"horizontal\"',\n '[class.fui-radio-group--vertical]': 'orientation() === \"vertical\"',\n '[class.fui-radio-group--disabled]': 'disabled()',\n '[class.fui-radio-group--error]': 'errorState()',\n '[attr.role]': '\"radiogroup\"',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: FuiRadioGroupComponent,\n multi: true,\n },\n { provide: FUI_RADIO_GROUP, useExisting: FuiRadioGroupComponent },\n ],\n})\nexport class FuiRadioGroupComponent implements ControlValueAccessor, DoCheck, OnDestroy {\n static nextId = 0;\n readonly controlType = 'fui-radio-group';\n\n // Inputs\n readonly name = input(`fui-radio-group-${FuiRadioGroupComponent.nextId++}`);\n readonly orientation = input<FuiRadioOrientation>('vertical');\n readonly disabledInput = input<boolean, unknown>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby = input<string | null>(null, {\n alias: 'aria-labelledby',\n });\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\n\n // Outputs\n readonly change: OutputEmitterRef<FuiRadioChange> = output<FuiRadioChange>();\n\n // Content children\n readonly radioButtons = contentChildren(FuiRadioButtonComponent);\n\n // Internal state\n private readonly _value: WritableSignal<unknown> = signal(null);\n private readonly _focused: WritableSignal<boolean> = signal(false);\n private readonly _disabled: WritableSignal<boolean> = signal(false);\n private readonly _required: WritableSignal<boolean> = signal(false);\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\n private readonly _errorState: WritableSignal<boolean> = signal(false);\n\n readonly value: Signal<unknown> = this._value.asReadonly();\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n readonly errorState = this._errorState.asReadonly();\n readonly required: Signal<boolean> = computed(() => this._required());\n readonly disabled: Signal<boolean> = computed(\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\n );\n\n readonly stateChanges = new Subject<void>();\n private _uid = `fui-radio-group-${FuiRadioGroupComponent.nextId++}`;\n readonly id = this._uid;\n\n // Form control\n private _parentForm = inject(NgForm, { optional: true });\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\n private readonly _ngControlRef = injectNgControl();\n get ngControl(): NgControl | null {\n return this._ngControlRef.ngControl;\n }\n\n private _onChange: (value: unknown) => void = () => {\n /* noop */\n };\n private _onTouched: () => void = () => {\n /* noop */\n };\n private _formControlInitialized = false;\n\n constructor() {\n void Promise.resolve().then(() => {\n if (this._ngControlRef.ngControl) {\n this._ngControlRef.ngControl.valueAccessor = this;\n }\n });\n\n // Sync radio buttons when they change or value changes\n effect(() => {\n const radios = this.radioButtons();\n const currentValue = this._value();\n const groupName = this.name();\n const groupDisabled = this.disabled();\n\n radios.forEach((radio, idx) => {\n radio._name.set(groupName);\n radio._checked.set(radio.value() === currentValue);\n radio._disabled.set(groupDisabled);\n // Set tabIndex: only selected (or first if none selected) gets 0\n if (radio.value() === currentValue) {\n radio._tabIndex.set(0);\n } else if (currentValue == null && idx === 0) {\n radio._tabIndex.set(0);\n } else {\n radio._tabIndex.set(-1);\n }\n });\n });\n\n effect(() => {\n this._value();\n this._focused();\n this._disabled();\n this._ngControlDisabled();\n this._required();\n this._errorState();\n this.stateChanges.next();\n });\n }\n\n ngDoCheck(): void {\n if (this.ngControl) {\n updateErrorState(\n this.ngControl,\n this._errorState,\n this.errorStateMatcher(),\n this._defaultErrorStateMatcher,\n this._parentForm,\n this._parentFormGroup,\n this.stateChanges,\n );\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\n }\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n // CVA\n writeValue(value: unknown): void {\n this._formControlInitialized = true;\n this._value.set(value);\n this.stateChanges.next();\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n this.stateChanges.next();\n }\n\n // Called by radio buttons when selected\n selectValue(value: unknown, source: FuiRadioButtonComponent): void {\n if (this.disabled()) return;\n this._value.set(value);\n this._onChange(value);\n this.change.emit({ source, value });\n this.stateChanges.next();\n }\n\n setFocused(focused: boolean): void {\n this._focused.set(focused);\n if (!focused) this._onTouched();\n this.stateChanges.next();\n }\n\n // Keyboard navigation - select adjacent radio\n selectAdjacentRadio(direction: 1 | -1): void {\n const radios = this.radioButtons();\n if (radios.length === 0) return;\n\n const enabledRadios = radios.filter((r) => !r.isDisabled());\n if (enabledRadios.length === 0) return;\n\n const currentIdx = enabledRadios.findIndex((r) => r._checked());\n let nextIdx: number;\n if (currentIdx === -1) {\n nextIdx = direction === 1 ? 0 : enabledRadios.length - 1;\n } else {\n nextIdx = (currentIdx + direction + enabledRadios.length) % enabledRadios.length;\n }\n\n const nextRadio = enabledRadios[nextIdx];\n this.selectValue(nextRadio.value(), nextRadio);\n nextRadio.focus();\n }\n}\n","<ng-content></ng-content>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}