@raintonic/formaui 0.3.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +80 -35
  2. package/README.md +22 -26
  3. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +39 -41
  4. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-cdk-form-field.mjs +207 -3
  6. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
  7. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +27 -2
  8. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
  9. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +5 -12
  10. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
  11. package/fesm2022/raintonic-formaui-components-accordion.mjs +8 -5
  12. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  13. package/fesm2022/raintonic-formaui-components-alert.mjs +16 -2
  14. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  15. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +255 -462
  16. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  17. package/fesm2022/raintonic-formaui-components-avatar.mjs +34 -59
  18. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  19. package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
  20. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +4 -4
  22. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
  24. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-button.mjs +15 -20
  26. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
  27. package/fesm2022/raintonic-formaui-components-card.mjs +2 -2
  28. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  29. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  30. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  31. package/fesm2022/raintonic-formaui-components-chip.mjs +97 -0
  32. package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -0
  33. package/fesm2022/raintonic-formaui-components-data-table.mjs +69 -29
  34. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-date-picker.mjs +223 -144
  36. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  38. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-drawer.mjs +2 -2
  40. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  41. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +888 -0
  42. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -0
  43. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +774 -0
  44. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -0
  45. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
  48. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-form-field.mjs +81 -50
  50. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
  52. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
  53. package/fesm2022/raintonic-formaui-components-input.mjs +47 -12
  54. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  55. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  56. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  57. package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -12
  58. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  59. package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
  60. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  61. package/fesm2022/raintonic-formaui-components-password-input.mjs +35 -110
  62. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  63. package/fesm2022/raintonic-formaui-components-popover.mjs +3 -2
  64. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  65. package/fesm2022/raintonic-formaui-components-progressbar.mjs +3 -2
  66. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  67. package/fesm2022/raintonic-formaui-components-radio.mjs +5 -6
  68. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  69. package/fesm2022/raintonic-formaui-components-select.mjs +257 -412
  70. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  71. package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
  72. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  73. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +525 -0
  74. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -0
  75. package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
  76. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
  80. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-stepper.mjs +50 -45
  82. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-components-strength-meter.mjs +149 -0
  84. package/fesm2022/raintonic-formaui-components-strength-meter.mjs.map +1 -0
  85. package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
  86. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  87. package/fesm2022/raintonic-formaui-components-time-picker.mjs +194 -154
  88. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  89. package/fesm2022/raintonic-formaui-components-toggle-group.mjs +302 -0
  90. package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -0
  91. package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
  92. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
  93. package/fesm2022/raintonic-formaui-components-toolbar.mjs +2 -2
  94. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  95. package/fesm2022/raintonic-formaui-components-tooltip.mjs +10 -4
  96. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  97. package/fesm2022/raintonic-formaui-components-topbar.mjs +60 -0
  98. package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -0
  99. package/fesm2022/raintonic-formaui-components-tree-select.mjs +59 -69
  100. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  101. package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
  102. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  103. package/fesm2022/raintonic-formaui-components-tree.mjs +31 -5
  104. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  105. package/fesm2022/raintonic-formaui-core.mjs +279 -1
  106. package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
  107. package/fesm2022/raintonic-formaui-services-breakpoint.mjs +93 -0
  108. package/fesm2022/raintonic-formaui-services-breakpoint.mjs.map +1 -0
  109. package/fesm2022/raintonic-formaui-services-dialog.mjs +314 -16
  110. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  111. package/fesm2022/raintonic-formaui-services-notification.mjs +93 -29
  112. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
  113. package/fesm2022/raintonic-formaui-services-theme.mjs +46 -196
  114. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
  115. package/fesm2022/raintonic-formaui.mjs +1 -1
  116. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  117. package/llms-full.txt +2329 -450
  118. package/llms.txt +36 -33
  119. package/package.json +42 -19
  120. package/styles/fonts/Geist-Bold.woff2 +0 -0
  121. package/styles/fonts/Geist-Italic.woff2 +0 -0
  122. package/styles/fonts/Geist-Light.woff2 +0 -0
  123. package/styles/fonts/Geist-Medium.woff2 +0 -0
  124. package/styles/fonts/Geist-Regular.woff2 +0 -0
  125. package/styles/fonts/Geist-SemiBold.woff2 +0 -0
  126. package/styles/fonts/GeistMono-Regular.woff2 +0 -0
  127. package/styles/generated/_tokens.scss +906 -0
  128. package/styles/index.scss +11 -10
  129. package/styles/partials/_brand.scss +46 -0
  130. package/styles/partials/_constants.scss +22 -20
  131. package/styles/partials/_fonts.scss +54 -10
  132. package/styles/partials/_grid.scss +29 -18
  133. package/styles/partials/_mixins.scss +69 -27
  134. package/styles/partials/_motion.scss +28 -33
  135. package/styles/partials/_theme.scss +28 -255
  136. package/styles/partials/_type.scss +117 -0
  137. package/styles/partials/_typography.scss +45 -45
  138. package/styles/partials/_utilities.scss +198 -98
  139. package/styles/partials/components/_button.scss +144 -75
  140. package/styles/partials/components/_dialog.scss +181 -180
  141. package/styles/partials/components/_overlay.scss +87 -87
  142. package/styles/partials/themes/_dark.scss +3 -268
  143. package/styles/partials/themes/_light.scss +4 -268
  144. package/styles/styles.css +7744 -0
  145. package/styles/styles.entry.scss +3 -0
  146. package/styles/utilities.css +4802 -0
  147. package/styles/utilities.entry.scss +3 -0
  148. package/types/raintonic-formaui-cdk-drag-drop.d.ts +0 -1
  149. package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -1
  150. package/types/raintonic-formaui-cdk-form-field.d.ts +118 -2
  151. package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -1
  152. package/types/raintonic-formaui-cdk-overlay.d.ts +2 -0
  153. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
  154. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +0 -1
  155. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -1
  156. package/types/raintonic-formaui-components-accordion.d.ts +1 -1
  157. package/types/raintonic-formaui-components-accordion.d.ts.map +1 -1
  158. package/types/raintonic-formaui-components-alert.d.ts +6 -1
  159. package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
  160. package/types/raintonic-formaui-components-autocomplete.d.ts +73 -116
  161. package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
  162. package/types/raintonic-formaui-components-avatar.d.ts +13 -31
  163. package/types/raintonic-formaui-components-avatar.d.ts.map +1 -1
  164. package/types/raintonic-formaui-components-button.d.ts +4 -10
  165. package/types/raintonic-formaui-components-button.d.ts.map +1 -1
  166. package/types/raintonic-formaui-components-chip.d.ts +43 -0
  167. package/types/raintonic-formaui-components-chip.d.ts.map +1 -0
  168. package/types/raintonic-formaui-components-data-table.d.ts +48 -11
  169. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  170. package/types/raintonic-formaui-components-date-picker.d.ts +59 -23
  171. package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
  172. package/types/raintonic-formaui-components-dropdown-menu.d.ts +394 -0
  173. package/types/raintonic-formaui-components-dropdown-menu.d.ts.map +1 -0
  174. package/types/raintonic-formaui-components-dual-tier-navigation.d.ts +87 -0
  175. package/types/raintonic-formaui-components-dual-tier-navigation.d.ts.map +1 -0
  176. package/types/raintonic-formaui-components-form-field.d.ts +51 -21
  177. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  178. package/types/raintonic-formaui-components-input.d.ts +20 -11
  179. package/types/raintonic-formaui-components-input.d.ts.map +1 -1
  180. package/types/raintonic-formaui-components-number-input.d.ts +5 -3
  181. package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
  182. package/types/raintonic-formaui-components-password-input.d.ts +18 -32
  183. package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
  184. package/types/raintonic-formaui-components-popover.d.ts.map +1 -1
  185. package/types/raintonic-formaui-components-progressbar.d.ts +1 -1
  186. package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
  187. package/types/raintonic-formaui-components-radio.d.ts +1 -2
  188. package/types/raintonic-formaui-components-radio.d.ts.map +1 -1
  189. package/types/raintonic-formaui-components-select.d.ts +107 -76
  190. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  191. package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts +223 -0
  192. package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts.map +1 -0
  193. package/types/raintonic-formaui-components-stepper.d.ts +4 -2
  194. package/types/raintonic-formaui-components-stepper.d.ts.map +1 -1
  195. package/types/raintonic-formaui-components-strength-meter.d.ts +78 -0
  196. package/types/raintonic-formaui-components-strength-meter.d.ts.map +1 -0
  197. package/types/raintonic-formaui-components-time-picker.d.ts +44 -24
  198. package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
  199. package/types/raintonic-formaui-components-toggle-group.d.ts +100 -0
  200. package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -0
  201. package/types/raintonic-formaui-components-tooltip.d.ts +2 -1
  202. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
  203. package/types/raintonic-formaui-components-topbar.d.ts +48 -0
  204. package/types/raintonic-formaui-components-topbar.d.ts.map +1 -0
  205. package/types/raintonic-formaui-components-tree-select.d.ts +25 -9
  206. package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -1
  207. package/types/raintonic-formaui-components-tree.d.ts +12 -1
  208. package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
  209. package/types/raintonic-formaui-core.d.ts +243 -5
  210. package/types/raintonic-formaui-core.d.ts.map +1 -1
  211. package/types/raintonic-formaui-services-breakpoint.d.ts +44 -0
  212. package/types/raintonic-formaui-services-breakpoint.d.ts.map +1 -0
  213. package/types/raintonic-formaui-services-dialog.d.ts +141 -2
  214. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
  215. package/types/raintonic-formaui-services-notification.d.ts +24 -2
  216. package/types/raintonic-formaui-services-notification.d.ts.map +1 -1
  217. package/types/raintonic-formaui-services-theme.d.ts +13 -103
  218. package/types/raintonic-formaui-services-theme.d.ts.map +1 -1
  219. package/types/raintonic-formaui.d.ts +1 -1
  220. package/fesm2022/raintonic-formaui-components-big-menu.mjs +0 -86
  221. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +0 -1
  222. package/fesm2022/raintonic-formaui-components-menu.mjs +0 -896
  223. package/fesm2022/raintonic-formaui-components-menu.mjs.map +0 -1
  224. package/fesm2022/raintonic-formaui-components-sidebar.mjs +0 -275
  225. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +0 -1
  226. package/fesm2022/raintonic-formaui-components-tag.mjs +0 -95
  227. package/fesm2022/raintonic-formaui-components-tag.mjs.map +0 -1
  228. package/styles/_fonts-entry.scss +0 -3
  229. package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
  230. package/styles/fonts/inter-tight-latin.woff2 +0 -0
  231. package/types/raintonic-formaui-components-big-menu.d.ts +0 -73
  232. package/types/raintonic-formaui-components-big-menu.d.ts.map +0 -1
  233. package/types/raintonic-formaui-components-menu.d.ts +0 -403
  234. package/types/raintonic-formaui-components-menu.d.ts.map +0 -1
  235. package/types/raintonic-formaui-components-sidebar.d.ts +0 -185
  236. package/types/raintonic-formaui-components-sidebar.d.ts.map +0 -1
  237. package/types/raintonic-formaui-components-tag.d.ts +0 -43
  238. package/types/raintonic-formaui-components-tag.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, signal, computed, inject, ElementRef, NgZone, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component, ViewContainerRef, TemplateRef, effect, Directive } from '@angular/core';
2
+ import { input, output, signal, computed, inject, ElementRef, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component, ViewContainerRef, TemplateRef, effect, Directive } from '@angular/core';
3
3
 
4
4
  /**
5
5
  * Clamps a value between min and max bounds.
@@ -50,13 +50,10 @@ class FuiVirtualScrollViewportComponent {
50
50
  _totalContentSize = computed(() => this._totalItems() * this.itemSize(), ...(ngDevMode ? [{ debugName: "_totalContentSize" }] : /* istanbul ignore next */ []));
51
51
  _contentWrapper;
52
52
  _elementRef = inject((ElementRef));
53
- _ngZone = inject(NgZone);
54
53
  _rafId = null;
55
54
  _lastScrollOffset = 0;
56
55
  ngOnInit() {
57
- this._ngZone.runOutsideAngular(() => {
58
- this._updateRenderedRange();
59
- });
56
+ this._updateRenderedRange();
60
57
  }
61
58
  ngAfterViewInit() {
62
59
  this._updateRenderedRange();
@@ -117,10 +114,8 @@ class FuiVirtualScrollViewportComponent {
117
114
  const newRange = calculateRenderedRange(scrollOffset, viewportSize, this.itemSize(), this._totalItems(), this.minBufferPx(), this.maxBufferPx());
118
115
  const currentRange = this._renderedRange();
119
116
  if (!rangesEqual(currentRange, newRange)) {
120
- this._ngZone.run(() => {
121
- this._renderedRange.set(newRange);
122
- this.renderedRangeChange.emit(newRange);
123
- });
117
+ this._renderedRange.set(newRange);
118
+ this.renderedRangeChange.emit(newRange);
124
119
  }
125
120
  // Update content wrapper transform
126
121
  const contentOffset = newRange.start * this.itemSize();
@@ -130,9 +125,7 @@ class FuiVirtualScrollViewportComponent {
130
125
  }
131
126
  // Emit scrolled index (first visible, not buffered)
132
127
  const firstVisibleIndex = this.itemSize() > 0 ? Math.floor(scrollOffset / this.itemSize()) : 0;
133
- this._ngZone.run(() => {
134
- this.scrolledIndexChange.emit(firstVisibleIndex);
135
- });
128
+ this.scrolledIndexChange.emit(firstVisibleIndex);
136
129
  }
137
130
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiVirtualScrollViewportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
138
131
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiVirtualScrollViewportComponent, isStandalone: true, selector: "fui-virtual-scroll-viewport", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, minBufferPx: { classPropertyName: "minBufferPx", publicName: "minBufferPx", isSignal: true, isRequired: false, transformFunction: null }, maxBufferPx: { classPropertyName: "maxBufferPx", publicName: "maxBufferPx", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrolledIndexChange: "scrolledIndexChange", renderedRangeChange: "renderedRangeChange" }, host: { attributes: { "role": "list" }, listeners: { "scroll": "_onScroll()" }, properties: { "class.fui-virtual-scroll-viewport--horizontal": "orientation() === \"horizontal\"" }, classAttribute: "fui-virtual-scroll-viewport" }, viewQueries: [{ propertyName: "_contentWrapper", first: true, predicate: ["contentWrapper"], descendants: true, static: true }], ngImport: i0, template: "<!-- Spacer that creates the full scrollbar height -->\r\n<div\r\n class=\"fui-virtual-scroll-viewport__spacer\"\r\n [style.height.px]=\"orientation() === 'vertical' ? _totalContentSize() : null\"\r\n [style.width.px]=\"orientation() === 'horizontal' ? _totalContentSize() : null\"\r\n></div>\r\n\r\n<!-- Content wrapper - positioned via transform to show correct items -->\r\n<div class=\"fui-virtual-scroll-viewport__content\" #contentWrapper>\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [".fui-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict}.fui-virtual-scroll-viewport__spacer{position:absolute;top:0;left:0;width:1px}.fui-virtual-scroll-viewport__content{position:absolute;top:0;left:0;width:100%;will-change:transform;contain:content}.fui-virtual-scroll-viewport--horizontal .fui-virtual-scroll-viewport__spacer{height:1px;width:auto}.fui-virtual-scroll-viewport--horizontal .fui-virtual-scroll-viewport__content{display:flex;flex-direction:row;height:100%;width:auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-cdk-virtual-scroll.mjs","sources":["../../../lib/cdk/virtual-scroll/virtual-scroll.utils.ts","../../../lib/cdk/virtual-scroll/fui-virtual-scroll-viewport.component.ts","../../../lib/cdk/virtual-scroll/fui-virtual-scroll-viewport.component.html","../../../lib/cdk/virtual-scroll/fui-virtual-for.directive.ts","../../../lib/cdk/virtual-scroll/raintonic-formaui-cdk-virtual-scroll.ts"],"sourcesContent":["import { FuiListRange } from './virtual-scroll.types';\r\n\r\n/**\r\n * Clamps a value between min and max bounds.\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\n/**\r\n * Checks if two FuiListRange objects are equal.\r\n */\r\nexport function rangesEqual(a: FuiListRange, b: FuiListRange): boolean {\r\n return a.start === b.start && a.end === b.end;\r\n}\r\n\r\n/**\r\n * Calculates the rendered range given scroll parameters.\r\n */\r\nexport function calculateRenderedRange(\r\n scrollOffset: number,\r\n viewportSize: number,\r\n itemSize: number,\r\n totalItems: number,\r\n minBufferPx: number,\r\n maxBufferPx: number,\r\n): FuiListRange {\r\n if (totalItems === 0 || itemSize === 0) {\r\n return { start: 0, end: 0 };\r\n }\r\n\r\n const firstVisibleIndex = Math.floor(scrollOffset / itemSize);\r\n const lastVisibleIndex = Math.ceil((scrollOffset + viewportSize) / itemSize);\r\n\r\n const bufferBefore = Math.ceil(minBufferPx / itemSize);\r\n const bufferAfter = Math.ceil(maxBufferPx / itemSize);\r\n\r\n const start = Math.max(0, firstVisibleIndex - bufferBefore);\r\n const end = Math.min(totalItems, lastVisibleIndex + bufferAfter);\r\n\r\n return { start, end };\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FuiListRange, FuiVirtualScrollOrientation } from './virtual-scroll.types';\r\nimport { calculateRenderedRange, rangesEqual } from './virtual-scroll.utils';\r\n\r\n@Component({\r\n selector: 'fui-virtual-scroll-viewport',\r\n standalone: true,\r\n templateUrl: './fui-virtual-scroll-viewport.component.html',\r\n styleUrls: ['./fui-virtual-scroll-viewport.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-virtual-scroll-viewport',\r\n role: 'list',\r\n '[class.fui-virtual-scroll-viewport--horizontal]': 'orientation() === \"horizontal\"',\r\n '(scroll)': '_onScroll()',\r\n },\r\n})\r\nexport class FuiVirtualScrollViewportComponent implements OnInit, OnDestroy, AfterViewInit {\r\n /** Fixed size of each item in pixels */\r\n readonly itemSize = input.required<number>();\r\n\r\n /** Minimum buffer in pixels to render before the visible area */\r\n readonly minBufferPx = input(200);\r\n\r\n /** Maximum buffer in pixels to render after the visible area */\r\n readonly maxBufferPx = input(400);\r\n\r\n /** Scroll orientation */\r\n readonly orientation = input<FuiVirtualScrollOrientation>('vertical');\r\n\r\n /** Emits the first visible index on scroll */\r\n readonly scrolledIndexChange = output<number>();\r\n\r\n /** Emits the rendered range when it changes */\r\n readonly renderedRangeChange = output<FuiListRange>();\r\n\r\n /** Current rendered range (shared with fuiVirtualFor directive) */\r\n readonly _renderedRange = signal({ start: 0, end: 0 });\r\n\r\n /** Total number of items in the data source */\r\n readonly _totalItems = signal(0);\r\n\r\n /** Total content size in pixels */\r\n readonly _totalContentSize = computed(() => this._totalItems() * this.itemSize());\r\n\r\n @ViewChild('contentWrapper', { static: true }) _contentWrapper!: ElementRef<HTMLElement>;\r\n\r\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly _ngZone = inject(NgZone);\r\n\r\n private _rafId: number | null = null;\r\n private _lastScrollOffset = 0;\r\n\r\n ngOnInit(): void {\r\n this._ngZone.runOutsideAngular(() => {\r\n this._updateRenderedRange();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._updateRenderedRange();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId);\r\n this._rafId = null;\r\n }\r\n }\r\n\r\n /** Scroll event handler - throttled via requestAnimationFrame */\r\n _onScroll(): void {\r\n if (this._rafId !== null) {\r\n return;\r\n }\r\n this._rafId = requestAnimationFrame(() => {\r\n this._rafId = null;\r\n this._updateRenderedRange();\r\n });\r\n }\r\n\r\n /** Scrolls the viewport to bring the given index into view */\r\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\r\n const offset = index * this.itemSize();\r\n this.scrollToOffset(offset, behavior);\r\n }\r\n\r\n /** Scrolls the viewport to a specific pixel offset */\r\n scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\r\n const el = this._elementRef.nativeElement;\r\n const isHorizontal = this.orientation() === 'horizontal';\r\n\r\n if (isHorizontal) {\r\n el.scrollTo({ left: offset, behavior });\r\n } else {\r\n el.scrollTo({ top: offset, behavior });\r\n }\r\n }\r\n\r\n /** Returns the current rendered range */\r\n getRenderedRange(): FuiListRange {\r\n return this._renderedRange();\r\n }\r\n\r\n /** Measures and returns the viewport size (height or width depending on orientation) */\r\n measureViewportSize(): number {\r\n const el = this._elementRef.nativeElement;\r\n return this.orientation() === 'horizontal' ? el.clientWidth : el.clientHeight;\r\n }\r\n\r\n /** Called by fuiVirtualFor to set the total item count */\r\n _setTotalItems(count: number): void {\r\n this._totalItems.set(count);\r\n this._updateRenderedRange();\r\n }\r\n\r\n /** Recalculates which items should be rendered based on current scroll position */\r\n private _updateRenderedRange(): void {\r\n const el = this._elementRef.nativeElement;\r\n const isHorizontal = this.orientation() === 'horizontal';\r\n\r\n const scrollOffset = isHorizontal ? el.scrollLeft : el.scrollTop;\r\n const viewportSize = isHorizontal ? el.clientWidth : el.clientHeight;\r\n\r\n this._lastScrollOffset = scrollOffset;\r\n\r\n const newRange = calculateRenderedRange(\r\n scrollOffset,\r\n viewportSize,\r\n this.itemSize(),\r\n this._totalItems(),\r\n this.minBufferPx(),\r\n this.maxBufferPx(),\r\n );\r\n\r\n const currentRange = this._renderedRange();\r\n\r\n if (!rangesEqual(currentRange, newRange)) {\r\n this._ngZone.run(() => {\r\n this._renderedRange.set(newRange);\r\n this.renderedRangeChange.emit(newRange);\r\n });\r\n }\r\n\r\n // Update content wrapper transform\r\n const contentOffset = newRange.start * this.itemSize();\r\n if (this._contentWrapper) {\r\n const transform = isHorizontal ? `translateX(${contentOffset}px)` : `translateY(${contentOffset}px)`;\r\n this._contentWrapper.nativeElement.style.transform = transform;\r\n }\r\n\r\n // Emit scrolled index (first visible, not buffered)\r\n const firstVisibleIndex = this.itemSize() > 0 ? Math.floor(scrollOffset / this.itemSize()) : 0;\r\n this._ngZone.run(() => {\r\n this.scrolledIndexChange.emit(firstVisibleIndex);\r\n });\r\n }\r\n}\r\n","<!-- Spacer that creates the full scrollbar height -->\r\n<div\r\n class=\"fui-virtual-scroll-viewport__spacer\"\r\n [style.height.px]=\"orientation() === 'vertical' ? _totalContentSize() : null\"\r\n [style.width.px]=\"orientation() === 'horizontal' ? _totalContentSize() : null\"\r\n></div>\r\n\r\n<!-- Content wrapper - positioned via transform to show correct items -->\r\n<div class=\"fui-virtual-scroll-viewport__content\" #contentWrapper>\r\n <ng-content></ng-content>\r\n</div>\r\n","import {\r\n Directive,\r\n DoCheck,\r\n effect,\r\n EmbeddedViewRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n TemplateRef,\r\n TrackByFunction,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { FuiVirtualScrollViewportComponent } from './fui-virtual-scroll-viewport.component';\r\nimport { FuiVirtualForContext } from './virtual-scroll.types';\r\n\r\n/** Maximum number of detached views to keep in the recycling cache */\r\nconst MAX_VIEW_CACHE_SIZE = 20;\r\n\r\n@Directive({\r\n selector: '[fuiVirtualFor][fuiVirtualForOf]',\r\n standalone: true,\r\n})\r\nexport class FuiVirtualForDirective<T> implements OnDestroy, DoCheck {\r\n /** The data array to iterate over */\r\n readonly fuiVirtualForOf = input.required<T[]>();\r\n\r\n /** Optional trackBy function for identity tracking */\r\n readonly fuiVirtualForTrackBy = input<TrackByFunction<T>>();\r\n\r\n private readonly _viewport = inject(FuiVirtualScrollViewportComponent);\r\n private readonly _viewContainerRef = inject(ViewContainerRef);\r\n private readonly _templateRef = inject(TemplateRef<FuiVirtualForContext<T>>);\r\n\r\n /** Pool of detached views available for reuse */\r\n private _viewCache: EmbeddedViewRef<FuiVirtualForContext<T>>[] = [];\r\n\r\n /** Currently attached views in the container */\r\n private _renderedViews: EmbeddedViewRef<FuiVirtualForContext<T>>[] = [];\r\n\r\n /** Previous data reference for change detection */\r\n private _previousData: T[] | null = null;\r\n\r\n constructor() {\r\n // React to data changes\r\n effect(() => {\r\n const data = this.fuiVirtualForOf();\r\n this._viewport._setTotalItems(data ? data.length : 0);\r\n });\r\n\r\n // React to rendered range changes\r\n effect(() => {\r\n const range = this._viewport._renderedRange();\r\n this._renderRange(range.start, range.end);\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Check if data reference changed (for cases where array is replaced)\r\n const data = this.fuiVirtualForOf();\r\n if (data !== this._previousData) {\r\n this._previousData = data;\r\n this._viewport._setTotalItems(data ? data.length : 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._detachAllViews();\r\n this._destroyCache();\r\n }\r\n\r\n /**\r\n * Renders items within the given range [start, end).\r\n * Recycles views from the cache when possible.\r\n */\r\n private _renderRange(start: number, end: number): void {\r\n const data = this.fuiVirtualForOf();\r\n if (!data) {\r\n this._detachAllViews();\r\n return;\r\n }\r\n\r\n const count = data.length;\r\n\r\n // Detach all current views and push to cache\r\n this._detachAllViews();\r\n\r\n // Create or reuse views for the new range\r\n for (let i = start; i < end; i++) {\r\n const item = data[i];\r\n if (item === undefined) continue;\r\n\r\n const context: FuiVirtualForContext<T> = {\r\n $implicit: item,\r\n index: i,\r\n count,\r\n first: i === 0,\r\n last: i === count - 1,\r\n even: i % 2 === 0,\r\n odd: i % 2 !== 0,\r\n };\r\n\r\n let view: EmbeddedViewRef<FuiVirtualForContext<T>>;\r\n\r\n if (this._viewCache.length > 0) {\r\n // Reuse a cached view\r\n view = this._viewCache.pop()!;\r\n this._updateContext(view, context);\r\n this._viewContainerRef.insert(view);\r\n } else {\r\n // Create a new view\r\n view = this._viewContainerRef.createEmbeddedView(this._templateRef, context);\r\n }\r\n\r\n this._renderedViews.push(view);\r\n }\r\n\r\n // Trim excess cache\r\n while (this._viewCache.length > MAX_VIEW_CACHE_SIZE) {\r\n const view = this._viewCache.pop()!;\r\n view.destroy();\r\n }\r\n }\r\n\r\n /** Updates the context of an existing embedded view */\r\n private _updateContext(view: EmbeddedViewRef<FuiVirtualForContext<T>>, context: FuiVirtualForContext<T>): void {\r\n view.context.$implicit = context.$implicit;\r\n view.context.index = context.index;\r\n view.context.count = context.count;\r\n view.context.first = context.first;\r\n view.context.last = context.last;\r\n view.context.even = context.even;\r\n view.context.odd = context.odd;\r\n view.markForCheck();\r\n }\r\n\r\n /** Detaches all rendered views and moves them to the cache */\r\n private _detachAllViews(): void {\r\n for (let i = this._viewContainerRef.length - 1; i >= 0; i--) {\r\n const view = this._viewContainerRef.detach(i) as EmbeddedViewRef<FuiVirtualForContext<T>>;\r\n if (view) {\r\n this._viewCache.push(view);\r\n }\r\n }\r\n this._renderedViews = [];\r\n }\r\n\r\n /** Destroys all cached views */\r\n private _destroyCache(): void {\r\n for (const view of this._viewCache) {\r\n view.destroy();\r\n }\r\n this._viewCache = [];\r\n }\r\n\r\n /** Static method for Angular's type inference in templates */\r\n static ngTemplateContextGuard<T>(_dir: FuiVirtualForDirective<T>, _ctx: unknown): _ctx is FuiVirtualForContext<T> {\r\n return true;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raintonic-formaui-cdk-virtual-scroll.mjs","sources":["../../../lib/cdk/virtual-scroll/virtual-scroll.utils.ts","../../../lib/cdk/virtual-scroll/fui-virtual-scroll-viewport.component.ts","../../../lib/cdk/virtual-scroll/fui-virtual-scroll-viewport.component.html","../../../lib/cdk/virtual-scroll/fui-virtual-for.directive.ts","../../../lib/cdk/virtual-scroll/raintonic-formaui-cdk-virtual-scroll.ts"],"sourcesContent":["import { FuiListRange } from './virtual-scroll.types';\r\n\r\n/**\r\n * Clamps a value between min and max bounds.\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\n/**\r\n * Checks if two FuiListRange objects are equal.\r\n */\r\nexport function rangesEqual(a: FuiListRange, b: FuiListRange): boolean {\r\n return a.start === b.start && a.end === b.end;\r\n}\r\n\r\n/**\r\n * Calculates the rendered range given scroll parameters.\r\n */\r\nexport function calculateRenderedRange(\r\n scrollOffset: number,\r\n viewportSize: number,\r\n itemSize: number,\r\n totalItems: number,\r\n minBufferPx: number,\r\n maxBufferPx: number,\r\n): FuiListRange {\r\n if (totalItems === 0 || itemSize === 0) {\r\n return { start: 0, end: 0 };\r\n }\r\n\r\n const firstVisibleIndex = Math.floor(scrollOffset / itemSize);\r\n const lastVisibleIndex = Math.ceil((scrollOffset + viewportSize) / itemSize);\r\n\r\n const bufferBefore = Math.ceil(minBufferPx / itemSize);\r\n const bufferAfter = Math.ceil(maxBufferPx / itemSize);\r\n\r\n const start = Math.max(0, firstVisibleIndex - bufferBefore);\r\n const end = Math.min(totalItems, lastVisibleIndex + bufferAfter);\r\n\r\n return { start, end };\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FuiListRange, FuiVirtualScrollOrientation } from './virtual-scroll.types';\r\nimport { calculateRenderedRange, rangesEqual } from './virtual-scroll.utils';\r\n\r\n@Component({\r\n selector: 'fui-virtual-scroll-viewport',\r\n standalone: true,\r\n templateUrl: './fui-virtual-scroll-viewport.component.html',\r\n styleUrls: ['./fui-virtual-scroll-viewport.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-virtual-scroll-viewport',\r\n role: 'list',\r\n '[class.fui-virtual-scroll-viewport--horizontal]': 'orientation() === \"horizontal\"',\r\n '(scroll)': '_onScroll()',\r\n },\r\n})\r\nexport class FuiVirtualScrollViewportComponent implements OnInit, OnDestroy, AfterViewInit {\r\n /** Fixed size of each item in pixels */\r\n readonly itemSize = input.required<number>();\r\n\r\n /** Minimum buffer in pixels to render before the visible area */\r\n readonly minBufferPx = input(200);\r\n\r\n /** Maximum buffer in pixels to render after the visible area */\r\n readonly maxBufferPx = input(400);\r\n\r\n /** Scroll orientation */\r\n readonly orientation = input<FuiVirtualScrollOrientation>('vertical');\r\n\r\n /** Emits the first visible index on scroll */\r\n readonly scrolledIndexChange = output<number>();\r\n\r\n /** Emits the rendered range when it changes */\r\n readonly renderedRangeChange = output<FuiListRange>();\r\n\r\n /** Current rendered range (shared with fuiVirtualFor directive) */\r\n readonly _renderedRange = signal({ start: 0, end: 0 });\r\n\r\n /** Total number of items in the data source */\r\n readonly _totalItems = signal(0);\r\n\r\n /** Total content size in pixels */\r\n readonly _totalContentSize = computed(() => this._totalItems() * this.itemSize());\r\n\r\n @ViewChild('contentWrapper', { static: true }) _contentWrapper!: ElementRef<HTMLElement>;\r\n\r\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n private _rafId: number | null = null;\r\n private _lastScrollOffset = 0;\r\n\r\n ngOnInit(): void {\r\n this._updateRenderedRange();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._updateRenderedRange();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId);\r\n this._rafId = null;\r\n }\r\n }\r\n\r\n /** Scroll event handler - throttled via requestAnimationFrame */\r\n _onScroll(): void {\r\n if (this._rafId !== null) {\r\n return;\r\n }\r\n this._rafId = requestAnimationFrame(() => {\r\n this._rafId = null;\r\n this._updateRenderedRange();\r\n });\r\n }\r\n\r\n /** Scrolls the viewport to bring the given index into view */\r\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\r\n const offset = index * this.itemSize();\r\n this.scrollToOffset(offset, behavior);\r\n }\r\n\r\n /** Scrolls the viewport to a specific pixel offset */\r\n scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\r\n const el = this._elementRef.nativeElement;\r\n const isHorizontal = this.orientation() === 'horizontal';\r\n\r\n if (isHorizontal) {\r\n el.scrollTo({ left: offset, behavior });\r\n } else {\r\n el.scrollTo({ top: offset, behavior });\r\n }\r\n }\r\n\r\n /** Returns the current rendered range */\r\n getRenderedRange(): FuiListRange {\r\n return this._renderedRange();\r\n }\r\n\r\n /** Measures and returns the viewport size (height or width depending on orientation) */\r\n measureViewportSize(): number {\r\n const el = this._elementRef.nativeElement;\r\n return this.orientation() === 'horizontal' ? el.clientWidth : el.clientHeight;\r\n }\r\n\r\n /** Called by fuiVirtualFor to set the total item count */\r\n _setTotalItems(count: number): void {\r\n this._totalItems.set(count);\r\n this._updateRenderedRange();\r\n }\r\n\r\n /** Recalculates which items should be rendered based on current scroll position */\r\n private _updateRenderedRange(): void {\r\n const el = this._elementRef.nativeElement;\r\n const isHorizontal = this.orientation() === 'horizontal';\r\n\r\n const scrollOffset = isHorizontal ? el.scrollLeft : el.scrollTop;\r\n const viewportSize = isHorizontal ? el.clientWidth : el.clientHeight;\r\n\r\n this._lastScrollOffset = scrollOffset;\r\n\r\n const newRange = calculateRenderedRange(\r\n scrollOffset,\r\n viewportSize,\r\n this.itemSize(),\r\n this._totalItems(),\r\n this.minBufferPx(),\r\n this.maxBufferPx(),\r\n );\r\n\r\n const currentRange = this._renderedRange();\r\n\r\n if (!rangesEqual(currentRange, newRange)) {\r\n this._renderedRange.set(newRange);\r\n this.renderedRangeChange.emit(newRange);\r\n }\r\n\r\n // Update content wrapper transform\r\n const contentOffset = newRange.start * this.itemSize();\r\n if (this._contentWrapper) {\r\n const transform = isHorizontal ? `translateX(${contentOffset}px)` : `translateY(${contentOffset}px)`;\r\n this._contentWrapper.nativeElement.style.transform = transform;\r\n }\r\n\r\n // Emit scrolled index (first visible, not buffered)\r\n const firstVisibleIndex = this.itemSize() > 0 ? Math.floor(scrollOffset / this.itemSize()) : 0;\r\n this.scrolledIndexChange.emit(firstVisibleIndex);\r\n }\r\n}\r\n","<!-- Spacer that creates the full scrollbar height -->\r\n<div\r\n class=\"fui-virtual-scroll-viewport__spacer\"\r\n [style.height.px]=\"orientation() === 'vertical' ? _totalContentSize() : null\"\r\n [style.width.px]=\"orientation() === 'horizontal' ? _totalContentSize() : null\"\r\n></div>\r\n\r\n<!-- Content wrapper - positioned via transform to show correct items -->\r\n<div class=\"fui-virtual-scroll-viewport__content\" #contentWrapper>\r\n <ng-content></ng-content>\r\n</div>\r\n","import {\r\n Directive,\r\n DoCheck,\r\n effect,\r\n EmbeddedViewRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n TemplateRef,\r\n TrackByFunction,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { FuiVirtualScrollViewportComponent } from './fui-virtual-scroll-viewport.component';\r\nimport { FuiVirtualForContext } from './virtual-scroll.types';\r\n\r\n/** Maximum number of detached views to keep in the recycling cache */\r\nconst MAX_VIEW_CACHE_SIZE = 20;\r\n\r\n@Directive({\r\n selector: '[fuiVirtualFor][fuiVirtualForOf]',\r\n standalone: true,\r\n})\r\nexport class FuiVirtualForDirective<T> implements OnDestroy, DoCheck {\r\n /** The data array to iterate over */\r\n readonly fuiVirtualForOf = input.required<T[]>();\r\n\r\n /** Optional trackBy function for identity tracking */\r\n readonly fuiVirtualForTrackBy = input<TrackByFunction<T>>();\r\n\r\n private readonly _viewport = inject(FuiVirtualScrollViewportComponent);\r\n private readonly _viewContainerRef = inject(ViewContainerRef);\r\n private readonly _templateRef = inject(TemplateRef<FuiVirtualForContext<T>>);\r\n\r\n /** Pool of detached views available for reuse */\r\n private _viewCache: EmbeddedViewRef<FuiVirtualForContext<T>>[] = [];\r\n\r\n /** Currently attached views in the container */\r\n private _renderedViews: EmbeddedViewRef<FuiVirtualForContext<T>>[] = [];\r\n\r\n /** Previous data reference for change detection */\r\n private _previousData: T[] | null = null;\r\n\r\n constructor() {\r\n // React to data changes\r\n effect(() => {\r\n const data = this.fuiVirtualForOf();\r\n this._viewport._setTotalItems(data ? data.length : 0);\r\n });\r\n\r\n // React to rendered range changes\r\n effect(() => {\r\n const range = this._viewport._renderedRange();\r\n this._renderRange(range.start, range.end);\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Check if data reference changed (for cases where array is replaced)\r\n const data = this.fuiVirtualForOf();\r\n if (data !== this._previousData) {\r\n this._previousData = data;\r\n this._viewport._setTotalItems(data ? data.length : 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._detachAllViews();\r\n this._destroyCache();\r\n }\r\n\r\n /**\r\n * Renders items within the given range [start, end).\r\n * Recycles views from the cache when possible.\r\n */\r\n private _renderRange(start: number, end: number): void {\r\n const data = this.fuiVirtualForOf();\r\n if (!data) {\r\n this._detachAllViews();\r\n return;\r\n }\r\n\r\n const count = data.length;\r\n\r\n // Detach all current views and push to cache\r\n this._detachAllViews();\r\n\r\n // Create or reuse views for the new range\r\n for (let i = start; i < end; i++) {\r\n const item = data[i];\r\n if (item === undefined) continue;\r\n\r\n const context: FuiVirtualForContext<T> = {\r\n $implicit: item,\r\n index: i,\r\n count,\r\n first: i === 0,\r\n last: i === count - 1,\r\n even: i % 2 === 0,\r\n odd: i % 2 !== 0,\r\n };\r\n\r\n let view: EmbeddedViewRef<FuiVirtualForContext<T>>;\r\n\r\n if (this._viewCache.length > 0) {\r\n // Reuse a cached view\r\n view = this._viewCache.pop()!;\r\n this._updateContext(view, context);\r\n this._viewContainerRef.insert(view);\r\n } else {\r\n // Create a new view\r\n view = this._viewContainerRef.createEmbeddedView(this._templateRef, context);\r\n }\r\n\r\n this._renderedViews.push(view);\r\n }\r\n\r\n // Trim excess cache\r\n while (this._viewCache.length > MAX_VIEW_CACHE_SIZE) {\r\n const view = this._viewCache.pop()!;\r\n view.destroy();\r\n }\r\n }\r\n\r\n /** Updates the context of an existing embedded view */\r\n private _updateContext(view: EmbeddedViewRef<FuiVirtualForContext<T>>, context: FuiVirtualForContext<T>): void {\r\n view.context.$implicit = context.$implicit;\r\n view.context.index = context.index;\r\n view.context.count = context.count;\r\n view.context.first = context.first;\r\n view.context.last = context.last;\r\n view.context.even = context.even;\r\n view.context.odd = context.odd;\r\n view.markForCheck();\r\n }\r\n\r\n /** Detaches all rendered views and moves them to the cache */\r\n private _detachAllViews(): void {\r\n for (let i = this._viewContainerRef.length - 1; i >= 0; i--) {\r\n const view = this._viewContainerRef.detach(i) as EmbeddedViewRef<FuiVirtualForContext<T>>;\r\n if (view) {\r\n this._viewCache.push(view);\r\n }\r\n }\r\n this._renderedViews = [];\r\n }\r\n\r\n /** Destroys all cached views */\r\n private _destroyCache(): void {\r\n for (const view of this._viewCache) {\r\n view.destroy();\r\n }\r\n this._viewCache = [];\r\n }\r\n\r\n /** Static method for Angular's type inference in templates */\r\n static ngTemplateContextGuard<T>(_dir: FuiVirtualForDirective<T>, _ctx: unknown): _ctx is FuiVirtualForContext<T> {\r\n return true;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -106,7 +106,10 @@ class FuiExpansionPanelComponent {
106
106
  }
107
107
  /** Called when the body transition ends. */
108
108
  _onBodyTransitionEnd(event) {
109
- if (event.propertyName === 'max-height') {
109
+ // The body now animates `grid-template-rows`. Keep `max-height` accepted
110
+ // as well so any test or call site still pinned to the old property name
111
+ // continues to work without flagging spurious failures.
112
+ if (event.propertyName === 'grid-template-rows' || event.propertyName === 'max-height') {
110
113
  this._animating.set(false);
111
114
  if (this._expanded()) {
112
115
  this.afterExpand.emit();
@@ -117,7 +120,7 @@ class FuiExpansionPanelComponent {
117
120
  }
118
121
  }
119
122
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiExpansionPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiExpansionPanelComponent, isStandalone: true, selector: "fui-expansion-panel", inputs: { expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hideToggle: { classPropertyName: "hideToggle", publicName: "hideToggle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", expandedChange: "expandedChange", afterExpand: "afterExpand", afterCollapse: "afterCollapse" }, host: { properties: { "class.fui-expansion-panel--expanded": "_expanded()", "class.fui-expansion-panel--disabled": "disabled()", "class.fui-expansion-panel--animating": "_animating()" }, classAttribute: "fui-expansion-panel" }, ngImport: i0, template: "<div\r\n class=\"fui-expansion-panel__header\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle(); $event.preventDefault()\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"_expanded()\"\r\n [attr.aria-controls]=\"_contentId\"\r\n [attr.id]=\"_headerId\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n>\r\n <div class=\"fui-expansion-panel__header-content\">\r\n <ng-content select=\"[panelTitle]\"></ng-content>\r\n <ng-content select=\"[panelDescription]\"></ng-content>\r\n </div>\r\n @if (!hideToggle()) {\r\n <fui-icon\r\n class=\"fui-expansion-panel__toggle-icon\"\r\n [class.fui-expansion-panel__toggle-icon--expanded]=\"_expanded()\"\r\n name=\"caret-down\"\r\n size=\"sm\"\r\n ></fui-icon>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"fui-expansion-panel__body\"\r\n [attr.id]=\"_contentId\"\r\n [attr.aria-labelledby]=\"_headerId\"\r\n role=\"region\"\r\n [class.fui-expansion-panel__body--expanded]=\"_expanded()\"\r\n (transitionend)=\"_onBodyTransitionEnd($event)\"\r\n>\r\n <div class=\"fui-expansion-panel__body-inner\">\r\n @if (_expanded() || _hasBeenOpened()) {\r\n <ng-content></ng-content>\r\n }\r\n </div>\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-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-expansion-panel{display:block;background-color:var(--fui-surface-card, var(--fui-surface-01));border-bottom:1px solid var(--fui-border-color)}.fui-expansion-panel:first-child{border-top-left-radius:var(--fui-border-radius-sm);border-top-right-radius:var(--fui-border-radius-sm)}.fui-expansion-panel:last-child{border-bottom:none;border-bottom-left-radius:var(--fui-border-radius-sm);border-bottom-right-radius:var(--fui-border-radius-sm)}.fui-expansion-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-padding-16, 1rem) var(--fui-padding-24, 1.5rem);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-03);font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary);background:transparent;border:none;outline:none;transition:background-color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-expansion-panel__header:hover{background-color:var(--fui-surface-hover, rgba(0, 0, 0, .04))}.fui-expansion-panel__header:focus-visible{outline:2px solid var(--fui-primary);outline-offset:0px}.fui-expansion-panel__header-content{display:flex;flex-direction:column;flex:1;min-width:0;gap:var(--fui-gap-4, .25rem)}.fui-expansion-panel__header-content [panelTitle]{font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary)}.fui-expansion-panel__header-content [panelDescription]{font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular, 400);color:var(--fui-text-secondary)}.fui-expansion-panel__toggle-icon{flex-shrink:0;margin-left:var(--fui-gap-16, 1rem);color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-expansion-panel__toggle-icon--expanded{transform:rotate(180deg)}.fui-expansion-panel__body{max-height:0;overflow:hidden;transition:max-height var(--fui-duration-moderate-02) var(--fui-ease-standard) 0ms}.fui-expansion-panel__body--expanded{max-height:1000px}.fui-expansion-panel__body-inner{padding:0 var(--fui-padding-24, 1.5rem) var(--fui-padding-16, 1rem);font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary)}.fui-expansion-panel--expanded .fui-expansion-panel__header{font-weight:var(--fui-font-weight-semibold, 600)}.fui-expansion-panel--disabled{opacity:var(--fui-opacity-disabled, .5)}.fui-expansion-panel--disabled .fui-expansion-panel__header{cursor:not-allowed;pointer-events:none}.fui-accordion--flat .fui-expansion-panel{border-bottom:none;background-color:transparent;border-radius:0}.fui-accordion--flat .fui-expansion-panel__header,.fui-accordion--flat .fui-expansion-panel__body-inner{padding-left:0;padding-right:0}@media(prefers-reduced-motion:reduce){.fui-expansion-panel__toggle-icon,.fui-expansion-panel__body,.fui-expansion-panel__header{transition:none}}\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 });
123
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiExpansionPanelComponent, isStandalone: true, selector: "fui-expansion-panel", inputs: { expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hideToggle: { classPropertyName: "hideToggle", publicName: "hideToggle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", expandedChange: "expandedChange", afterExpand: "afterExpand", afterCollapse: "afterCollapse" }, host: { properties: { "class.fui-expansion-panel--expanded": "_expanded()", "class.fui-expansion-panel--disabled": "disabled()", "class.fui-expansion-panel--animating": "_animating()" }, classAttribute: "fui-expansion-panel" }, ngImport: i0, template: "<div\r\n class=\"fui-expansion-panel__header\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle(); $event.preventDefault()\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"_expanded()\"\r\n [attr.aria-controls]=\"_contentId\"\r\n [attr.id]=\"_headerId\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n>\r\n <span class=\"fui-expansion-panel__leading-icon\">\r\n <ng-content select=\"[panelIcon]\"></ng-content>\r\n </span>\r\n <div class=\"fui-expansion-panel__header-content\">\r\n <ng-content select=\"[panelTitle]\"></ng-content>\r\n <ng-content select=\"[panelDescription]\"></ng-content>\r\n </div>\r\n @if (!hideToggle()) {\r\n <fui-icon\r\n class=\"fui-expansion-panel__toggle-icon\"\r\n [class.fui-expansion-panel__toggle-icon--expanded]=\"_expanded()\"\r\n name=\"caret-down\"\r\n size=\"sm\"\r\n ></fui-icon>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"fui-expansion-panel__body\"\r\n [attr.id]=\"_contentId\"\r\n [attr.aria-labelledby]=\"_headerId\"\r\n role=\"region\"\r\n [class.fui-expansion-panel__body--expanded]=\"_expanded()\"\r\n (transitionend)=\"_onBodyTransitionEnd($event)\"\r\n>\r\n <div class=\"fui-expansion-panel__body-inner\">\r\n @if (_expanded() || _hasBeenOpened()) {\r\n <ng-content></ng-content>\r\n }\r\n </div>\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-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay: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-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-expansion-panel{display:block;background-color:var(--fui-bg-default, var(--fui-bg-default));border-bottom:1px solid var(--fui-border-default)}.fui-expansion-panel:first-child{border-top-left-radius:var(--fui-radius-sm);border-top-right-radius:var(--fui-radius-sm)}.fui-expansion-panel:last-child{border-bottom:none;border-bottom-left-radius:var(--fui-radius-sm);border-bottom-right-radius:var(--fui-radius-sm)}.fui-expansion-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-spacing-7, 1rem) var(--fui-spacing-9, 1.5rem);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--fui-font-sans);font-size:var(--fui-text-md);font-weight:var(--fui-weight-medium, 500);color:var(--fui-text-primary);background:transparent;border:none;outline:none;transition-property:background-color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__header:hover{background-color:var(--fui-bg-subtle, rgba(0, 0, 0, .04))}.fui-expansion-panel__header:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-expansion-panel__header-content{display:flex;flex-direction:column;flex:1;min-width:0;gap:var(--fui-spacing-2, .25rem)}.fui-expansion-panel__header-content [panelTitle]{font-weight:var(--fui-weight-medium, 500);color:var(--fui-text-primary)}.fui-expansion-panel__header-content [panelDescription]{font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular, 400);color:var(--fui-text-secondary)}.fui-expansion-panel__leading-icon{display:contents}.fui-expansion-panel__leading-icon:has(*){display:inline-flex;align-items:center;flex-shrink:0;margin-right:var(--fui-spacing-6, .75rem);color:var(--fui-text-secondary)}.fui-expansion-panel__toggle-icon{flex-shrink:0;margin-left:var(--fui-spacing-7, 1rem);color:var(--fui-text-secondary);transition-property:transform;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__toggle-icon--expanded{transform:rotate(180deg)}.fui-expansion-panel__body{display:grid;grid-template-rows:0fr;transition-property:grid-template-rows;transition-duration:var(--fui-duration-moderate);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__body--expanded{grid-template-rows:1fr}.fui-expansion-panel__body-inner{overflow:hidden;padding:0 var(--fui-spacing-9, 1.5rem);font-family:var(--fui-font-sans);font-size:var(--fui-text-base);color:var(--fui-text-primary);transition-property:padding;transition-duration:var(--fui-duration-moderate);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__body--expanded .fui-expansion-panel__body-inner{padding-bottom:var(--fui-spacing-7, 1rem)}.fui-expansion-panel--expanded .fui-expansion-panel__header{font-weight:var(--fui-weight-semibold, 600)}.fui-expansion-panel--disabled{opacity:var(--fui-state-disabled-opacity, .5)}.fui-expansion-panel--disabled .fui-expansion-panel__header{cursor:not-allowed;pointer-events:none}.fui-accordion--flat .fui-expansion-panel{border-bottom:none;background-color:transparent;border-radius:0}.fui-accordion--flat .fui-expansion-panel__header,.fui-accordion--flat .fui-expansion-panel__body-inner{padding-left:0;padding-right:0}@media(prefers-reduced-motion:reduce){.fui-expansion-panel__toggle-icon,.fui-expansion-panel__body,.fui-expansion-panel__header{transition:none}}\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 });
121
124
  }
122
125
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiExpansionPanelComponent, decorators: [{
123
126
  type: Component,
@@ -126,7 +129,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
126
129
  '[class.fui-expansion-panel--expanded]': '_expanded()',
127
130
  '[class.fui-expansion-panel--disabled]': 'disabled()',
128
131
  '[class.fui-expansion-panel--animating]': '_animating()',
129
- }, template: "<div\r\n class=\"fui-expansion-panel__header\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle(); $event.preventDefault()\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"_expanded()\"\r\n [attr.aria-controls]=\"_contentId\"\r\n [attr.id]=\"_headerId\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n>\r\n <div class=\"fui-expansion-panel__header-content\">\r\n <ng-content select=\"[panelTitle]\"></ng-content>\r\n <ng-content select=\"[panelDescription]\"></ng-content>\r\n </div>\r\n @if (!hideToggle()) {\r\n <fui-icon\r\n class=\"fui-expansion-panel__toggle-icon\"\r\n [class.fui-expansion-panel__toggle-icon--expanded]=\"_expanded()\"\r\n name=\"caret-down\"\r\n size=\"sm\"\r\n ></fui-icon>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"fui-expansion-panel__body\"\r\n [attr.id]=\"_contentId\"\r\n [attr.aria-labelledby]=\"_headerId\"\r\n role=\"region\"\r\n [class.fui-expansion-panel__body--expanded]=\"_expanded()\"\r\n (transitionend)=\"_onBodyTransitionEnd($event)\"\r\n>\r\n <div class=\"fui-expansion-panel__body-inner\">\r\n @if (_expanded() || _hasBeenOpened()) {\r\n <ng-content></ng-content>\r\n }\r\n </div>\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-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-expansion-panel{display:block;background-color:var(--fui-surface-card, var(--fui-surface-01));border-bottom:1px solid var(--fui-border-color)}.fui-expansion-panel:first-child{border-top-left-radius:var(--fui-border-radius-sm);border-top-right-radius:var(--fui-border-radius-sm)}.fui-expansion-panel:last-child{border-bottom:none;border-bottom-left-radius:var(--fui-border-radius-sm);border-bottom-right-radius:var(--fui-border-radius-sm)}.fui-expansion-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-padding-16, 1rem) var(--fui-padding-24, 1.5rem);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-03);font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary);background:transparent;border:none;outline:none;transition:background-color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-expansion-panel__header:hover{background-color:var(--fui-surface-hover, rgba(0, 0, 0, .04))}.fui-expansion-panel__header:focus-visible{outline:2px solid var(--fui-primary);outline-offset:0px}.fui-expansion-panel__header-content{display:flex;flex-direction:column;flex:1;min-width:0;gap:var(--fui-gap-4, .25rem)}.fui-expansion-panel__header-content [panelTitle]{font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary)}.fui-expansion-panel__header-content [panelDescription]{font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular, 400);color:var(--fui-text-secondary)}.fui-expansion-panel__toggle-icon{flex-shrink:0;margin-left:var(--fui-gap-16, 1rem);color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-expansion-panel__toggle-icon--expanded{transform:rotate(180deg)}.fui-expansion-panel__body{max-height:0;overflow:hidden;transition:max-height var(--fui-duration-moderate-02) var(--fui-ease-standard) 0ms}.fui-expansion-panel__body--expanded{max-height:1000px}.fui-expansion-panel__body-inner{padding:0 var(--fui-padding-24, 1.5rem) var(--fui-padding-16, 1rem);font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary)}.fui-expansion-panel--expanded .fui-expansion-panel__header{font-weight:var(--fui-font-weight-semibold, 600)}.fui-expansion-panel--disabled{opacity:var(--fui-opacity-disabled, .5)}.fui-expansion-panel--disabled .fui-expansion-panel__header{cursor:not-allowed;pointer-events:none}.fui-accordion--flat .fui-expansion-panel{border-bottom:none;background-color:transparent;border-radius:0}.fui-accordion--flat .fui-expansion-panel__header,.fui-accordion--flat .fui-expansion-panel__body-inner{padding-left:0;padding-right:0}@media(prefers-reduced-motion:reduce){.fui-expansion-panel__toggle-icon,.fui-expansion-panel__body,.fui-expansion-panel__header{transition:none}}\n"] }]
132
+ }, template: "<div\r\n class=\"fui-expansion-panel__header\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle(); $event.preventDefault()\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"_expanded()\"\r\n [attr.aria-controls]=\"_contentId\"\r\n [attr.id]=\"_headerId\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n>\r\n <span class=\"fui-expansion-panel__leading-icon\">\r\n <ng-content select=\"[panelIcon]\"></ng-content>\r\n </span>\r\n <div class=\"fui-expansion-panel__header-content\">\r\n <ng-content select=\"[panelTitle]\"></ng-content>\r\n <ng-content select=\"[panelDescription]\"></ng-content>\r\n </div>\r\n @if (!hideToggle()) {\r\n <fui-icon\r\n class=\"fui-expansion-panel__toggle-icon\"\r\n [class.fui-expansion-panel__toggle-icon--expanded]=\"_expanded()\"\r\n name=\"caret-down\"\r\n size=\"sm\"\r\n ></fui-icon>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"fui-expansion-panel__body\"\r\n [attr.id]=\"_contentId\"\r\n [attr.aria-labelledby]=\"_headerId\"\r\n role=\"region\"\r\n [class.fui-expansion-panel__body--expanded]=\"_expanded()\"\r\n (transitionend)=\"_onBodyTransitionEnd($event)\"\r\n>\r\n <div class=\"fui-expansion-panel__body-inner\">\r\n @if (_expanded() || _hasBeenOpened()) {\r\n <ng-content></ng-content>\r\n }\r\n </div>\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-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay: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-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-expansion-panel{display:block;background-color:var(--fui-bg-default, var(--fui-bg-default));border-bottom:1px solid var(--fui-border-default)}.fui-expansion-panel:first-child{border-top-left-radius:var(--fui-radius-sm);border-top-right-radius:var(--fui-radius-sm)}.fui-expansion-panel:last-child{border-bottom:none;border-bottom-left-radius:var(--fui-radius-sm);border-bottom-right-radius:var(--fui-radius-sm)}.fui-expansion-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-spacing-7, 1rem) var(--fui-spacing-9, 1.5rem);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--fui-font-sans);font-size:var(--fui-text-md);font-weight:var(--fui-weight-medium, 500);color:var(--fui-text-primary);background:transparent;border:none;outline:none;transition-property:background-color;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__header:hover{background-color:var(--fui-bg-subtle, rgba(0, 0, 0, .04))}.fui-expansion-panel__header:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-expansion-panel__header-content{display:flex;flex-direction:column;flex:1;min-width:0;gap:var(--fui-spacing-2, .25rem)}.fui-expansion-panel__header-content [panelTitle]{font-weight:var(--fui-weight-medium, 500);color:var(--fui-text-primary)}.fui-expansion-panel__header-content [panelDescription]{font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular, 400);color:var(--fui-text-secondary)}.fui-expansion-panel__leading-icon{display:contents}.fui-expansion-panel__leading-icon:has(*){display:inline-flex;align-items:center;flex-shrink:0;margin-right:var(--fui-spacing-6, .75rem);color:var(--fui-text-secondary)}.fui-expansion-panel__toggle-icon{flex-shrink:0;margin-left:var(--fui-spacing-7, 1rem);color:var(--fui-text-secondary);transition-property:transform;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__toggle-icon--expanded{transform:rotate(180deg)}.fui-expansion-panel__body{display:grid;grid-template-rows:0fr;transition-property:grid-template-rows;transition-duration:var(--fui-duration-moderate);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__body--expanded{grid-template-rows:1fr}.fui-expansion-panel__body-inner{overflow:hidden;padding:0 var(--fui-spacing-9, 1.5rem);font-family:var(--fui-font-sans);font-size:var(--fui-text-base);color:var(--fui-text-primary);transition-property:padding;transition-duration:var(--fui-duration-moderate);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-expansion-panel__body--expanded .fui-expansion-panel__body-inner{padding-bottom:var(--fui-spacing-7, 1rem)}.fui-expansion-panel--expanded .fui-expansion-panel__header{font-weight:var(--fui-weight-semibold, 600)}.fui-expansion-panel--disabled{opacity:var(--fui-state-disabled-opacity, .5)}.fui-expansion-panel--disabled .fui-expansion-panel__header{cursor:not-allowed;pointer-events:none}.fui-accordion--flat .fui-expansion-panel{border-bottom:none;background-color:transparent;border-radius:0}.fui-accordion--flat .fui-expansion-panel__header,.fui-accordion--flat .fui-expansion-panel__body-inner{padding-left:0;padding-right:0}@media(prefers-reduced-motion:reduce){.fui-expansion-panel__toggle-icon,.fui-expansion-panel__body,.fui-expansion-panel__header{transition:none}}\n"] }]
130
133
  }], ctorParameters: () => [], propDecorators: { expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hideToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideToggle", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }], afterExpand: [{ type: i0.Output, args: ["afterExpand"] }], afterCollapse: [{ type: i0.Output, args: ["afterCollapse"] }] } });
131
134
 
132
135
  /**
@@ -199,14 +202,14 @@ class FuiAccordionComponent {
199
202
  });
200
203
  }
201
204
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
202
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiAccordionComponent, isStandalone: true, selector: "fui-accordion", inputs: { multi: { classPropertyName: "multi", publicName: "multi", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fui-accordion--flat": "displayMode() === \"flat\"" }, classAttribute: "fui-accordion" }, providers: [{ provide: FUI_ACCORDION, useExisting: FuiAccordionComponent }], queries: [{ propertyName: "panels", predicate: FuiExpansionPanelComponent, isSignal: true }], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".fui-accordion{display:block;border-radius:var(--fui-border-radius-sm)}.fui-accordion:not(.fui-accordion--flat){border:1px solid var(--fui-border-color)}.fui-accordion--flat{border:none;border-radius:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
205
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiAccordionComponent, isStandalone: true, selector: "fui-accordion", inputs: { multi: { classPropertyName: "multi", publicName: "multi", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fui-accordion--flat": "displayMode() === \"flat\"" }, classAttribute: "fui-accordion" }, providers: [{ provide: FUI_ACCORDION, useExisting: FuiAccordionComponent }], queries: [{ propertyName: "panels", predicate: FuiExpansionPanelComponent, isSignal: true }], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".fui-accordion{display:block;border-radius:var(--fui-radius-sm)}.fui-accordion:not(.fui-accordion--flat){border:1px solid var(--fui-border-default)}.fui-accordion--flat{border:none;border-radius:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
203
206
  }
204
207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiAccordionComponent, decorators: [{
205
208
  type: Component,
206
209
  args: [{ selector: 'fui-accordion', standalone: true, template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
207
210
  class: 'fui-accordion',
208
211
  '[class.fui-accordion--flat]': 'displayMode() === "flat"',
209
- }, providers: [{ provide: FUI_ACCORDION, useExisting: FuiAccordionComponent }], styles: [".fui-accordion{display:block;border-radius:var(--fui-border-radius-sm)}.fui-accordion:not(.fui-accordion--flat){border:1px solid var(--fui-border-color)}.fui-accordion--flat{border:none;border-radius:0}\n"] }]
212
+ }, providers: [{ provide: FUI_ACCORDION, useExisting: FuiAccordionComponent }], styles: [".fui-accordion{display:block;border-radius:var(--fui-radius-sm)}.fui-accordion:not(.fui-accordion--flat){border:1px solid var(--fui-border-default)}.fui-accordion--flat{border:none;border-radius:0}\n"] }]
210
213
  }], propDecorators: { multi: [{ type: i0.Input, args: [{ isSignal: true, alias: "multi", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], panels: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FuiExpansionPanelComponent), { isSignal: true }] }] } });
211
214
 
212
215
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-accordion.mjs","sources":["../../../lib/components/accordion/accordion.types.ts","../../../lib/components/accordion/expansion-panel.component.ts","../../../lib/components/accordion/expansion-panel.component.html","../../../lib/components/accordion/accordion.component.ts","../../../lib/components/accordion/raintonic-formaui-components-accordion.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport type AccordionDisplayMode = 'default' | 'flat';\r\n\r\nexport interface AccordionExpandedChange {\r\n source: unknown;\r\n expanded: boolean;\r\n}\r\n\r\nexport const FUI_ACCORDION = new InjectionToken<unknown>('FUI_ACCORDION');\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n signal,\r\n effect,\r\n inject,\r\n booleanAttribute,\r\n WritableSignal,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FUI_ACCORDION, AccordionDisplayMode } from './accordion.types';\r\n\r\nlet nextPanelId = 0;\r\n\r\n/**\r\n * # ExpansionPanel Component\r\n *\r\n * A collapsible panel that can be used standalone or within an `fui-accordion`.\r\n * Supports lazy rendering of content (only rendered after first open).\r\n *\r\n * ## Usage\r\n *\r\n * ### Standalone\r\n * ```html\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Panel Title</span>\r\n * <p>Panel content here</p>\r\n * </fui-expansion-panel>\r\n * ```\r\n *\r\n * ### Inside Accordion\r\n * ```html\r\n * <fui-accordion>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>First</span>\r\n * Content 1\r\n * </fui-expansion-panel>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Second</span>\r\n * Content 2\r\n * </fui-expansion-panel>\r\n * </fui-accordion>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-expansion-panel',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './expansion-panel.component.html',\r\n styleUrls: ['./expansion-panel.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-expansion-panel',\r\n '[class.fui-expansion-panel--expanded]': '_expanded()',\r\n '[class.fui-expansion-panel--disabled]': 'disabled()',\r\n '[class.fui-expansion-panel--animating]': '_animating()',\r\n },\r\n})\r\nexport class FuiExpansionPanelComponent {\r\n // Inputs\r\n readonly expanded = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly hideToggle = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n // Outputs\r\n readonly opened = output();\r\n readonly closed = output();\r\n readonly expandedChange = output<boolean>();\r\n readonly afterExpand = output();\r\n readonly afterCollapse = output();\r\n\r\n // Internal state\r\n readonly _expanded: WritableSignal<boolean> = signal(false);\r\n readonly _animating: WritableSignal<boolean> = signal(false);\r\n readonly _hasBeenOpened: WritableSignal<boolean> = signal(false);\r\n\r\n // ARIA IDs\r\n private readonly _panelId = nextPanelId++;\r\n readonly _headerId = `fui-expansion-panel-header-${this._panelId}`;\r\n readonly _contentId = `fui-expansion-panel-content-${this._panelId}`;\r\n\r\n // Parent accordion (optional)\r\n private readonly _accordion = inject(FUI_ACCORDION, { optional: true }) as {\r\n multi: () => boolean;\r\n displayMode: () => AccordionDisplayMode;\r\n _closeOtherPanels: (panel: FuiExpansionPanelComponent) => void;\r\n } | null;\r\n\r\n private readonly _elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n // Sync expanded input to internal state\r\n effect(() => {\r\n const inputExpanded = this.expanded();\r\n this._expanded.set(inputExpanded);\r\n if (inputExpanded) {\r\n this._hasBeenOpened.set(true);\r\n }\r\n });\r\n }\r\n\r\n /** Toggles the expanded state of the panel. */\r\n toggle(): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n if (this._expanded()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the panel. */\r\n open(): void {\r\n if (this.disabled() || this._expanded()) {\r\n return;\r\n }\r\n\r\n this._hasBeenOpened.set(true);\r\n this._animating.set(true);\r\n this._expanded.set(true);\r\n this.expandedChange.emit(true);\r\n this.opened.emit();\r\n\r\n // Notify parent accordion to close other panels if in single mode\r\n if (this._accordion) {\r\n this._accordion._closeOtherPanels(this);\r\n }\r\n }\r\n\r\n /** Closes the panel. */\r\n close(): void {\r\n if (this.disabled() || !this._expanded()) {\r\n return;\r\n }\r\n\r\n this._animating.set(true);\r\n this._expanded.set(false);\r\n this.expandedChange.emit(false);\r\n this.closed.emit();\r\n }\r\n\r\n /** Called when the body transition ends. */\r\n _onBodyTransitionEnd(event: TransitionEvent): void {\r\n if (event.propertyName === 'max-height') {\r\n this._animating.set(false);\r\n if (this._expanded()) {\r\n this.afterExpand.emit();\r\n } else {\r\n this.afterCollapse.emit();\r\n }\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"fui-expansion-panel__header\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle(); $event.preventDefault()\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"_expanded()\"\r\n [attr.aria-controls]=\"_contentId\"\r\n [attr.id]=\"_headerId\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n>\r\n <div class=\"fui-expansion-panel__header-content\">\r\n <ng-content select=\"[panelTitle]\"></ng-content>\r\n <ng-content select=\"[panelDescription]\"></ng-content>\r\n </div>\r\n @if (!hideToggle()) {\r\n <fui-icon\r\n class=\"fui-expansion-panel__toggle-icon\"\r\n [class.fui-expansion-panel__toggle-icon--expanded]=\"_expanded()\"\r\n name=\"caret-down\"\r\n size=\"sm\"\r\n ></fui-icon>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"fui-expansion-panel__body\"\r\n [attr.id]=\"_contentId\"\r\n [attr.aria-labelledby]=\"_headerId\"\r\n role=\"region\"\r\n [class.fui-expansion-panel__body--expanded]=\"_expanded()\"\r\n (transitionend)=\"_onBodyTransitionEnd($event)\"\r\n>\r\n <div class=\"fui-expansion-panel__body-inner\">\r\n @if (_expanded() || _hasBeenOpened()) {\r\n <ng-content></ng-content>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n contentChildren,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { FuiExpansionPanelComponent } from './expansion-panel.component';\r\nimport { AccordionDisplayMode, FUI_ACCORDION } from './accordion.types';\r\n\r\n/**\r\n * # Accordion Component\r\n *\r\n * Groups multiple `fui-expansion-panel` components.\r\n * In single mode (default), only one panel can be expanded at a time.\r\n * In multi mode, multiple panels can be expanded simultaneously.\r\n *\r\n * ## Usage\r\n *\r\n * ### Single mode (default)\r\n * ```html\r\n * <fui-accordion>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Panel 1</span>\r\n * Content 1\r\n * </fui-expansion-panel>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Panel 2</span>\r\n * Content 2\r\n * </fui-expansion-panel>\r\n * </fui-accordion>\r\n * ```\r\n *\r\n * ### Multi mode\r\n * ```html\r\n * <fui-accordion [multi]=\"true\">\r\n * ...\r\n * </fui-accordion>\r\n * ```\r\n *\r\n * ### Flat display mode\r\n * ```html\r\n * <fui-accordion displayMode=\"flat\">\r\n * ...\r\n * </fui-accordion>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-accordion',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrls: ['./accordion.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-accordion',\r\n '[class.fui-accordion--flat]': 'displayMode() === \"flat\"',\r\n },\r\n providers: [{ provide: FUI_ACCORDION, useExisting: FuiAccordionComponent }],\r\n})\r\nexport class FuiAccordionComponent {\r\n // Inputs\r\n readonly multi = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly displayMode = input<AccordionDisplayMode>('default');\r\n\r\n // Content children\r\n readonly panels = contentChildren(FuiExpansionPanelComponent);\r\n\r\n /** Opens all panels. Only effective in multi mode. */\r\n openAll(): void {\r\n if (!this.multi()) {\r\n return;\r\n }\r\n this.panels().forEach((panel) => {\r\n panel.open();\r\n });\r\n }\r\n\r\n /** Closes all panels. */\r\n closeAll(): void {\r\n this.panels().forEach((panel) => {\r\n panel.close();\r\n });\r\n }\r\n\r\n /** Closes all panels except the specified one. Used internally by panels. */\r\n _closeOtherPanels(openedPanel: FuiExpansionPanelComponent): void {\r\n if (this.multi()) {\r\n return;\r\n }\r\n this.panels().forEach((panel) => {\r\n if (panel !== openedPanel) {\r\n panel.close();\r\n }\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raintonic-formaui-components-accordion.mjs","sources":["../../../lib/components/accordion/accordion.types.ts","../../../lib/components/accordion/expansion-panel.component.ts","../../../lib/components/accordion/expansion-panel.component.html","../../../lib/components/accordion/accordion.component.ts","../../../lib/components/accordion/raintonic-formaui-components-accordion.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport type AccordionDisplayMode = 'default' | 'flat';\r\n\r\nexport interface AccordionExpandedChange {\r\n source: unknown;\r\n expanded: boolean;\r\n}\r\n\r\nexport const FUI_ACCORDION = new InjectionToken<unknown>('FUI_ACCORDION');\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n signal,\r\n effect,\r\n inject,\r\n booleanAttribute,\r\n WritableSignal,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FUI_ACCORDION, AccordionDisplayMode } from './accordion.types';\r\n\r\nlet nextPanelId = 0;\r\n\r\n/**\r\n * # ExpansionPanel Component\r\n *\r\n * A collapsible panel that can be used standalone or within an `fui-accordion`.\r\n * Supports lazy rendering of content (only rendered after first open).\r\n *\r\n * ## Usage\r\n *\r\n * ### Standalone\r\n * ```html\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Panel Title</span>\r\n * <p>Panel content here</p>\r\n * </fui-expansion-panel>\r\n * ```\r\n *\r\n * ### Inside Accordion\r\n * ```html\r\n * <fui-accordion>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>First</span>\r\n * Content 1\r\n * </fui-expansion-panel>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Second</span>\r\n * Content 2\r\n * </fui-expansion-panel>\r\n * </fui-accordion>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-expansion-panel',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './expansion-panel.component.html',\r\n styleUrls: ['./expansion-panel.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-expansion-panel',\r\n '[class.fui-expansion-panel--expanded]': '_expanded()',\r\n '[class.fui-expansion-panel--disabled]': 'disabled()',\r\n '[class.fui-expansion-panel--animating]': '_animating()',\r\n },\r\n})\r\nexport class FuiExpansionPanelComponent {\r\n // Inputs\r\n readonly expanded = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly hideToggle = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n // Outputs\r\n readonly opened = output();\r\n readonly closed = output();\r\n readonly expandedChange = output<boolean>();\r\n readonly afterExpand = output();\r\n readonly afterCollapse = output();\r\n\r\n // Internal state\r\n readonly _expanded: WritableSignal<boolean> = signal(false);\r\n readonly _animating: WritableSignal<boolean> = signal(false);\r\n readonly _hasBeenOpened: WritableSignal<boolean> = signal(false);\r\n\r\n // ARIA IDs\r\n private readonly _panelId = nextPanelId++;\r\n readonly _headerId = `fui-expansion-panel-header-${this._panelId}`;\r\n readonly _contentId = `fui-expansion-panel-content-${this._panelId}`;\r\n\r\n // Parent accordion (optional)\r\n private readonly _accordion = inject(FUI_ACCORDION, { optional: true }) as {\r\n multi: () => boolean;\r\n displayMode: () => AccordionDisplayMode;\r\n _closeOtherPanels: (panel: FuiExpansionPanelComponent) => void;\r\n } | null;\r\n\r\n private readonly _elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n // Sync expanded input to internal state\r\n effect(() => {\r\n const inputExpanded = this.expanded();\r\n this._expanded.set(inputExpanded);\r\n if (inputExpanded) {\r\n this._hasBeenOpened.set(true);\r\n }\r\n });\r\n }\r\n\r\n /** Toggles the expanded state of the panel. */\r\n toggle(): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n if (this._expanded()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the panel. */\r\n open(): void {\r\n if (this.disabled() || this._expanded()) {\r\n return;\r\n }\r\n\r\n this._hasBeenOpened.set(true);\r\n this._animating.set(true);\r\n this._expanded.set(true);\r\n this.expandedChange.emit(true);\r\n this.opened.emit();\r\n\r\n // Notify parent accordion to close other panels if in single mode\r\n if (this._accordion) {\r\n this._accordion._closeOtherPanels(this);\r\n }\r\n }\r\n\r\n /** Closes the panel. */\r\n close(): void {\r\n if (this.disabled() || !this._expanded()) {\r\n return;\r\n }\r\n\r\n this._animating.set(true);\r\n this._expanded.set(false);\r\n this.expandedChange.emit(false);\r\n this.closed.emit();\r\n }\r\n\r\n /** Called when the body transition ends. */\r\n _onBodyTransitionEnd(event: TransitionEvent): void {\r\n // The body now animates `grid-template-rows`. Keep `max-height` accepted\r\n // as well so any test or call site still pinned to the old property name\r\n // continues to work without flagging spurious failures.\r\n if (event.propertyName === 'grid-template-rows' || event.propertyName === 'max-height') {\r\n this._animating.set(false);\r\n if (this._expanded()) {\r\n this.afterExpand.emit();\r\n } else {\r\n this.afterCollapse.emit();\r\n }\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"fui-expansion-panel__header\"\r\n (click)=\"toggle()\"\r\n (keydown.enter)=\"toggle()\"\r\n (keydown.space)=\"toggle(); $event.preventDefault()\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"_expanded()\"\r\n [attr.aria-controls]=\"_contentId\"\r\n [attr.id]=\"_headerId\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n>\r\n <span class=\"fui-expansion-panel__leading-icon\">\r\n <ng-content select=\"[panelIcon]\"></ng-content>\r\n </span>\r\n <div class=\"fui-expansion-panel__header-content\">\r\n <ng-content select=\"[panelTitle]\"></ng-content>\r\n <ng-content select=\"[panelDescription]\"></ng-content>\r\n </div>\r\n @if (!hideToggle()) {\r\n <fui-icon\r\n class=\"fui-expansion-panel__toggle-icon\"\r\n [class.fui-expansion-panel__toggle-icon--expanded]=\"_expanded()\"\r\n name=\"caret-down\"\r\n size=\"sm\"\r\n ></fui-icon>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"fui-expansion-panel__body\"\r\n [attr.id]=\"_contentId\"\r\n [attr.aria-labelledby]=\"_headerId\"\r\n role=\"region\"\r\n [class.fui-expansion-panel__body--expanded]=\"_expanded()\"\r\n (transitionend)=\"_onBodyTransitionEnd($event)\"\r\n>\r\n <div class=\"fui-expansion-panel__body-inner\">\r\n @if (_expanded() || _hasBeenOpened()) {\r\n <ng-content></ng-content>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n contentChildren,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { FuiExpansionPanelComponent } from './expansion-panel.component';\r\nimport { AccordionDisplayMode, FUI_ACCORDION } from './accordion.types';\r\n\r\n/**\r\n * # Accordion Component\r\n *\r\n * Groups multiple `fui-expansion-panel` components.\r\n * In single mode (default), only one panel can be expanded at a time.\r\n * In multi mode, multiple panels can be expanded simultaneously.\r\n *\r\n * ## Usage\r\n *\r\n * ### Single mode (default)\r\n * ```html\r\n * <fui-accordion>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Panel 1</span>\r\n * Content 1\r\n * </fui-expansion-panel>\r\n * <fui-expansion-panel>\r\n * <span panelTitle>Panel 2</span>\r\n * Content 2\r\n * </fui-expansion-panel>\r\n * </fui-accordion>\r\n * ```\r\n *\r\n * ### Multi mode\r\n * ```html\r\n * <fui-accordion [multi]=\"true\">\r\n * ...\r\n * </fui-accordion>\r\n * ```\r\n *\r\n * ### Flat display mode\r\n * ```html\r\n * <fui-accordion displayMode=\"flat\">\r\n * ...\r\n * </fui-accordion>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-accordion',\r\n standalone: true,\r\n template: '<ng-content></ng-content>',\r\n styleUrls: ['./accordion.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-accordion',\r\n '[class.fui-accordion--flat]': 'displayMode() === \"flat\"',\r\n },\r\n providers: [{ provide: FUI_ACCORDION, useExisting: FuiAccordionComponent }],\r\n})\r\nexport class FuiAccordionComponent {\r\n // Inputs\r\n readonly multi = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly displayMode = input<AccordionDisplayMode>('default');\r\n\r\n // Content children\r\n readonly panels = contentChildren(FuiExpansionPanelComponent);\r\n\r\n /** Opens all panels. Only effective in multi mode. */\r\n openAll(): void {\r\n if (!this.multi()) {\r\n return;\r\n }\r\n this.panels().forEach((panel) => {\r\n panel.open();\r\n });\r\n }\r\n\r\n /** Closes all panels. */\r\n closeAll(): void {\r\n this.panels().forEach((panel) => {\r\n panel.close();\r\n });\r\n }\r\n\r\n /** Closes all panels except the specified one. Used internally by panels. */\r\n _closeOtherPanels(openedPanel: FuiExpansionPanelComponent): void {\r\n if (this.multi()) {\r\n return;\r\n }\r\n this.panels().forEach((panel) => {\r\n if (panel !== openedPanel) {\r\n panel.close();\r\n }\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MASa,aAAa,GAAG,IAAI,cAAc,CAAU,eAAe;;ACOxE,IAAI,WAAW,GAAG,CAAC;AAEnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MAgBU,0BAA0B,CAAA;;IAE5B,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC1E,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC1E,UAAU,GAAG,KAAK,CAAmB,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG5E,MAAM,GAAG,MAAM,EAAE;IACjB,MAAM,GAAG,MAAM,EAAE;IACjB,cAAc,GAAG,MAAM,EAAW;IAClC,WAAW,GAAG,MAAM,EAAE;IACtB,aAAa,GAAG,MAAM,EAAE;;AAGxB,IAAA,SAAS,GAA4B,MAAM,CAAC,KAAK,gFAAC;AAClD,IAAA,UAAU,GAA4B,MAAM,CAAC,KAAK,iFAAC;AACnD,IAAA,cAAc,GAA4B,MAAM,CAAC,KAAK,qFAAC;;IAG/C,QAAQ,GAAG,WAAW,EAAE;AAChC,IAAA,SAAS,GAAG,CAAA,2BAAA,EAA8B,IAAI,CAAC,QAAQ,EAAE;AACzD,IAAA,UAAU,GAAG,CAAA,4BAAA,EAA+B,IAAI,CAAC,QAAQ,EAAE;;IAGnD,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAI9D;AAES,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEjD,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC;YACjC,IAAI,aAAa,EAAE;AACjB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;IACJ;;IAGA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;;IAGA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACvC;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;AAGlB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACzC;IACF;;IAGA,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACxC;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;;AAGA,IAAA,oBAAoB,CAAC,KAAsB,EAAA;;;;AAIzC,QAAA,IAAI,KAAK,CAAC,YAAY,KAAK,oBAAoB,IAAI,KAAK,CAAC,YAAY,KAAK,YAAY,EAAE;AACtF,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YACzB;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAC3B;QACF;IACF;uGAlGW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qCAAA,EAAA,aAAA,EAAA,qCAAA,EAAA,YAAA,EAAA,sCAAA,EAAA,cAAA,EAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/DvC,63CA2CA,EAAA,MAAA,EAAA,CAAA,y4KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDQY,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAYf,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAftC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,CAAC,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,qBAAqB;AAC5B,wBAAA,uCAAuC,EAAE,aAAa;AACtD,wBAAA,uCAAuC,EAAE,YAAY;AACrD,wBAAA,wCAAwC,EAAE,cAAc;AACzD,qBAAA,EAAA,QAAA,EAAA,63CAAA,EAAA,MAAA,EAAA,CAAA,y4KAAA,CAAA,EAAA;;;AElDH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCG;MAcU,qBAAqB,CAAA;;IAEvB,KAAK,GAAG,KAAK,CAAmB,KAAK,6EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACvE,IAAA,WAAW,GAAG,KAAK,CAAuB,SAAS,kFAAC;;AAGpD,IAAA,MAAM,GAAG,eAAe,CAAC,0BAA0B,6EAAC;;IAG7D,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;YACjB;QACF;QACA,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAC9B,KAAK,CAAC,IAAI,EAAE;AACd,QAAA,CAAC,CAAC;IACJ;;IAGA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAC9B,KAAK,CAAC,KAAK,EAAE;AACf,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,iBAAiB,CAAC,WAAuC,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;YAChB;QACF;QACA,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC9B,YAAA,IAAI,KAAK,KAAK,WAAW,EAAE;gBACzB,KAAK,CAAC,KAAK,EAAE;YACf;AACF,QAAA,CAAC,CAAC;IACJ;uGAnCW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,4BAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,SAAA,EAFrB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAQzC,0BAA0B,6CAhBlD,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yMAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAU1B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,QAAA,EACN,2BAA2B,EAAA,eAAA,EAEpB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,eAAe;AACtB,wBAAA,6BAA6B,EAAE,0BAA0B;qBAC1D,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAA,qBAAuB,EAAE,CAAC,EAAA,MAAA,EAAA,CAAA,yMAAA,CAAA,EAAA;8RAQzC,0BAA0B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACnE9D;;AAEG;;;;"}
@@ -153,6 +153,20 @@ class FuiAlertComponent {
153
153
  };
154
154
  return variantIcons[this.variant()];
155
155
  }, ...(ngDevMode ? [{ debugName: "computedIcon" }] : /* istanbul ignore next */ []));
156
+ /**
157
+ * Progressbar color matching the current alert variant.
158
+ */
159
+ progressColor = computed(() => {
160
+ const variantToColor = {
161
+ primary: 'primary',
162
+ success: 'success',
163
+ info: 'info',
164
+ warning: 'warning',
165
+ error: 'warn',
166
+ generic: 'accent',
167
+ };
168
+ return variantToColor[this.variant()];
169
+ }, ...(ngDevMode ? [{ debugName: "progressColor" }] : /* istanbul ignore next */ []));
156
170
  /**
157
171
  * Handle close button click
158
172
  */
@@ -160,7 +174,7 @@ class FuiAlertComponent {
160
174
  this.closed.emit();
161
175
  }
162
176
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
163
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiAlertComponent, isStandalone: true, selector: "fui-alert", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, progress: { classPropertyName: "progress", publicName: "progress", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, closeable: { classPropertyName: "closeable", publicName: "closeable", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { properties: { "class": "computedClasses()", "attr.role": "computedRole()", "attr.aria-live": "computedAriaLive()", "attr.aria-atomic": "\"true\"" } }, ngImport: i0, template: "@if (progress() !== 0) {\r\n <fui-progressbar\r\n [mode]=\"progress() === -1 ? 'indeterminate' : 'determinate'\"\r\n [value]=\"progress() > 0 ? progress() : undefined\"\r\n [color]=\"\r\n variant() === 'success'\r\n ? 'success'\r\n : variant() === 'warning'\r\n ? 'warn'\r\n : variant() === 'error'\r\n ? 'warn'\r\n : 'primary'\r\n \"\r\n ></fui-progressbar>\r\n}\r\n\r\n<div class=\"fui-alert__container\">\r\n <fui-icon class=\"fui-alert__icon\" weight=\"fill\" [name]=\"computedIcon()\" size=\"md\" />\r\n\r\n <div class=\"fui-alert__content\">\r\n <div class=\"fui-alert__title fui-text-sm fui-font-medium\">{{ title() }}</div>\r\n @if (description()) {\r\n <div class=\"fui-alert__description fui-text-xs\">{{ description() }}</div>\r\n }\r\n </div>\r\n\r\n @if (closeable()) {\r\n <button type=\"button\" class=\"fui-alert__close\" (click)=\"onClose()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\" />\r\n </button>\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-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}fui-progressbar{position:absolute;top:0;left:0}:host.fui-alert{--fui-alert-bg: transparent;--fui-alert-color: inherit;--fui-alert-border-color: transparent;--fui-alert-border-radius: var(--fui-border-radius-sm);--fui-alert-padding: var(--fui-spacing-04);--fui-alert-gap: var(--fui-spacing-04);--fui-alert-close-padding: var(--fui-spacing-02);contain:layout style;position:relative;overflow:hidden;display:flex;font-family:var(--fui-font-family-sans);background-color:var(--fui-alert-bg);color:var(--fui-alert-color);border:1px solid var(--fui-alert-border-color);border-radius:var(--fui-alert-border-radius);padding:var(--fui-alert-padding);transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}:host.fui-alert .fui-alert__container{display:flex;align-items:flex-start;gap:var(--fui-alert-gap);width:100%}:host.fui-alert .fui-alert__content{flex:1;min-width:0}:host.fui-alert .fui-alert__title{margin:0}:host.fui-alert .fui-alert__close{display:flex;align-items:center;justify-content:center;flex-shrink:0;background:transparent;border:none;padding:var(--fui-spacing-02);margin:-2px -2px 0 0;cursor:pointer;border-radius:var(--fui-border-radius-sm);transition:all var(--fui-duration-fast-01) var(--fui-ease-standard) 0ms}:host.fui-alert .fui-alert__close:hover{background-color:var(--fui-black-10)}:host.fui-alert .fui-alert__close:focus-visible{outline:2px solid currentColor;outline-offset:2px}:host.fui-alert .fui-alert__close:active{transform:scale(.95)}:host.fui-alert--primary{--fui-alert-bg: var(--fui-primary-20);--fui-alert-color: var(--fui-primary-70)}:host.fui-alert--primary .fui-alert__icon{color:var(--fui-primary-70)}:host.fui-alert--success{--fui-alert-bg: var(--fui-success-20);--fui-alert-color: var(--fui-success-100)}:host.fui-alert--success .fui-alert__icon{color:var(--fui-success-100)}:host.fui-alert--info{--fui-alert-bg: var(--fui-info-10);--fui-alert-color: var(--fui-info-100)}:host.fui-alert--info .fui-alert__icon{color:var(--fui-info-100)}:host.fui-alert--warning{--fui-alert-bg: var(--fui-warning-20);--fui-alert-color: var(--fui-warning-100)}:host.fui-alert--warning .fui-alert__icon{color:var(--fui-warning-100)}:host.fui-alert--error{--fui-alert-bg: var(--fui-danger-20);--fui-alert-color: var(--fui-danger-100)}:host.fui-alert--error .fui-alert__icon{color:var(--fui-danger-100)}:host.fui-alert--generic{--fui-alert-bg: var(--fui-secondary-20);--fui-alert-color: var(--fui-text-primary)}:host.fui-alert--generic .fui-alert__icon{color:var(--fui-primary-70)}@media(prefers-reduced-motion:reduce){:host.fui-alert{transition:none}:host.fui-alert .fui-alert__close{transition:none}}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "component", type: FuiProgressbarComponent, selector: "fui-progressbar", inputs: ["mode", "value", "bufferValue", "color", "aria-label", "aria-labelledby"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
177
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiAlertComponent, isStandalone: true, selector: "fui-alert", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, progress: { classPropertyName: "progress", publicName: "progress", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, closeable: { classPropertyName: "closeable", publicName: "closeable", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { properties: { "class": "computedClasses()", "attr.role": "computedRole()", "attr.aria-live": "computedAriaLive()", "attr.aria-atomic": "\"true\"" } }, ngImport: i0, template: "@if (progress() !== 0) {\r\n <fui-progressbar\r\n [mode]=\"progress() === -1 ? 'indeterminate' : 'determinate'\"\r\n [value]=\"progress() > 0 ? progress() : undefined\"\r\n [color]=\"progressColor()\"\r\n ></fui-progressbar>\r\n}\r\n\r\n<div class=\"fui-alert__container\">\r\n <fui-icon class=\"fui-alert__icon\" weight=\"fill\" [name]=\"computedIcon()\" size=\"md\" />\r\n\r\n <div class=\"fui-alert__content\">\r\n <div class=\"fui-alert__title fui-text-sm fui-font-medium\">{{ title() }}</div>\r\n @if (description()) {\r\n <div class=\"fui-alert__description fui-text-xs\">{{ description() }}</div>\r\n }\r\n <ng-content />\r\n </div>\r\n\r\n @if (closeable()) {\r\n <button type=\"button\" class=\"fui-alert__close\" (click)=\"onClose()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\" />\r\n </button>\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-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay: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-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}fui-progressbar{position:absolute;top:0;left:0}:host.fui-alert{--fui-alert-bg: transparent;--fui-alert-color: inherit;--fui-alert-border-color: transparent;--fui-alert-border-radius: var(--fui-radius-sm);--fui-alert-padding: var(--fui-spacing-6);--fui-alert-gap: var(--fui-spacing-6);--fui-alert-close-padding: var(--fui-spacing-2);contain:layout style;position:relative;overflow:hidden;display:flex;font-family:var(--fui-font-sans);background-color:var(--fui-alert-bg);color:var(--fui-alert-color);border:1px solid var(--fui-alert-border-color);border-radius:var(--fui-alert-border-radius);padding:var(--fui-alert-padding);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-alert .fui-alert__container{display:flex;align-items:flex-start;gap:var(--fui-alert-gap);width:100%}:host.fui-alert .fui-alert__content{flex:1;min-width:0;font-size:var(--fui-text-sm)}:host.fui-alert .fui-alert__title{margin:0;font-weight:var(--fui-weight-medium)}:host.fui-alert .fui-alert__close{display:flex;align-items:center;justify-content:center;flex-shrink:0;background:transparent;border:none;padding:var(--fui-spacing-2);margin:-2px -2px 0 0;cursor:pointer;border-radius:var(--fui-radius-sm);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-alert .fui-alert__close:hover{background-color:#0000001a}:host.fui-alert .fui-alert__close:focus-visible{outline:2px solid currentColor;outline-offset:2px}:host.fui-alert .fui-alert__close:active{transform:scale(.95)}:host.fui-alert--primary{--fui-alert-bg: var(--fui-primary-20);--fui-alert-color: var(--fui-primary-70)}:host.fui-alert--primary .fui-alert__icon{color:var(--fui-primary-70)}:host.fui-alert--success{--fui-alert-bg: var(--fui-success-20);--fui-alert-color: var(--fui-success-100)}:host.fui-alert--success .fui-alert__icon{color:var(--fui-success-100)}:host.fui-alert--info{--fui-alert-bg: var(--fui-info-10);--fui-alert-color: var(--fui-info-100)}:host.fui-alert--info .fui-alert__icon{color:var(--fui-info-100)}:host.fui-alert--warning{--fui-alert-bg: var(--fui-warning-20);--fui-alert-color: var(--fui-warning-100)}:host.fui-alert--warning .fui-alert__icon{color:var(--fui-warning-100)}:host.fui-alert--error{--fui-alert-bg: var(--fui-error-20);--fui-alert-color: var(--fui-error-100)}:host.fui-alert--error .fui-alert__icon{color:var(--fui-error-100)}:host.fui-alert--generic{--fui-alert-bg: var(--fui-neutral-20);--fui-alert-color: var(--fui-text-primary)}:host.fui-alert--generic .fui-alert__icon{color:var(--fui-primary-70)}@media(prefers-reduced-motion:reduce){:host.fui-alert{transition:none}:host.fui-alert .fui-alert__close{transition:none}}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "component", type: FuiProgressbarComponent, selector: "fui-progressbar", inputs: ["mode", "value", "bufferValue", "color", "aria-label", "aria-labelledby"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
164
178
  }
165
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiAlertComponent, decorators: [{
166
180
  type: Component,
@@ -169,7 +183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
169
183
  '[attr.role]': 'computedRole()',
170
184
  '[attr.aria-live]': 'computedAriaLive()',
171
185
  '[attr.aria-atomic]': '"true"',
172
- }, template: "@if (progress() !== 0) {\r\n <fui-progressbar\r\n [mode]=\"progress() === -1 ? 'indeterminate' : 'determinate'\"\r\n [value]=\"progress() > 0 ? progress() : undefined\"\r\n [color]=\"\r\n variant() === 'success'\r\n ? 'success'\r\n : variant() === 'warning'\r\n ? 'warn'\r\n : variant() === 'error'\r\n ? 'warn'\r\n : 'primary'\r\n \"\r\n ></fui-progressbar>\r\n}\r\n\r\n<div class=\"fui-alert__container\">\r\n <fui-icon class=\"fui-alert__icon\" weight=\"fill\" [name]=\"computedIcon()\" size=\"md\" />\r\n\r\n <div class=\"fui-alert__content\">\r\n <div class=\"fui-alert__title fui-text-sm fui-font-medium\">{{ title() }}</div>\r\n @if (description()) {\r\n <div class=\"fui-alert__description fui-text-xs\">{{ description() }}</div>\r\n }\r\n </div>\r\n\r\n @if (closeable()) {\r\n <button type=\"button\" class=\"fui-alert__close\" (click)=\"onClose()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\" />\r\n </button>\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-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}fui-progressbar{position:absolute;top:0;left:0}:host.fui-alert{--fui-alert-bg: transparent;--fui-alert-color: inherit;--fui-alert-border-color: transparent;--fui-alert-border-radius: var(--fui-border-radius-sm);--fui-alert-padding: var(--fui-spacing-04);--fui-alert-gap: var(--fui-spacing-04);--fui-alert-close-padding: var(--fui-spacing-02);contain:layout style;position:relative;overflow:hidden;display:flex;font-family:var(--fui-font-family-sans);background-color:var(--fui-alert-bg);color:var(--fui-alert-color);border:1px solid var(--fui-alert-border-color);border-radius:var(--fui-alert-border-radius);padding:var(--fui-alert-padding);transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}:host.fui-alert .fui-alert__container{display:flex;align-items:flex-start;gap:var(--fui-alert-gap);width:100%}:host.fui-alert .fui-alert__content{flex:1;min-width:0}:host.fui-alert .fui-alert__title{margin:0}:host.fui-alert .fui-alert__close{display:flex;align-items:center;justify-content:center;flex-shrink:0;background:transparent;border:none;padding:var(--fui-spacing-02);margin:-2px -2px 0 0;cursor:pointer;border-radius:var(--fui-border-radius-sm);transition:all var(--fui-duration-fast-01) var(--fui-ease-standard) 0ms}:host.fui-alert .fui-alert__close:hover{background-color:var(--fui-black-10)}:host.fui-alert .fui-alert__close:focus-visible{outline:2px solid currentColor;outline-offset:2px}:host.fui-alert .fui-alert__close:active{transform:scale(.95)}:host.fui-alert--primary{--fui-alert-bg: var(--fui-primary-20);--fui-alert-color: var(--fui-primary-70)}:host.fui-alert--primary .fui-alert__icon{color:var(--fui-primary-70)}:host.fui-alert--success{--fui-alert-bg: var(--fui-success-20);--fui-alert-color: var(--fui-success-100)}:host.fui-alert--success .fui-alert__icon{color:var(--fui-success-100)}:host.fui-alert--info{--fui-alert-bg: var(--fui-info-10);--fui-alert-color: var(--fui-info-100)}:host.fui-alert--info .fui-alert__icon{color:var(--fui-info-100)}:host.fui-alert--warning{--fui-alert-bg: var(--fui-warning-20);--fui-alert-color: var(--fui-warning-100)}:host.fui-alert--warning .fui-alert__icon{color:var(--fui-warning-100)}:host.fui-alert--error{--fui-alert-bg: var(--fui-danger-20);--fui-alert-color: var(--fui-danger-100)}:host.fui-alert--error .fui-alert__icon{color:var(--fui-danger-100)}:host.fui-alert--generic{--fui-alert-bg: var(--fui-secondary-20);--fui-alert-color: var(--fui-text-primary)}:host.fui-alert--generic .fui-alert__icon{color:var(--fui-primary-70)}@media(prefers-reduced-motion:reduce){:host.fui-alert{transition:none}:host.fui-alert .fui-alert__close{transition:none}}\n"] }]
186
+ }, template: "@if (progress() !== 0) {\r\n <fui-progressbar\r\n [mode]=\"progress() === -1 ? 'indeterminate' : 'determinate'\"\r\n [value]=\"progress() > 0 ? progress() : undefined\"\r\n [color]=\"progressColor()\"\r\n ></fui-progressbar>\r\n}\r\n\r\n<div class=\"fui-alert__container\">\r\n <fui-icon class=\"fui-alert__icon\" weight=\"fill\" [name]=\"computedIcon()\" size=\"md\" />\r\n\r\n <div class=\"fui-alert__content\">\r\n <div class=\"fui-alert__title fui-text-sm fui-font-medium\">{{ title() }}</div>\r\n @if (description()) {\r\n <div class=\"fui-alert__description fui-text-xs\">{{ description() }}</div>\r\n }\r\n <ng-content />\r\n </div>\r\n\r\n @if (closeable()) {\r\n <button type=\"button\" class=\"fui-alert__close\" (click)=\"onClose()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\" />\r\n </button>\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-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay: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-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}fui-progressbar{position:absolute;top:0;left:0}:host.fui-alert{--fui-alert-bg: transparent;--fui-alert-color: inherit;--fui-alert-border-color: transparent;--fui-alert-border-radius: var(--fui-radius-sm);--fui-alert-padding: var(--fui-spacing-6);--fui-alert-gap: var(--fui-spacing-6);--fui-alert-close-padding: var(--fui-spacing-2);contain:layout style;position:relative;overflow:hidden;display:flex;font-family:var(--fui-font-sans);background-color:var(--fui-alert-bg);color:var(--fui-alert-color);border:1px solid var(--fui-alert-border-color);border-radius:var(--fui-alert-border-radius);padding:var(--fui-alert-padding);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-alert .fui-alert__container{display:flex;align-items:flex-start;gap:var(--fui-alert-gap);width:100%}:host.fui-alert .fui-alert__content{flex:1;min-width:0;font-size:var(--fui-text-sm)}:host.fui-alert .fui-alert__title{margin:0;font-weight:var(--fui-weight-medium)}:host.fui-alert .fui-alert__close{display:flex;align-items:center;justify-content:center;flex-shrink:0;background:transparent;border:none;padding:var(--fui-spacing-2);margin:-2px -2px 0 0;cursor:pointer;border-radius:var(--fui-radius-sm);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-alert .fui-alert__close:hover{background-color:#0000001a}:host.fui-alert .fui-alert__close:focus-visible{outline:2px solid currentColor;outline-offset:2px}:host.fui-alert .fui-alert__close:active{transform:scale(.95)}:host.fui-alert--primary{--fui-alert-bg: var(--fui-primary-20);--fui-alert-color: var(--fui-primary-70)}:host.fui-alert--primary .fui-alert__icon{color:var(--fui-primary-70)}:host.fui-alert--success{--fui-alert-bg: var(--fui-success-20);--fui-alert-color: var(--fui-success-100)}:host.fui-alert--success .fui-alert__icon{color:var(--fui-success-100)}:host.fui-alert--info{--fui-alert-bg: var(--fui-info-10);--fui-alert-color: var(--fui-info-100)}:host.fui-alert--info .fui-alert__icon{color:var(--fui-info-100)}:host.fui-alert--warning{--fui-alert-bg: var(--fui-warning-20);--fui-alert-color: var(--fui-warning-100)}:host.fui-alert--warning .fui-alert__icon{color:var(--fui-warning-100)}:host.fui-alert--error{--fui-alert-bg: var(--fui-error-20);--fui-alert-color: var(--fui-error-100)}:host.fui-alert--error .fui-alert__icon{color:var(--fui-error-100)}:host.fui-alert--generic{--fui-alert-bg: var(--fui-neutral-20);--fui-alert-color: var(--fui-text-primary)}:host.fui-alert--generic .fui-alert__icon{color:var(--fui-primary-70)}@media(prefers-reduced-motion:reduce){:host.fui-alert{transition:none}:host.fui-alert .fui-alert__close{transition:none}}\n"] }]
173
187
  }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], progress: [{ type: i0.Input, args: [{ isSignal: true, alias: "progress", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], closeable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeable", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
174
188
 
175
189
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-alert.mjs","sources":["../../../lib/components/alert/alert.types.ts","../../../lib/components/alert/alert.intl.ts","../../../lib/components/alert/alert.component.ts","../../../lib/components/alert/alert.component.html","../../../lib/components/alert/raintonic-formaui-components-alert.ts"],"sourcesContent":["export type FuiAlertVariant = 'primary' | 'success' | 'info' | 'warning' | 'error' | 'generic';\r\n\r\nexport const FUI_ALERT_VARIANTS: readonly FuiAlertVariant[] = [\r\n 'primary',\r\n 'success',\r\n 'info',\r\n 'warning',\r\n 'error',\r\n 'generic',\r\n] as const;\r\n\r\n/**\r\n * Configuration for notification display\r\n */\r\nexport interface FuiNotificationConfig {\r\n /**\r\n * Notification variant (determines color scheme and icon)\r\n */\r\n variant: FuiAlertVariant;\r\n\r\n /**\r\n * Title of the notification\r\n */\r\n title: string;\r\n\r\n /**\r\n * Description/message of the notification\r\n */\r\n description?: string;\r\n\r\n /**\r\n * Duration in milliseconds before auto-dismiss (default: 5000)\r\n * Set to 0 to disable auto-dismiss\r\n */\r\n duration?: number;\r\n\r\n /**\r\n * Whether to show the close button (default: true)\r\n */\r\n closeable?: boolean;\r\n\r\n /**\r\n * Custom icon name (overrides default variant icon)\r\n */\r\n icon?: string;\r\n}\r\n\r\n/**\r\n * Position for notification display\r\n */\r\nexport type FuiNotificationPosition =\r\n | 'top-left'\r\n | 'top-center'\r\n | 'top-right'\r\n | 'bottom-left'\r\n | 'bottom-center'\r\n | 'bottom-right';\r\n\r\nexport const FUI_NOTIFICATION_POSITIONS: readonly FuiNotificationPosition[] = [\r\n 'top-left',\r\n 'top-center',\r\n 'top-right',\r\n 'bottom-left',\r\n 'bottom-center',\r\n 'bottom-right',\r\n] as const;\r\n","import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiAlertIntl extends FuiIntlBase {\r\n closeAriaLabel = 'Close alert';\r\n}\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, inject, input, output, Signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiAlertVariant, FUI_ALERT_VARIANTS } from './alert.types';\r\nimport { FuiProgressbarComponent } from '@raintonic/formaui/components/progressbar';\r\nimport { FuiAlertIntl } from './alert.intl';\r\n\r\n/**\r\n * # FuiAlertComponent\r\n *\r\n * A flexible alert component for displaying informational messages, warnings, errors, and success notifications.\r\n * Can be used inline in pages or as part of the notification system.\r\n *\r\n * ## Features\r\n * - Multiple variants: primary, success, info, warning, error, generic\r\n * - Title and description support\r\n * - Optional close button\r\n * - Custom or default icons per variant\r\n * - Accessible with ARIA attributes\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Alert\r\n * ```html\r\n * <fui-alert\r\n * variant=\"success\"\r\n * title=\"Success!\"\r\n * description=\"Your changes have been saved.\"\r\n * ></fui-alert>\r\n * ```\r\n *\r\n * ### Closeable Alert\r\n * ```html\r\n * <fui-alert\r\n * variant=\"warning\"\r\n * title=\"Warning\"\r\n * description=\"Please review before continuing.\"\r\n * [closeable]=\"true\"\r\n * (closed)=\"onAlertClosed()\"\r\n * ></fui-alert>\r\n * ```\r\n *\r\n * ### Custom Icon\r\n * ```html\r\n * <fui-alert\r\n * variant=\"info\"\r\n * title=\"Custom Icon\"\r\n * icon=\"custom-icon-name\"\r\n * ></fui-alert>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-alert',\r\n standalone: true,\r\n imports: [FuiIconComponent, FuiProgressbarComponent],\r\n templateUrl: './alert.component.html',\r\n styleUrls: ['./alert.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[attr.role]': 'computedRole()',\r\n '[attr.aria-live]': 'computedAriaLive()',\r\n '[attr.aria-atomic]': '\"true\"',\r\n },\r\n})\r\nexport class FuiAlertComponent {\r\n readonly intl = inject(FuiAlertIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n constructor() {\r\n this.intl.changes\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(() => { this._cdr.markForCheck(); });\r\n }\r\n\r\n /**\r\n * Alert variant (determines color scheme and default icon)\r\n */\r\n readonly variant = input<FuiAlertVariant, FuiAlertVariant | string>('info', {\r\n transform: (v) => ((FUI_ALERT_VARIANTS as readonly string[]).includes(v) ? (v as FuiAlertVariant) : 'info'),\r\n });\r\n\r\n /**\r\n * Alert title (required)\r\n */\r\n readonly title = input.required<string>();\r\n\r\n /**\r\n * Progress (optional)\r\n * 0 = turned off\r\n * -1 = indeterminate\r\n */\r\n readonly progress = input(0);\r\n\r\n /**\r\n * Alert description (optional)\r\n */\r\n readonly description = input<string | null>(null);\r\n\r\n /**\r\n * Whether to show the close button\r\n */\r\n readonly closeable = input(false);\r\n\r\n /**\r\n * Custom icon name (overrides default variant icon)\r\n */\r\n readonly icon = input<string | null>(null);\r\n\r\n /**\r\n * Emits when the close button is clicked\r\n */\r\n readonly closed = output();\r\n\r\n /**\r\n * Computed CSS classes for the alert\r\n */\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const classes: string[] = ['fui-alert', `fui-alert--${this.variant()}`];\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /**\r\n * Computed ARIA role: \"alert\" for error/warning, \"status\" for info/success/primary/generic\r\n */\r\n readonly computedRole: Signal<string> = computed(() => {\r\n const v = this.variant();\r\n return v === 'error' || v === 'warning' ? 'alert' : 'status';\r\n });\r\n\r\n /**\r\n * Computed aria-live: \"assertive\" for errors, \"polite\" for everything else\r\n */\r\n readonly computedAriaLive: Signal<string> = computed(() => {\r\n return this.variant() === 'error' ? 'assertive' : 'polite';\r\n });\r\n\r\n /**\r\n * Computed icon name based on variant or custom icon\r\n */\r\n readonly computedIcon: Signal<string> = computed(() => {\r\n const icon = this.icon();\r\n if (icon) {\r\n return icon;\r\n }\r\n\r\n // Default icons for each variant\r\n const variantIcons: Record<FuiAlertVariant, string> = {\r\n primary: 'info',\r\n success: 'check-circle',\r\n info: 'info',\r\n warning: 'warning-diamond',\r\n error: 'smiley-sad',\r\n generic: 'seal-warning',\r\n };\r\n\r\n return variantIcons[this.variant()];\r\n });\r\n\r\n /**\r\n * Handle close button click\r\n */\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","@if (progress() !== 0) {\r\n <fui-progressbar\r\n [mode]=\"progress() === -1 ? 'indeterminate' : 'determinate'\"\r\n [value]=\"progress() > 0 ? progress() : undefined\"\r\n [color]=\"\r\n variant() === 'success'\r\n ? 'success'\r\n : variant() === 'warning'\r\n ? 'warn'\r\n : variant() === 'error'\r\n ? 'warn'\r\n : 'primary'\r\n \"\r\n ></fui-progressbar>\r\n}\r\n\r\n<div class=\"fui-alert__container\">\r\n <fui-icon class=\"fui-alert__icon\" weight=\"fill\" [name]=\"computedIcon()\" size=\"md\" />\r\n\r\n <div class=\"fui-alert__content\">\r\n <div class=\"fui-alert__title fui-text-sm fui-font-medium\">{{ title() }}</div>\r\n @if (description()) {\r\n <div class=\"fui-alert__description fui-text-xs\">{{ description() }}</div>\r\n }\r\n </div>\r\n\r\n @if (closeable()) {\r\n <button type=\"button\" class=\"fui-alert__close\" (click)=\"onClose()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\" />\r\n </button>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAEO,MAAM,kBAAkB,GAA+B;IAC5D,SAAS;IACT,SAAS;IACT,MAAM;IACN,SAAS;IACT,OAAO;IACP,SAAS;;AAkDJ,MAAM,0BAA0B,GAAuC;IAC5E,UAAU;IACV,YAAY;IACZ,WAAW;IACX,aAAa;IACb,eAAe;IACf,cAAc;;;AC5DV,MAAO,YAAa,SAAQ,WAAW,CAAA;IAC3C,cAAc,GAAG,aAAa;uGADnB,YAAY,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA;;2FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACIlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CG;MAeU,iBAAiB,CAAA;AACnB,IAAA,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;AACnB,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEjD,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,CAAC;aACP,IAAI,CAAC,kBAAkB,EAAE;AACzB,aAAA,SAAS,CAAC,MAAK,EAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD;AAEA;;AAEG;AACM,IAAA,OAAO,GAAG,KAAK,CAA4C,MAAM,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EACxE,SAAS,EAAE,CAAC,CAAC,MAAO,kBAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAI,CAAqB,GAAG,MAAM,CAAC,GAC3G;AAEF;;AAEG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAEzC;;;;AAIG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAC,CAAC,+EAAC;AAE5B;;AAEG;AACM,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AAEjD;;AAEG;AACM,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;AAEjC;;AAEG;AACM,IAAA,IAAI,GAAG,KAAK,CAAgB,IAAI,2EAAC;AAE1C;;AAEG;IACM,MAAM,GAAG,MAAM,EAAE;AAE1B;;AAEG;AACM,IAAA,eAAe,GAAmB,QAAQ,CAAC,MAAK;AACvD,QAAA,MAAM,OAAO,GAAa,CAAC,WAAW,EAAE,CAAA,WAAA,EAAc,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,CAAC;AAEvE,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,sFAAC;AAEF;;AAEG;AACM,IAAA,YAAY,GAAmB,QAAQ,CAAC,MAAK;AACpD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ;AAC9D,IAAA,CAAC,mFAAC;AAEF;;AAEG;AACM,IAAA,gBAAgB,GAAmB,QAAQ,CAAC,MAAK;AACxD,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,GAAG,WAAW,GAAG,QAAQ;AAC5D,IAAA,CAAC,uFAAC;AAEF;;AAEG;AACM,IAAA,YAAY,GAAmB,QAAQ,CAAC,MAAK;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,YAAY,GAAoC;AACpD,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,OAAO,EAAE,cAAc;SACxB;AAED,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACrC,IAAA,CAAC,mFAAC;AAEF;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;uGApGW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjE9B,yjCAgCA,EAAA,MAAA,EAAA,CAAA,6vIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDsBY,gBAAgB,gIAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAWxC,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAd7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,EAAA,eAAA,EAGnC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,mBAAmB;AAC9B,wBAAA,aAAa,EAAE,gBAAgB;AAC/B,wBAAA,kBAAkB,EAAE,oBAAoB;AACxC,wBAAA,oBAAoB,EAAE,QAAQ;AAC/B,qBAAA,EAAA,QAAA,EAAA,yjCAAA,EAAA,MAAA,EAAA,CAAA,6vIAAA,CAAA,EAAA;;;AE/DH;;AAEG;;;;"}
1
+ {"version":3,"file":"raintonic-formaui-components-alert.mjs","sources":["../../../lib/components/alert/alert.types.ts","../../../lib/components/alert/alert.intl.ts","../../../lib/components/alert/alert.component.ts","../../../lib/components/alert/alert.component.html","../../../lib/components/alert/raintonic-formaui-components-alert.ts"],"sourcesContent":["export type FuiAlertVariant = 'primary' | 'success' | 'info' | 'warning' | 'error' | 'generic';\r\n\r\nexport const FUI_ALERT_VARIANTS: readonly FuiAlertVariant[] = [\r\n 'primary',\r\n 'success',\r\n 'info',\r\n 'warning',\r\n 'error',\r\n 'generic',\r\n] as const;\r\n\r\n/**\r\n * Configuration for notification display\r\n */\r\nexport interface FuiNotificationConfig {\r\n /**\r\n * Notification variant (determines color scheme and icon)\r\n */\r\n variant: FuiAlertVariant;\r\n\r\n /**\r\n * Title of the notification\r\n */\r\n title: string;\r\n\r\n /**\r\n * Description/message of the notification\r\n */\r\n description?: string;\r\n\r\n /**\r\n * Duration in milliseconds before auto-dismiss (default: 5000)\r\n * Set to 0 to disable auto-dismiss\r\n */\r\n duration?: number;\r\n\r\n /**\r\n * Whether to show the close button (default: true)\r\n */\r\n closeable?: boolean;\r\n\r\n /**\r\n * Custom icon name (overrides default variant icon)\r\n */\r\n icon?: string;\r\n}\r\n\r\n/**\r\n * Position for notification display\r\n */\r\nexport type FuiNotificationPosition =\r\n | 'top-left'\r\n | 'top-center'\r\n | 'top-right'\r\n | 'bottom-left'\r\n | 'bottom-center'\r\n | 'bottom-right';\r\n\r\nexport const FUI_NOTIFICATION_POSITIONS: readonly FuiNotificationPosition[] = [\r\n 'top-left',\r\n 'top-center',\r\n 'top-right',\r\n 'bottom-left',\r\n 'bottom-center',\r\n 'bottom-right',\r\n] as const;\r\n","import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiAlertIntl extends FuiIntlBase {\r\n closeAriaLabel = 'Close alert';\r\n}\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, inject, input, output, Signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiAlertVariant, FUI_ALERT_VARIANTS } from './alert.types';\r\nimport { FuiProgressbarComponent, ProgressBarColor } from '@raintonic/formaui/components/progressbar';\r\nimport { FuiAlertIntl } from './alert.intl';\r\n\r\n/**\r\n * # FuiAlertComponent\r\n *\r\n * A flexible alert component for displaying informational messages, warnings, errors, and success notifications.\r\n * Can be used inline in pages or as part of the notification system.\r\n *\r\n * ## Features\r\n * - Multiple variants: primary, success, info, warning, error, generic\r\n * - Title and description support\r\n * - Optional close button\r\n * - Custom or default icons per variant\r\n * - Accessible with ARIA attributes\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Alert\r\n * ```html\r\n * <fui-alert\r\n * variant=\"success\"\r\n * title=\"Success!\"\r\n * description=\"Your changes have been saved.\"\r\n * ></fui-alert>\r\n * ```\r\n *\r\n * ### Closeable Alert\r\n * ```html\r\n * <fui-alert\r\n * variant=\"warning\"\r\n * title=\"Warning\"\r\n * description=\"Please review before continuing.\"\r\n * [closeable]=\"true\"\r\n * (closed)=\"onAlertClosed()\"\r\n * ></fui-alert>\r\n * ```\r\n *\r\n * ### Custom Icon\r\n * ```html\r\n * <fui-alert\r\n * variant=\"info\"\r\n * title=\"Custom Icon\"\r\n * icon=\"custom-icon-name\"\r\n * ></fui-alert>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-alert',\r\n standalone: true,\r\n imports: [FuiIconComponent, FuiProgressbarComponent],\r\n templateUrl: './alert.component.html',\r\n styleUrls: ['./alert.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[attr.role]': 'computedRole()',\r\n '[attr.aria-live]': 'computedAriaLive()',\r\n '[attr.aria-atomic]': '\"true\"',\r\n },\r\n})\r\nexport class FuiAlertComponent {\r\n readonly intl = inject(FuiAlertIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n constructor() {\r\n this.intl.changes\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(() => { this._cdr.markForCheck(); });\r\n }\r\n\r\n /**\r\n * Alert variant (determines color scheme and default icon)\r\n */\r\n readonly variant = input<FuiAlertVariant, FuiAlertVariant | string>('info', {\r\n transform: (v) => ((FUI_ALERT_VARIANTS as readonly string[]).includes(v) ? (v as FuiAlertVariant) : 'info'),\r\n });\r\n\r\n /**\r\n * Alert title (required)\r\n */\r\n readonly title = input.required<string>();\r\n\r\n /**\r\n * Progress (optional)\r\n * 0 = turned off\r\n * -1 = indeterminate\r\n */\r\n readonly progress = input(0);\r\n\r\n /**\r\n * Alert description (optional)\r\n */\r\n readonly description = input<string | null>(null);\r\n\r\n /**\r\n * Whether to show the close button\r\n */\r\n readonly closeable = input(false);\r\n\r\n /**\r\n * Custom icon name (overrides default variant icon)\r\n */\r\n readonly icon = input<string | null>(null);\r\n\r\n /**\r\n * Emits when the close button is clicked\r\n */\r\n readonly closed = output();\r\n\r\n /**\r\n * Computed CSS classes for the alert\r\n */\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const classes: string[] = ['fui-alert', `fui-alert--${this.variant()}`];\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /**\r\n * Computed ARIA role: \"alert\" for error/warning, \"status\" for info/success/primary/generic\r\n */\r\n readonly computedRole: Signal<string> = computed(() => {\r\n const v = this.variant();\r\n return v === 'error' || v === 'warning' ? 'alert' : 'status';\r\n });\r\n\r\n /**\r\n * Computed aria-live: \"assertive\" for errors, \"polite\" for everything else\r\n */\r\n readonly computedAriaLive: Signal<string> = computed(() => {\r\n return this.variant() === 'error' ? 'assertive' : 'polite';\r\n });\r\n\r\n /**\r\n * Computed icon name based on variant or custom icon\r\n */\r\n readonly computedIcon: Signal<string> = computed(() => {\r\n const icon = this.icon();\r\n if (icon) {\r\n return icon;\r\n }\r\n\r\n // Default icons for each variant\r\n const variantIcons: Record<FuiAlertVariant, string> = {\r\n primary: 'info',\r\n success: 'check-circle',\r\n info: 'info',\r\n warning: 'warning-diamond',\r\n error: 'smiley-sad',\r\n generic: 'seal-warning',\r\n };\r\n\r\n return variantIcons[this.variant()];\r\n });\r\n\r\n /**\r\n * Progressbar color matching the current alert variant.\r\n */\r\n readonly progressColor: Signal<ProgressBarColor> = computed(() => {\r\n const variantToColor: Record<FuiAlertVariant, ProgressBarColor> = {\r\n primary: 'primary',\r\n success: 'success',\r\n info: 'info',\r\n warning: 'warning',\r\n error: 'warn',\r\n generic: 'accent',\r\n };\r\n return variantToColor[this.variant()];\r\n });\r\n\r\n /**\r\n * Handle close button click\r\n */\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","@if (progress() !== 0) {\r\n <fui-progressbar\r\n [mode]=\"progress() === -1 ? 'indeterminate' : 'determinate'\"\r\n [value]=\"progress() > 0 ? progress() : undefined\"\r\n [color]=\"progressColor()\"\r\n ></fui-progressbar>\r\n}\r\n\r\n<div class=\"fui-alert__container\">\r\n <fui-icon class=\"fui-alert__icon\" weight=\"fill\" [name]=\"computedIcon()\" size=\"md\" />\r\n\r\n <div class=\"fui-alert__content\">\r\n <div class=\"fui-alert__title fui-text-sm fui-font-medium\">{{ title() }}</div>\r\n @if (description()) {\r\n <div class=\"fui-alert__description fui-text-xs\">{{ description() }}</div>\r\n }\r\n <ng-content />\r\n </div>\r\n\r\n @if (closeable()) {\r\n <button type=\"button\" class=\"fui-alert__close\" (click)=\"onClose()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\" />\r\n </button>\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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"}