@raintonic/formaui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +145 -0
  3. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +806 -0
  4. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -0
  5. package/fesm2022/raintonic-formaui-cdk-form-field.mjs +86 -0
  6. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -0
  7. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +1757 -0
  8. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -0
  9. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +287 -0
  10. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -0
  11. package/fesm2022/raintonic-formaui-components-accordion.mjs +217 -0
  12. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -0
  13. package/fesm2022/raintonic-formaui-components-alert.mjs +161 -0
  14. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -0
  15. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +726 -0
  16. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -0
  17. package/fesm2022/raintonic-formaui-components-avatar.mjs +92 -0
  18. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -0
  19. package/fesm2022/raintonic-formaui-components-badge.mjs +107 -0
  20. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -0
  21. package/fesm2022/raintonic-formaui-components-big-menu.mjs +68 -0
  22. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -0
  23. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +55 -0
  24. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -0
  25. package/fesm2022/raintonic-formaui-components-button-group.mjs +103 -0
  26. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -0
  27. package/fesm2022/raintonic-formaui-components-button.mjs +241 -0
  28. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -0
  29. package/fesm2022/raintonic-formaui-components-card.mjs +270 -0
  30. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -0
  31. package/fesm2022/raintonic-formaui-components-checkbox.mjs +295 -0
  32. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -0
  33. package/fesm2022/raintonic-formaui-components-data-table.mjs +631 -0
  34. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -0
  35. package/fesm2022/raintonic-formaui-components-date-picker.mjs +1331 -0
  36. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -0
  37. package/fesm2022/raintonic-formaui-components-divider.mjs +41 -0
  38. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -0
  39. package/fesm2022/raintonic-formaui-components-drawer.mjs +190 -0
  40. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -0
  41. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs +266 -0
  42. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +1 -0
  43. package/fesm2022/raintonic-formaui-components-empty-state.mjs +33 -0
  44. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -0
  45. package/fesm2022/raintonic-formaui-components-file-upload.mjs +246 -0
  46. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -0
  47. package/fesm2022/raintonic-formaui-components-form-field.mjs +482 -0
  48. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -0
  49. package/fesm2022/raintonic-formaui-components-icon.mjs +117 -0
  50. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -0
  51. package/fesm2022/raintonic-formaui-components-input.mjs +327 -0
  52. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -0
  53. package/fesm2022/raintonic-formaui-components-list.mjs +149 -0
  54. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -0
  55. package/fesm2022/raintonic-formaui-components-menu.mjs +896 -0
  56. package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -0
  57. package/fesm2022/raintonic-formaui-components-number-input.mjs +345 -0
  58. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -0
  59. package/fesm2022/raintonic-formaui-components-paginator.mjs +139 -0
  60. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -0
  61. package/fesm2022/raintonic-formaui-components-password-input.mjs +306 -0
  62. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -0
  63. package/fesm2022/raintonic-formaui-components-popover.mjs +451 -0
  64. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -0
  65. package/fesm2022/raintonic-formaui-components-progressbar.mjs +148 -0
  66. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -0
  67. package/fesm2022/raintonic-formaui-components-radio.mjs +260 -0
  68. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -0
  69. package/fesm2022/raintonic-formaui-components-select.mjs +1011 -0
  70. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -0
  71. package/fesm2022/raintonic-formaui-components-side-panel.mjs +150 -0
  72. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -0
  73. package/fesm2022/raintonic-formaui-components-sidebar.mjs +257 -0
  74. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -0
  75. package/fesm2022/raintonic-formaui-components-skeleton.mjs +50 -0
  76. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -0
  77. package/fesm2022/raintonic-formaui-components-slider.mjs +347 -0
  78. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -0
  79. package/fesm2022/raintonic-formaui-components-spinner.mjs +63 -0
  80. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -0
  81. package/fesm2022/raintonic-formaui-components-stepper.mjs +317 -0
  82. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -0
  83. package/fesm2022/raintonic-formaui-components-tab.mjs +197 -0
  84. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -0
  85. package/fesm2022/raintonic-formaui-components-tag.mjs +78 -0
  86. package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -0
  87. package/fesm2022/raintonic-formaui-components-time-picker.mjs +644 -0
  88. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -0
  89. package/fesm2022/raintonic-formaui-components-toggle.mjs +171 -0
  90. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -0
  91. package/fesm2022/raintonic-formaui-components-toolbar.mjs +140 -0
  92. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -0
  93. package/fesm2022/raintonic-formaui-components-tooltip.mjs +555 -0
  94. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -0
  95. package/fesm2022/raintonic-formaui-components-tree-select.mjs +314 -0
  96. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -0
  97. package/fesm2022/raintonic-formaui-components-tree-table.mjs +103 -0
  98. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -0
  99. package/fesm2022/raintonic-formaui-components-tree.mjs +430 -0
  100. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -0
  101. package/fesm2022/raintonic-formaui-core.mjs +62 -0
  102. package/fesm2022/raintonic-formaui-core.mjs.map +1 -0
  103. package/fesm2022/raintonic-formaui-services-dialog.mjs +798 -0
  104. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -0
  105. package/fesm2022/raintonic-formaui-services-notification.mjs +391 -0
  106. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -0
  107. package/fesm2022/raintonic-formaui-services-theme.mjs +248 -0
  108. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -0
  109. package/fesm2022/raintonic-formaui-test-utils.mjs +66 -0
  110. package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -0
  111. package/fesm2022/raintonic-formaui.mjs +15 -0
  112. package/fesm2022/raintonic-formaui.mjs.map +1 -0
  113. package/llms-full.txt +1627 -0
  114. package/llms.txt +60 -0
  115. package/package.json +251 -0
  116. package/styles/_fonts-entry.scss +3 -0
  117. package/styles/fonts/dm-mono-400-latin.woff2 +0 -0
  118. package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
  119. package/styles/fonts/inter-tight-latin.woff2 +0 -0
  120. package/styles/index.scss +127 -0
  121. package/styles/partials/_constants.scss +29 -0
  122. package/styles/partials/_fonts.scss +36 -0
  123. package/styles/partials/_grid.scss +171 -0
  124. package/styles/partials/_mixins.scss +145 -0
  125. package/styles/partials/_motion.scss +252 -0
  126. package/styles/partials/_theme.scss +275 -0
  127. package/styles/partials/_typography.scss +112 -0
  128. package/styles/partials/_utilities.scss +480 -0
  129. package/styles/partials/themes/_dark.scss +254 -0
  130. package/styles/partials/themes/_light.scss +254 -0
  131. package/types/raintonic-formaui-cdk-drag-drop.d.ts +196 -0
  132. package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -0
  133. package/types/raintonic-formaui-cdk-form-field.d.ts +62 -0
  134. package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -0
  135. package/types/raintonic-formaui-cdk-overlay.d.ts +843 -0
  136. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -0
  137. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +112 -0
  138. package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -0
  139. package/types/raintonic-formaui-components-accordion.d.ts +124 -0
  140. package/types/raintonic-formaui-components-accordion.d.ts.map +1 -0
  141. package/types/raintonic-formaui-components-alert.d.ts +143 -0
  142. package/types/raintonic-formaui-components-alert.d.ts.map +1 -0
  143. package/types/raintonic-formaui-components-autocomplete.d.ts +193 -0
  144. package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -0
  145. package/types/raintonic-formaui-components-avatar.d.ts +52 -0
  146. package/types/raintonic-formaui-components-avatar.d.ts.map +1 -0
  147. package/types/raintonic-formaui-components-badge.d.ts +47 -0
  148. package/types/raintonic-formaui-components-badge.d.ts.map +1 -0
  149. package/types/raintonic-formaui-components-big-menu.d.ts +62 -0
  150. package/types/raintonic-formaui-components-big-menu.d.ts.map +1 -0
  151. package/types/raintonic-formaui-components-breadcrumb.d.ts +26 -0
  152. package/types/raintonic-formaui-components-breadcrumb.d.ts.map +1 -0
  153. package/types/raintonic-formaui-components-button-group.d.ts +61 -0
  154. package/types/raintonic-formaui-components-button-group.d.ts.map +1 -0
  155. package/types/raintonic-formaui-components-button.d.ts +116 -0
  156. package/types/raintonic-formaui-components-button.d.ts.map +1 -0
  157. package/types/raintonic-formaui-components-card.d.ts +191 -0
  158. package/types/raintonic-formaui-components-card.d.ts.map +1 -0
  159. package/types/raintonic-formaui-components-checkbox.d.ts +132 -0
  160. package/types/raintonic-formaui-components-checkbox.d.ts.map +1 -0
  161. package/types/raintonic-formaui-components-data-table.d.ts +368 -0
  162. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -0
  163. package/types/raintonic-formaui-components-date-picker.d.ts +341 -0
  164. package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -0
  165. package/types/raintonic-formaui-components-divider.d.ts +21 -0
  166. package/types/raintonic-formaui-components-divider.d.ts.map +1 -0
  167. package/types/raintonic-formaui-components-drawer.d.ts +48 -0
  168. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -0
  169. package/types/raintonic-formaui-components-dynamic-form.d.ts +412 -0
  170. package/types/raintonic-formaui-components-dynamic-form.d.ts.map +1 -0
  171. package/types/raintonic-formaui-components-empty-state.d.ts +14 -0
  172. package/types/raintonic-formaui-components-empty-state.d.ts.map +1 -0
  173. package/types/raintonic-formaui-components-file-upload.d.ts +77 -0
  174. package/types/raintonic-formaui-components-file-upload.d.ts.map +1 -0
  175. package/types/raintonic-formaui-components-form-field.d.ts +271 -0
  176. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -0
  177. package/types/raintonic-formaui-components-icon.d.ts +61 -0
  178. package/types/raintonic-formaui-components-icon.d.ts.map +1 -0
  179. package/types/raintonic-formaui-components-input.d.ts +149 -0
  180. package/types/raintonic-formaui-components-input.d.ts.map +1 -0
  181. package/types/raintonic-formaui-components-list.d.ts +48 -0
  182. package/types/raintonic-formaui-components-list.d.ts.map +1 -0
  183. package/types/raintonic-formaui-components-menu.d.ts +403 -0
  184. package/types/raintonic-formaui-components-menu.d.ts.map +1 -0
  185. package/types/raintonic-formaui-components-number-input.d.ts +127 -0
  186. package/types/raintonic-formaui-components-number-input.d.ts.map +1 -0
  187. package/types/raintonic-formaui-components-paginator.d.ts +37 -0
  188. package/types/raintonic-formaui-components-paginator.d.ts.map +1 -0
  189. package/types/raintonic-formaui-components-password-input.d.ts +111 -0
  190. package/types/raintonic-formaui-components-password-input.d.ts.map +1 -0
  191. package/types/raintonic-formaui-components-popover.d.ts +131 -0
  192. package/types/raintonic-formaui-components-popover.d.ts.map +1 -0
  193. package/types/raintonic-formaui-components-progressbar.d.ts +111 -0
  194. package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -0
  195. package/types/raintonic-formaui-components-radio.d.ts +95 -0
  196. package/types/raintonic-formaui-components-radio.d.ts.map +1 -0
  197. package/types/raintonic-formaui-components-select.d.ts +307 -0
  198. package/types/raintonic-formaui-components-select.d.ts.map +1 -0
  199. package/types/raintonic-formaui-components-side-panel.d.ts +51 -0
  200. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -0
  201. package/types/raintonic-formaui-components-sidebar.d.ts +174 -0
  202. package/types/raintonic-formaui-components-sidebar.d.ts.map +1 -0
  203. package/types/raintonic-formaui-components-skeleton.d.ts +20 -0
  204. package/types/raintonic-formaui-components-skeleton.d.ts.map +1 -0
  205. package/types/raintonic-formaui-components-slider.d.ts +108 -0
  206. package/types/raintonic-formaui-components-slider.d.ts.map +1 -0
  207. package/types/raintonic-formaui-components-spinner.d.ts +42 -0
  208. package/types/raintonic-formaui-components-spinner.d.ts.map +1 -0
  209. package/types/raintonic-formaui-components-stepper.d.ts +126 -0
  210. package/types/raintonic-formaui-components-stepper.d.ts.map +1 -0
  211. package/types/raintonic-formaui-components-tab.d.ts +96 -0
  212. package/types/raintonic-formaui-components-tab.d.ts.map +1 -0
  213. package/types/raintonic-formaui-components-tag.d.ts +34 -0
  214. package/types/raintonic-formaui-components-tag.d.ts.map +1 -0
  215. package/types/raintonic-formaui-components-time-picker.d.ts +172 -0
  216. package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -0
  217. package/types/raintonic-formaui-components-toggle.d.ts +70 -0
  218. package/types/raintonic-formaui-components-toggle.d.ts.map +1 -0
  219. package/types/raintonic-formaui-components-toolbar.d.ts +128 -0
  220. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -0
  221. package/types/raintonic-formaui-components-tooltip.d.ts +268 -0
  222. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -0
  223. package/types/raintonic-formaui-components-tree-select.d.ts +80 -0
  224. package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -0
  225. package/types/raintonic-formaui-components-tree-table.d.ts +90 -0
  226. package/types/raintonic-formaui-components-tree-table.d.ts.map +1 -0
  227. package/types/raintonic-formaui-components-tree.d.ts +104 -0
  228. package/types/raintonic-formaui-components-tree.d.ts.map +1 -0
  229. package/types/raintonic-formaui-core.d.ts +115 -0
  230. package/types/raintonic-formaui-core.d.ts.map +1 -0
  231. package/types/raintonic-formaui-services-dialog.d.ts +451 -0
  232. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -0
  233. package/types/raintonic-formaui-services-notification.d.ts +221 -0
  234. package/types/raintonic-formaui-services-notification.d.ts.map +1 -0
  235. package/types/raintonic-formaui-services-theme.d.ts +126 -0
  236. package/types/raintonic-formaui-services-theme.d.ts.map +1 -0
  237. package/types/raintonic-formaui-test-utils.d.ts +24 -0
  238. package/types/raintonic-formaui-test-utils.d.ts.map +1 -0
  239. package/types/raintonic-formaui.d.ts +4 -0
  240. package/types/raintonic-formaui.d.ts.map +1 -0
@@ -0,0 +1,347 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DOCUMENT, input, booleanAttribute, output, signal, viewChild, computed, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+
5
+ /**
6
+ * # FuiSliderComponent
7
+ *
8
+ * A slider (range input) component with single and dual-thumb (range) support.
9
+ * Integrates with Angular Reactive Forms via ControlValueAccessor.
10
+ *
11
+ * ## Features
12
+ * - Single value and range (dual-thumb) modes
13
+ * - Configurable min/max/step
14
+ * - Optional tick marks and tooltips
15
+ * - Custom label formatting
16
+ * - Keyboard navigation (Arrow keys, Home, End, PageUp/Down)
17
+ * - Drag and click-to-move interaction
18
+ * - Full accessibility (ARIA slider role)
19
+ *
20
+ * ## Usage
21
+ *
22
+ * ### Basic Slider
23
+ * ```html
24
+ * <fui-slider [formControl]="volumeControl"></fui-slider>
25
+ * ```
26
+ *
27
+ * ### Range Slider
28
+ * ```html
29
+ * <fui-slider [range]="true" [formControl]="priceRange"></fui-slider>
30
+ * ```
31
+ *
32
+ * ### With Ticks and Custom Label
33
+ * ```html
34
+ * <fui-slider [showTicks]="true" [formatLabel]="formatCurrency" [min]="0" [max]="1000" [step]="100"></fui-slider>
35
+ * ```
36
+ */
37
+ class FuiSliderComponent {
38
+ _document = inject(DOCUMENT);
39
+ // Inputs
40
+ min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
41
+ max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
42
+ step = input(1, ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
43
+ range = input(false, { ...(ngDevMode ? { debugName: "range" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
44
+ showTicks = input(false, { ...(ngDevMode ? { debugName: "showTicks" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
45
+ showTooltip = input(true, { ...(ngDevMode ? { debugName: "showTooltip" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
46
+ formatLabel = input((v) => String(v), ...(ngDevMode ? [{ debugName: "formatLabel" }] : /* istanbul ignore next */ []));
47
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
48
+ ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
49
+ ariaLabelLow = input(null, ...(ngDevMode ? [{ debugName: "ariaLabelLow" }] : /* istanbul ignore next */ []));
50
+ ariaLabelHigh = input(null, ...(ngDevMode ? [{ debugName: "ariaLabelHigh" }] : /* istanbul ignore next */ []));
51
+ // Outputs
52
+ valueChange = output();
53
+ dragStart = output();
54
+ dragEnd = output();
55
+ // Internal state
56
+ _value = signal(0, ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
57
+ _valueLow = signal(0, ...(ngDevMode ? [{ debugName: "_valueLow" }] : /* istanbul ignore next */ []));
58
+ _valueHigh = signal(100, ...(ngDevMode ? [{ debugName: "_valueHigh" }] : /* istanbul ignore next */ []));
59
+ _dragging = signal(null, ...(ngDevMode ? [{ debugName: "_dragging" }] : /* istanbul ignore next */ []));
60
+ _hovered = signal(null, ...(ngDevMode ? [{ debugName: "_hovered" }] : /* istanbul ignore next */ []));
61
+ // ViewChild
62
+ _sliderContainer = viewChild('sliderContainer', ...(ngDevMode ? [{ debugName: "_sliderContainer" }] : /* istanbul ignore next */ []));
63
+ // Computed: percentages
64
+ _percentage = computed(() => this._valueToPercent(this._value()), ...(ngDevMode ? [{ debugName: "_percentage" }] : /* istanbul ignore next */ []));
65
+ _percentageLow = computed(() => this._valueToPercent(this._valueLow()), ...(ngDevMode ? [{ debugName: "_percentageLow" }] : /* istanbul ignore next */ []));
66
+ _percentageHigh = computed(() => this._valueToPercent(this._valueHigh()), ...(ngDevMode ? [{ debugName: "_percentageHigh" }] : /* istanbul ignore next */ []));
67
+ // Computed: tick values
68
+ _tickValues = computed(() => {
69
+ const minVal = this.min();
70
+ const maxVal = this.max();
71
+ const stepVal = this.step();
72
+ const ticks = [];
73
+ for (let v = minVal; v <= maxVal; v += stepVal) {
74
+ ticks.push(v);
75
+ }
76
+ // Ensure max is included
77
+ if (ticks[ticks.length - 1] !== maxVal) {
78
+ ticks.push(maxVal);
79
+ }
80
+ return ticks;
81
+ }, ...(ngDevMode ? [{ debugName: "_tickValues" }] : /* istanbul ignore next */ []));
82
+ // CVA callbacks
83
+ _onChange = () => {
84
+ // Intentionally empty: will be replaced by Angular forms
85
+ };
86
+ _onTouched = () => {
87
+ // Intentionally empty: will be replaced by Angular forms
88
+ };
89
+ // Bound event handlers for cleanup
90
+ _boundOnMouseMove = this._onMouseMove.bind(this);
91
+ _boundOnMouseUp = this._onMouseUp.bind(this);
92
+ _boundOnTouchMove = this._onTouchMove.bind(this);
93
+ _boundOnTouchEnd = this._onTouchEnd.bind(this);
94
+ // ControlValueAccessor
95
+ writeValue(value) {
96
+ if (value == null)
97
+ return;
98
+ if (Array.isArray(value)) {
99
+ this._valueLow.set(this._clamp(value[0], this.min(), this.max()));
100
+ this._valueHigh.set(this._clamp(value[1], this.min(), this.max()));
101
+ }
102
+ else {
103
+ this._value.set(this._clamp(value, this.min(), this.max()));
104
+ }
105
+ }
106
+ registerOnChange(fn) {
107
+ this._onChange = fn;
108
+ }
109
+ registerOnTouched(fn) {
110
+ this._onTouched = fn;
111
+ }
112
+ setDisabledState(_isDisabled) {
113
+ // disabled is handled by input signal
114
+ }
115
+ ngOnDestroy() {
116
+ this._removeDocumentListeners();
117
+ }
118
+ // === Public helpers (used in template) ===
119
+ _valueToPercent(value) {
120
+ const minVal = this.min();
121
+ const maxVal = this.max();
122
+ if (maxVal === minVal)
123
+ return 0;
124
+ return ((value - minVal) / (maxVal - minVal)) * 100;
125
+ }
126
+ _isTickActive(tick) {
127
+ if (this.range()) {
128
+ return tick >= this._valueLow() && tick <= this._valueHigh();
129
+ }
130
+ return tick <= this._value();
131
+ }
132
+ _snapToStep(value) {
133
+ const stepVal = this.step();
134
+ const minVal = this.min();
135
+ const snapped = Math.round((value - minVal) / stepVal) * stepVal + minVal;
136
+ // Clamp to min/max and round to avoid floating point issues
137
+ return this._clamp(parseFloat(snapped.toFixed(10)), this.min(), this.max());
138
+ }
139
+ _clamp(value, min, max) {
140
+ return Math.min(Math.max(value, min), max);
141
+ }
142
+ // === Event handlers ===
143
+ _onTrackClick(event) {
144
+ if (this.disabled())
145
+ return;
146
+ // Ignore clicks on thumb elements
147
+ const target = event.target;
148
+ if (target.classList.contains('fui-slider__thumb'))
149
+ return;
150
+ const value = this._getValueFromEvent(event);
151
+ if (value === null)
152
+ return;
153
+ this._setNearestThumb(value);
154
+ this._emitChange();
155
+ this._onTouched();
156
+ }
157
+ _onThumbMouseDown(event, thumb) {
158
+ if (this.disabled())
159
+ return;
160
+ event.preventDefault();
161
+ event.stopPropagation();
162
+ this._dragging.set(thumb);
163
+ this.dragStart.emit();
164
+ this._document.addEventListener('mousemove', this._boundOnMouseMove);
165
+ this._document.addEventListener('mouseup', this._boundOnMouseUp);
166
+ }
167
+ _onThumbTouchStart(event, thumb) {
168
+ if (this.disabled())
169
+ return;
170
+ event.preventDefault();
171
+ event.stopPropagation();
172
+ this._dragging.set(thumb);
173
+ this.dragStart.emit();
174
+ this._document.addEventListener('touchmove', this._boundOnTouchMove, { passive: false });
175
+ this._document.addEventListener('touchend', this._boundOnTouchEnd);
176
+ }
177
+ _onThumbKeydown(event, thumb) {
178
+ if (this.disabled())
179
+ return;
180
+ const stepVal = this.step();
181
+ let delta = 0;
182
+ switch (event.key) {
183
+ case 'ArrowRight':
184
+ case 'ArrowUp':
185
+ delta = stepVal;
186
+ break;
187
+ case 'ArrowLeft':
188
+ case 'ArrowDown':
189
+ delta = -stepVal;
190
+ break;
191
+ case 'PageUp':
192
+ delta = stepVal * 10;
193
+ break;
194
+ case 'PageDown':
195
+ delta = -stepVal * 10;
196
+ break;
197
+ case 'Home':
198
+ this._setThumbValue(thumb, this.min());
199
+ this._emitChange();
200
+ event.preventDefault();
201
+ return;
202
+ case 'End':
203
+ this._setThumbValue(thumb, this.max());
204
+ this._emitChange();
205
+ event.preventDefault();
206
+ return;
207
+ default:
208
+ return;
209
+ }
210
+ event.preventDefault();
211
+ const currentValue = this._getThumbValue(thumb);
212
+ const newValue = this._snapToStep(this._clamp(currentValue + delta, this.min(), this.max()));
213
+ this._setThumbValue(thumb, newValue);
214
+ this._emitChange();
215
+ this._onTouched();
216
+ }
217
+ // === Private methods ===
218
+ _onMouseMove(event) {
219
+ const value = this._getValueFromEvent(event);
220
+ if (value === null)
221
+ return;
222
+ this._updateDraggingThumb(value);
223
+ }
224
+ _onMouseUp() {
225
+ this._endDrag();
226
+ this._document.removeEventListener('mousemove', this._boundOnMouseMove);
227
+ this._document.removeEventListener('mouseup', this._boundOnMouseUp);
228
+ }
229
+ _onTouchMove(event) {
230
+ event.preventDefault();
231
+ if (event.touches.length === 0)
232
+ return;
233
+ const touch = event.touches[0];
234
+ const value = this._getValueFromClientX(touch.clientX);
235
+ if (value === null)
236
+ return;
237
+ this._updateDraggingThumb(value);
238
+ }
239
+ _onTouchEnd() {
240
+ this._endDrag();
241
+ this._document.removeEventListener('touchmove', this._boundOnTouchMove);
242
+ this._document.removeEventListener('touchend', this._boundOnTouchEnd);
243
+ }
244
+ _endDrag() {
245
+ if (this._dragging() !== null) {
246
+ this._dragging.set(null);
247
+ this.dragEnd.emit();
248
+ this._onTouched();
249
+ }
250
+ }
251
+ _removeDocumentListeners() {
252
+ this._document.removeEventListener('mousemove', this._boundOnMouseMove);
253
+ this._document.removeEventListener('mouseup', this._boundOnMouseUp);
254
+ this._document.removeEventListener('touchmove', this._boundOnTouchMove);
255
+ this._document.removeEventListener('touchend', this._boundOnTouchEnd);
256
+ }
257
+ _getValueFromEvent(event) {
258
+ return this._getValueFromClientX(event.clientX);
259
+ }
260
+ _getValueFromClientX(clientX) {
261
+ const container = this._sliderContainer();
262
+ if (!container)
263
+ return null;
264
+ const rect = container.nativeElement.getBoundingClientRect();
265
+ const percent = this._clamp((clientX - rect.left) / rect.width, 0, 1);
266
+ const rawValue = this.min() + percent * (this.max() - this.min());
267
+ return this._snapToStep(rawValue);
268
+ }
269
+ _updateDraggingThumb(value) {
270
+ const thumb = this._dragging();
271
+ if (thumb === null)
272
+ return;
273
+ this._setThumbValue(thumb, value);
274
+ this._emitChange();
275
+ }
276
+ _getThumbValue(thumb) {
277
+ if (this.range()) {
278
+ return thumb === 'low' ? this._valueLow() : this._valueHigh();
279
+ }
280
+ return this._value();
281
+ }
282
+ _setThumbValue(thumb, value) {
283
+ if (this.range()) {
284
+ if (thumb === 'low') {
285
+ // Prevent low from exceeding high
286
+ this._valueLow.set(this._clamp(value, this.min(), this._valueHigh()));
287
+ }
288
+ else {
289
+ // Prevent high from going below low
290
+ this._valueHigh.set(this._clamp(value, this._valueLow(), this.max()));
291
+ }
292
+ }
293
+ else {
294
+ this._value.set(value);
295
+ }
296
+ }
297
+ _setNearestThumb(value) {
298
+ if (this.range()) {
299
+ const distLow = Math.abs(value - this._valueLow());
300
+ const distHigh = Math.abs(value - this._valueHigh());
301
+ if (distLow <= distHigh) {
302
+ this._setThumbValue('low', value);
303
+ }
304
+ else {
305
+ this._setThumbValue('high', value);
306
+ }
307
+ }
308
+ else {
309
+ this._value.set(value);
310
+ }
311
+ }
312
+ _emitChange() {
313
+ const val = this.range() ? [this._valueLow(), this._valueHigh()] : this._value();
314
+ this._onChange(val);
315
+ this.valueChange.emit(val);
316
+ }
317
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
318
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiSliderComponent, isStandalone: true, selector: "fui-slider", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, showTicks: { classPropertyName: "showTicks", publicName: "showTicks", isSignal: true, isRequired: false, transformFunction: null }, showTooltip: { classPropertyName: "showTooltip", publicName: "showTooltip", isSignal: true, isRequired: false, transformFunction: null }, formatLabel: { classPropertyName: "formatLabel", publicName: "formatLabel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelLow: { classPropertyName: "ariaLabelLow", publicName: "ariaLabelLow", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelHigh: { classPropertyName: "ariaLabelHigh", publicName: "ariaLabelHigh", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", dragStart: "dragStart", dragEnd: "dragEnd" }, host: { properties: { "class.fui-slider--disabled": "disabled()", "class.fui-slider--range": "range()", "class.fui-slider--dragging": "_dragging() !== null" }, classAttribute: "fui-slider" }, providers: [
319
+ {
320
+ provide: NG_VALUE_ACCESSOR,
321
+ useExisting: FuiSliderComponent,
322
+ multi: true,
323
+ },
324
+ ], viewQueries: [{ propertyName: "_sliderContainer", first: true, predicate: ["sliderContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"fui-slider__container\" (click)=\"_onTrackClick($event)\" #sliderContainer>\n <div class=\"fui-slider__track\">\n <div\n class=\"fui-slider__track-fill\"\n [style.left.%]=\"range() ? _percentageLow() : 0\"\n [style.width.%]=\"range() ? _percentageHigh() - _percentageLow() : _percentage()\"\n ></div>\n </div>\n\n @if (showTicks()) {\n <div class=\"fui-slider__ticks\">\n @for (tick of _tickValues(); track tick) {\n <div\n class=\"fui-slider__tick\"\n [style.left.%]=\"_valueToPercent(tick)\"\n [class.fui-slider__tick--active]=\"_isTickActive(tick)\"\n ></div>\n }\n </div>\n }\n\n <div\n class=\"fui-slider__thumb fui-slider__thumb--low\"\n [style.left.%]=\"range() ? _percentageLow() : _percentage()\"\n role=\"slider\"\n [attr.aria-valuenow]=\"range() ? _valueLow() : _value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"range() ? _valueHigh() : max()\"\n [attr.aria-label]=\"range() ? ariaLabelLow() || 'Minimum value' : ariaLabel() || null\"\n aria-orientation=\"horizontal\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mousedown)=\"_onThumbMouseDown($event, 'low')\"\n (touchstart)=\"_onThumbTouchStart($event, 'low')\"\n (keydown)=\"_onThumbKeydown($event, 'low')\"\n (focus)=\"_hovered.set('low')\"\n (blur)=\"_hovered.set(null)\"\n >\n @if (showTooltip() && (_dragging() === 'low' || _hovered() === 'low')) {\n <div class=\"fui-slider__tooltip\">{{ formatLabel()(range() ? _valueLow() : _value()) }}</div>\n }\n </div>\n\n @if (range()) {\n <div\n class=\"fui-slider__thumb fui-slider__thumb--high\"\n [style.left.%]=\"_percentageHigh()\"\n role=\"slider\"\n [attr.aria-valuenow]=\"_valueHigh()\"\n [attr.aria-valuemin]=\"_valueLow()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-label]=\"ariaLabelHigh() || 'Maximum value'\"\n aria-orientation=\"horizontal\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mousedown)=\"_onThumbMouseDown($event, 'high')\"\n (touchstart)=\"_onThumbTouchStart($event, 'high')\"\n (keydown)=\"_onThumbKeydown($event, 'high')\"\n (focus)=\"_hovered.set('high')\"\n (blur)=\"_hovered.set(null)\"\n >\n @if (showTooltip() && (_dragging() === 'high' || _hovered() === 'high')) {\n <div class=\"fui-slider__tooltip\">{{ formatLabel()(_valueHigh()) }}</div>\n }\n </div>\n }\n</div>\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-slider{display:block;position:relative;width:100%;padding:10px 0;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fui-slider__container{position:relative;width:100%;height:20px;display:flex;align-items:center}.fui-slider__track{position:absolute;left:0;right:0;height:4px;border-radius:var(--fui-border-radius-pill, 999px);background-color:var(--fui-secondary-30, #e2e8f0);overflow:hidden}.fui-slider__track-fill{position:absolute;top:0;bottom:0;background-color:var(--fui-primary);border-radius:var(--fui-border-radius-pill, 999px);transition:left,width var(--fui-duration-fast-01, 70ms) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-slider__ticks{position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);pointer-events:none}.fui-slider__tick{position:absolute;width:4px;height:4px;border-radius:50%;background-color:var(--fui-secondary-50, #94a3b8);transform:translate(-50%,-50%);top:50%;transition:background-color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-slider__tick--active{background-color:var(--fui-primary)}.fui-slider__thumb{position:absolute;width:20px;height:20px;border-radius:50%;background-color:var(--fui-primary);transform:translate(-50%);cursor:grab;z-index:2;outline:none;transition:left,transform,box-shadow var(--fui-duration-fast-01, 70ms) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-slider__thumb:hover{box-shadow:0 0 0 6px rgba(var(--fui-primary-rgb, 99, 102, 241),.15)}.fui-slider__thumb:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-slider__tooltip{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);padding:4px 8px;background-color:var(--fui-surface-inverse, #1e293b);color:var(--fui-text-inverse, #fff);font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-01, .75rem);font-weight:var(--fui-font-weight-medium, 500);line-height:1.2;white-space:nowrap;border-radius:var(--fui-border-radius-sm, 4px);pointer-events:none;transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-slider__tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:var(--fui-surface-inverse, #1e293b)}.fui-slider--dragging .fui-slider__thumb{cursor:grabbing;transform:translate(-50%) scale(1.15);box-shadow:0 0 0 8px rgba(var(--fui-primary-rgb, 99, 102, 241),.2)}.fui-slider--dragging .fui-slider__track-fill{transition:none}.fui-slider--disabled{cursor:not-allowed;opacity:var(--fui-opacity-disabled, .38);pointer-events:none}.fui-slider--disabled .fui-slider__thumb{cursor:not-allowed}.fui-slider--range .fui-slider__thumb--high{z-index:3}@media(prefers-contrast:high){.fui-slider__thumb{border:2px solid CanvasText}.fui-slider__track{border:1px solid CanvasText}}@media(prefers-reduced-motion:reduce){.fui-slider__thumb,.fui-slider__track-fill,.fui-slider__tooltip,.fui-slider__tick{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
325
+ }
326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSliderComponent, decorators: [{
327
+ type: Component,
328
+ args: [{ selector: 'fui-slider', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
329
+ class: 'fui-slider',
330
+ '[class.fui-slider--disabled]': 'disabled()',
331
+ '[class.fui-slider--range]': 'range()',
332
+ '[class.fui-slider--dragging]': '_dragging() !== null',
333
+ }, providers: [
334
+ {
335
+ provide: NG_VALUE_ACCESSOR,
336
+ useExisting: FuiSliderComponent,
337
+ multi: true,
338
+ },
339
+ ], template: "<div class=\"fui-slider__container\" (click)=\"_onTrackClick($event)\" #sliderContainer>\n <div class=\"fui-slider__track\">\n <div\n class=\"fui-slider__track-fill\"\n [style.left.%]=\"range() ? _percentageLow() : 0\"\n [style.width.%]=\"range() ? _percentageHigh() - _percentageLow() : _percentage()\"\n ></div>\n </div>\n\n @if (showTicks()) {\n <div class=\"fui-slider__ticks\">\n @for (tick of _tickValues(); track tick) {\n <div\n class=\"fui-slider__tick\"\n [style.left.%]=\"_valueToPercent(tick)\"\n [class.fui-slider__tick--active]=\"_isTickActive(tick)\"\n ></div>\n }\n </div>\n }\n\n <div\n class=\"fui-slider__thumb fui-slider__thumb--low\"\n [style.left.%]=\"range() ? _percentageLow() : _percentage()\"\n role=\"slider\"\n [attr.aria-valuenow]=\"range() ? _valueLow() : _value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"range() ? _valueHigh() : max()\"\n [attr.aria-label]=\"range() ? ariaLabelLow() || 'Minimum value' : ariaLabel() || null\"\n aria-orientation=\"horizontal\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mousedown)=\"_onThumbMouseDown($event, 'low')\"\n (touchstart)=\"_onThumbTouchStart($event, 'low')\"\n (keydown)=\"_onThumbKeydown($event, 'low')\"\n (focus)=\"_hovered.set('low')\"\n (blur)=\"_hovered.set(null)\"\n >\n @if (showTooltip() && (_dragging() === 'low' || _hovered() === 'low')) {\n <div class=\"fui-slider__tooltip\">{{ formatLabel()(range() ? _valueLow() : _value()) }}</div>\n }\n </div>\n\n @if (range()) {\n <div\n class=\"fui-slider__thumb fui-slider__thumb--high\"\n [style.left.%]=\"_percentageHigh()\"\n role=\"slider\"\n [attr.aria-valuenow]=\"_valueHigh()\"\n [attr.aria-valuemin]=\"_valueLow()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-label]=\"ariaLabelHigh() || 'Maximum value'\"\n aria-orientation=\"horizontal\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mousedown)=\"_onThumbMouseDown($event, 'high')\"\n (touchstart)=\"_onThumbTouchStart($event, 'high')\"\n (keydown)=\"_onThumbKeydown($event, 'high')\"\n (focus)=\"_hovered.set('high')\"\n (blur)=\"_hovered.set(null)\"\n >\n @if (showTooltip() && (_dragging() === 'high' || _hovered() === 'high')) {\n <div class=\"fui-slider__tooltip\">{{ formatLabel()(_valueHigh()) }}</div>\n }\n </div>\n }\n</div>\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-slider{display:block;position:relative;width:100%;padding:10px 0;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fui-slider__container{position:relative;width:100%;height:20px;display:flex;align-items:center}.fui-slider__track{position:absolute;left:0;right:0;height:4px;border-radius:var(--fui-border-radius-pill, 999px);background-color:var(--fui-secondary-30, #e2e8f0);overflow:hidden}.fui-slider__track-fill{position:absolute;top:0;bottom:0;background-color:var(--fui-primary);border-radius:var(--fui-border-radius-pill, 999px);transition:left,width var(--fui-duration-fast-01, 70ms) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-slider__ticks{position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);pointer-events:none}.fui-slider__tick{position:absolute;width:4px;height:4px;border-radius:50%;background-color:var(--fui-secondary-50, #94a3b8);transform:translate(-50%,-50%);top:50%;transition:background-color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-slider__tick--active{background-color:var(--fui-primary)}.fui-slider__thumb{position:absolute;width:20px;height:20px;border-radius:50%;background-color:var(--fui-primary);transform:translate(-50%);cursor:grab;z-index:2;outline:none;transition:left,transform,box-shadow var(--fui-duration-fast-01, 70ms) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1)) 0ms}.fui-slider__thumb:hover{box-shadow:0 0 0 6px rgba(var(--fui-primary-rgb, 99, 102, 241),.15)}.fui-slider__thumb:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-slider__tooltip{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);padding:4px 8px;background-color:var(--fui-surface-inverse, #1e293b);color:var(--fui-text-inverse, #fff);font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-01, .75rem);font-weight:var(--fui-font-weight-medium, 500);line-height:1.2;white-space:nowrap;border-radius:var(--fui-border-radius-sm, 4px);pointer-events:none;transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-slider__tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:var(--fui-surface-inverse, #1e293b)}.fui-slider--dragging .fui-slider__thumb{cursor:grabbing;transform:translate(-50%) scale(1.15);box-shadow:0 0 0 8px rgba(var(--fui-primary-rgb, 99, 102, 241),.2)}.fui-slider--dragging .fui-slider__track-fill{transition:none}.fui-slider--disabled{cursor:not-allowed;opacity:var(--fui-opacity-disabled, .38);pointer-events:none}.fui-slider--disabled .fui-slider__thumb{cursor:not-allowed}.fui-slider--range .fui-slider__thumb--high{z-index:3}@media(prefers-contrast:high){.fui-slider__thumb{border:2px solid CanvasText}.fui-slider__track{border:1px solid CanvasText}}@media(prefers-reduced-motion:reduce){.fui-slider__thumb,.fui-slider__track-fill,.fui-slider__tooltip,.fui-slider__tick{transition:none}}\n"] }]
340
+ }], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], range: [{ type: i0.Input, args: [{ isSignal: true, alias: "range", required: false }] }], showTicks: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTicks", required: false }] }], showTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltip", required: false }] }], formatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatLabel", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelLow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelLow", required: false }] }], ariaLabelHigh: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelHigh", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], dragStart: [{ type: i0.Output, args: ["dragStart"] }], dragEnd: [{ type: i0.Output, args: ["dragEnd"] }], _sliderContainer: [{ type: i0.ViewChild, args: ['sliderContainer', { isSignal: true }] }] } });
341
+
342
+ /**
343
+ * Generated bundle index. Do not edit.
344
+ */
345
+
346
+ export { FuiSliderComponent };
347
+ //# sourceMappingURL=raintonic-formaui-components-slider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-slider.mjs","sources":["../../../lib/components/slider/slider.component.ts","../../../lib/components/slider/slider.component.html","../../../lib/components/slider/raintonic-formaui-components-slider.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n output,\n computed,\n signal,\n viewChild,\n ElementRef,\n Signal,\n WritableSignal,\n OnDestroy,\n booleanAttribute,\n DOCUMENT,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SliderValue, SliderFormatLabelFn } from './slider.types';\n\n/**\n * # FuiSliderComponent\n *\n * A slider (range input) component with single and dual-thumb (range) support.\n * Integrates with Angular Reactive Forms via ControlValueAccessor.\n *\n * ## Features\n * - Single value and range (dual-thumb) modes\n * - Configurable min/max/step\n * - Optional tick marks and tooltips\n * - Custom label formatting\n * - Keyboard navigation (Arrow keys, Home, End, PageUp/Down)\n * - Drag and click-to-move interaction\n * - Full accessibility (ARIA slider role)\n *\n * ## Usage\n *\n * ### Basic Slider\n * ```html\n * <fui-slider [formControl]=\"volumeControl\"></fui-slider>\n * ```\n *\n * ### Range Slider\n * ```html\n * <fui-slider [range]=\"true\" [formControl]=\"priceRange\"></fui-slider>\n * ```\n *\n * ### With Ticks and Custom Label\n * ```html\n * <fui-slider [showTicks]=\"true\" [formatLabel]=\"formatCurrency\" [min]=\"0\" [max]=\"1000\" [step]=\"100\"></fui-slider>\n * ```\n */\n@Component({\n selector: 'fui-slider',\n standalone: true,\n imports: [],\n templateUrl: './slider.component.html',\n styleUrls: ['./slider.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-slider',\n '[class.fui-slider--disabled]': 'disabled()',\n '[class.fui-slider--range]': 'range()',\n '[class.fui-slider--dragging]': '_dragging() !== null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: FuiSliderComponent,\n multi: true,\n },\n ],\n})\nexport class FuiSliderComponent implements ControlValueAccessor, OnDestroy {\n private readonly _document = inject(DOCUMENT);\n\n // Inputs\n readonly min = input(0);\n readonly max = input(100);\n readonly step = input(1);\n readonly range = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly showTicks = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly showTooltip = input<boolean, unknown>(true, { transform: booleanAttribute });\n readonly formatLabel = input<SliderFormatLabelFn>((v: number) => String(v));\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelLow = input<string | null>(null);\n readonly ariaLabelHigh = input<string | null>(null);\n\n // Outputs\n readonly valueChange = output<SliderValue>();\n readonly dragStart = output();\n readonly dragEnd = output();\n\n // Internal state\n readonly _value: WritableSignal<number> = signal(0);\n readonly _valueLow: WritableSignal<number> = signal(0);\n readonly _valueHigh: WritableSignal<number> = signal(100);\n readonly _dragging: WritableSignal<'low' | 'high' | null> = signal(null);\n readonly _hovered: WritableSignal<'low' | 'high' | null> = signal(null);\n\n // ViewChild\n readonly _sliderContainer: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>('sliderContainer');\n\n // Computed: percentages\n readonly _percentage: Signal<number> = computed(() => this._valueToPercent(this._value()));\n\n readonly _percentageLow: Signal<number> = computed(() => this._valueToPercent(this._valueLow()));\n\n readonly _percentageHigh: Signal<number> = computed(() => this._valueToPercent(this._valueHigh()));\n\n // Computed: tick values\n readonly _tickValues: Signal<number[]> = computed(() => {\n const minVal = this.min();\n const maxVal = this.max();\n const stepVal = this.step();\n const ticks: number[] = [];\n for (let v = minVal; v <= maxVal; v += stepVal) {\n ticks.push(v);\n }\n // Ensure max is included\n if (ticks[ticks.length - 1] !== maxVal) {\n ticks.push(maxVal);\n }\n return ticks;\n });\n\n // CVA callbacks\n private _onChange: (value: SliderValue) => void = () => {\n // Intentionally empty: will be replaced by Angular forms\n };\n private _onTouched: () => void = () => {\n // Intentionally empty: will be replaced by Angular forms\n };\n\n // Bound event handlers for cleanup\n private _boundOnMouseMove = this._onMouseMove.bind(this);\n private _boundOnMouseUp = this._onMouseUp.bind(this);\n private _boundOnTouchMove = this._onTouchMove.bind(this);\n private _boundOnTouchEnd = this._onTouchEnd.bind(this);\n\n // ControlValueAccessor\n writeValue(value: SliderValue): void {\n if (value == null) return;\n\n if (Array.isArray(value)) {\n this._valueLow.set(this._clamp(value[0], this.min(), this.max()));\n this._valueHigh.set(this._clamp(value[1], this.min(), this.max()));\n } else {\n this._value.set(this._clamp(value, this.min(), this.max()));\n }\n }\n\n registerOnChange(fn: (value: SliderValue) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(_isDisabled: boolean): void {\n // disabled is handled by input signal\n }\n\n ngOnDestroy(): void {\n this._removeDocumentListeners();\n }\n\n // === Public helpers (used in template) ===\n\n _valueToPercent(value: number): number {\n const minVal = this.min();\n const maxVal = this.max();\n if (maxVal === minVal) return 0;\n return ((value - minVal) / (maxVal - minVal)) * 100;\n }\n\n _isTickActive(tick: number): boolean {\n if (this.range()) {\n return tick >= this._valueLow() && tick <= this._valueHigh();\n }\n return tick <= this._value();\n }\n\n _snapToStep(value: number): number {\n const stepVal = this.step();\n const minVal = this.min();\n const snapped = Math.round((value - minVal) / stepVal) * stepVal + minVal;\n // Clamp to min/max and round to avoid floating point issues\n return this._clamp(parseFloat(snapped.toFixed(10)), this.min(), this.max());\n }\n\n _clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n }\n\n // === Event handlers ===\n\n _onTrackClick(event: MouseEvent): void {\n if (this.disabled()) return;\n // Ignore clicks on thumb elements\n const target = event.target as HTMLElement;\n if (target.classList.contains('fui-slider__thumb')) return;\n\n const value = this._getValueFromEvent(event);\n if (value === null) return;\n\n this._setNearestThumb(value);\n this._emitChange();\n this._onTouched();\n }\n\n _onThumbMouseDown(event: MouseEvent, thumb: 'low' | 'high'): void {\n if (this.disabled()) return;\n event.preventDefault();\n event.stopPropagation();\n\n this._dragging.set(thumb);\n this.dragStart.emit();\n\n this._document.addEventListener('mousemove', this._boundOnMouseMove);\n this._document.addEventListener('mouseup', this._boundOnMouseUp);\n }\n\n _onThumbTouchStart(event: TouchEvent, thumb: 'low' | 'high'): void {\n if (this.disabled()) return;\n event.preventDefault();\n event.stopPropagation();\n\n this._dragging.set(thumb);\n this.dragStart.emit();\n\n this._document.addEventListener('touchmove', this._boundOnTouchMove, { passive: false });\n this._document.addEventListener('touchend', this._boundOnTouchEnd);\n }\n\n _onThumbKeydown(event: KeyboardEvent, thumb: 'low' | 'high'): void {\n if (this.disabled()) return;\n\n const stepVal = this.step();\n let delta = 0;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = stepVal;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = -stepVal;\n break;\n case 'PageUp':\n delta = stepVal * 10;\n break;\n case 'PageDown':\n delta = -stepVal * 10;\n break;\n case 'Home':\n this._setThumbValue(thumb, this.min());\n this._emitChange();\n event.preventDefault();\n return;\n case 'End':\n this._setThumbValue(thumb, this.max());\n this._emitChange();\n event.preventDefault();\n return;\n default:\n return;\n }\n\n event.preventDefault();\n const currentValue = this._getThumbValue(thumb);\n const newValue = this._snapToStep(this._clamp(currentValue + delta, this.min(), this.max()));\n this._setThumbValue(thumb, newValue);\n this._emitChange();\n this._onTouched();\n }\n\n // === Private methods ===\n\n private _onMouseMove(event: MouseEvent): void {\n const value = this._getValueFromEvent(event);\n if (value === null) return;\n this._updateDraggingThumb(value);\n }\n\n private _onMouseUp(): void {\n this._endDrag();\n this._document.removeEventListener('mousemove', this._boundOnMouseMove);\n this._document.removeEventListener('mouseup', this._boundOnMouseUp);\n }\n\n private _onTouchMove(event: TouchEvent): void {\n event.preventDefault();\n if (event.touches.length === 0) return;\n const touch = event.touches[0];\n const value = this._getValueFromClientX(touch.clientX);\n if (value === null) return;\n this._updateDraggingThumb(value);\n }\n\n private _onTouchEnd(): void {\n this._endDrag();\n this._document.removeEventListener('touchmove', this._boundOnTouchMove);\n this._document.removeEventListener('touchend', this._boundOnTouchEnd);\n }\n\n private _endDrag(): void {\n if (this._dragging() !== null) {\n this._dragging.set(null);\n this.dragEnd.emit();\n this._onTouched();\n }\n }\n\n private _removeDocumentListeners(): void {\n this._document.removeEventListener('mousemove', this._boundOnMouseMove);\n this._document.removeEventListener('mouseup', this._boundOnMouseUp);\n this._document.removeEventListener('touchmove', this._boundOnTouchMove);\n this._document.removeEventListener('touchend', this._boundOnTouchEnd);\n }\n\n private _getValueFromEvent(event: MouseEvent): number | null {\n return this._getValueFromClientX(event.clientX);\n }\n\n private _getValueFromClientX(clientX: number): number | null {\n const container = this._sliderContainer();\n if (!container) return null;\n\n const rect = container.nativeElement.getBoundingClientRect();\n const percent = this._clamp((clientX - rect.left) / rect.width, 0, 1);\n const rawValue = this.min() + percent * (this.max() - this.min());\n return this._snapToStep(rawValue);\n }\n\n private _updateDraggingThumb(value: number): void {\n const thumb = this._dragging();\n if (thumb === null) return;\n this._setThumbValue(thumb, value);\n this._emitChange();\n }\n\n private _getThumbValue(thumb: 'low' | 'high'): number {\n if (this.range()) {\n return thumb === 'low' ? this._valueLow() : this._valueHigh();\n }\n return this._value();\n }\n\n private _setThumbValue(thumb: 'low' | 'high', value: number): void {\n if (this.range()) {\n if (thumb === 'low') {\n // Prevent low from exceeding high\n this._valueLow.set(this._clamp(value, this.min(), this._valueHigh()));\n } else {\n // Prevent high from going below low\n this._valueHigh.set(this._clamp(value, this._valueLow(), this.max()));\n }\n } else {\n this._value.set(value);\n }\n }\n\n private _setNearestThumb(value: number): void {\n if (this.range()) {\n const distLow = Math.abs(value - this._valueLow());\n const distHigh = Math.abs(value - this._valueHigh());\n if (distLow <= distHigh) {\n this._setThumbValue('low', value);\n } else {\n this._setThumbValue('high', value);\n }\n } else {\n this._value.set(value);\n }\n }\n\n private _emitChange(): void {\n const val = this.range() ? ([this._valueLow(), this._valueHigh()] as [number, number]) : this._value();\n this._onChange(val);\n this.valueChange.emit(val);\n }\n}\n","<div class=\"fui-slider__container\" (click)=\"_onTrackClick($event)\" #sliderContainer>\n <div class=\"fui-slider__track\">\n <div\n class=\"fui-slider__track-fill\"\n [style.left.%]=\"range() ? _percentageLow() : 0\"\n [style.width.%]=\"range() ? _percentageHigh() - _percentageLow() : _percentage()\"\n ></div>\n </div>\n\n @if (showTicks()) {\n <div class=\"fui-slider__ticks\">\n @for (tick of _tickValues(); track tick) {\n <div\n class=\"fui-slider__tick\"\n [style.left.%]=\"_valueToPercent(tick)\"\n [class.fui-slider__tick--active]=\"_isTickActive(tick)\"\n ></div>\n }\n </div>\n }\n\n <div\n class=\"fui-slider__thumb fui-slider__thumb--low\"\n [style.left.%]=\"range() ? _percentageLow() : _percentage()\"\n role=\"slider\"\n [attr.aria-valuenow]=\"range() ? _valueLow() : _value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"range() ? _valueHigh() : max()\"\n [attr.aria-label]=\"range() ? ariaLabelLow() || 'Minimum value' : ariaLabel() || null\"\n aria-orientation=\"horizontal\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mousedown)=\"_onThumbMouseDown($event, 'low')\"\n (touchstart)=\"_onThumbTouchStart($event, 'low')\"\n (keydown)=\"_onThumbKeydown($event, 'low')\"\n (focus)=\"_hovered.set('low')\"\n (blur)=\"_hovered.set(null)\"\n >\n @if (showTooltip() && (_dragging() === 'low' || _hovered() === 'low')) {\n <div class=\"fui-slider__tooltip\">{{ formatLabel()(range() ? _valueLow() : _value()) }}</div>\n }\n </div>\n\n @if (range()) {\n <div\n class=\"fui-slider__thumb fui-slider__thumb--high\"\n [style.left.%]=\"_percentageHigh()\"\n role=\"slider\"\n [attr.aria-valuenow]=\"_valueHigh()\"\n [attr.aria-valuemin]=\"_valueLow()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-label]=\"ariaLabelHigh() || 'Maximum value'\"\n aria-orientation=\"horizontal\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mousedown)=\"_onThumbMouseDown($event, 'high')\"\n (touchstart)=\"_onThumbTouchStart($event, 'high')\"\n (keydown)=\"_onThumbKeydown($event, 'high')\"\n (focus)=\"_hovered.set('high')\"\n (blur)=\"_hovered.set(null)\"\n >\n @if (showTooltip() && (_dragging() === 'high' || _hovered() === 'high')) {\n <div class=\"fui-slider__tooltip\">{{ formatLabel()(_valueHigh()) }}</div>\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, numberAttribute, computed, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ /**
5
+ * @component FuiSpinnerComponent
6
+ * @selector fui-spinner
7
+ * @description A circular loading spinner with determinate and indeterminate modes.
8
+ * Supports an overlay mode that covers its parent container.
9
+ *
10
+ * @input mode - Spinner mode: 'determinate' | 'indeterminate'. Default 'indeterminate'.
11
+ * @input value - Progress value (0-100) for determinate mode. Default 0.
12
+ * @input size - Spinner size: 'sm' | 'md' | 'lg'. Default 'md'.
13
+ * @input color - Optional custom CSS color for the spinner stroke.
14
+ * @input overlay - Whether to render as a full-area overlay. Default false.
15
+ * @input ariaLabel - Accessible label. Default 'Loading'.
16
+ *
17
+ * @example
18
+ * <fui-spinner></fui-spinner>
19
+ *
20
+ * @example
21
+ * <fui-spinner mode="determinate" [value]="progress" size="lg"></fui-spinner>
22
+ */
23
+ class FuiSpinnerComponent {
24
+ mode = input('indeterminate', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
25
+ value = input(0, { ...(ngDevMode ? { debugName: "value" } : /* istanbul ignore next */ {}), transform: numberAttribute });
26
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
27
+ color = input(null, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
28
+ overlay = input(false, ...(ngDevMode ? [{ debugName: "overlay" }] : /* istanbul ignore next */ []));
29
+ ariaLabel = input('Loading', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
30
+ RADIUS = 20;
31
+ circumference = 2 * Math.PI * this.RADIUS;
32
+ clampedValue = computed(() => Math.max(0, Math.min(100, this.value() || 0)), ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
33
+ strokeDashoffset = computed(() => {
34
+ return this.circumference - (this.clampedValue() / 100) * this.circumference;
35
+ }, ...(ngDevMode ? [{ debugName: "strokeDashoffset" }] : /* istanbul ignore next */ []));
36
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiSpinnerComponent, isStandalone: true, selector: "fui-spinner", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status", "aria-live": "polite" }, properties: { "class.fui-spinner--sm": "size() === \"sm\"", "class.fui-spinner--md": "size() === \"md\"", "class.fui-spinner--lg": "size() === \"lg\"", "class.fui-spinner--overlay": "overlay()", "class.fui-spinner--determinate": "mode() === \"determinate\"", "class.fui-spinner--indeterminate": "mode() === \"indeterminate\"", "attr.aria-valuenow": "mode() === \"determinate\" ? clampedValue() : null", "attr.aria-valuemin": "mode() === \"determinate\" ? 0 : null", "attr.aria-valuemax": "mode() === \"determinate\" ? 100 : null", "attr.aria-label": "ariaLabel()" }, classAttribute: "fui-spinner" }, ngImport: i0, template: "@if (overlay()) {\n <div class=\"fui-spinner__overlay\">\n <svg class=\"fui-spinner__svg\" viewBox=\"0 0 48 48\" [style.--fui-spinner-color]=\"color()\">\n @if (mode() === 'determinate') {\n <circle class=\"fui-spinner__track\" cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n }\n <circle\n class=\"fui-spinner__circle\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"4\"\n [attr.stroke-dasharray]=\"mode() === 'determinate' ? circumference : null\"\n [attr.stroke-dashoffset]=\"mode() === 'determinate' ? strokeDashoffset() : null\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n} @else {\n <svg class=\"fui-spinner__svg\" viewBox=\"0 0 48 48\" [style.--fui-spinner-color]=\"color()\">\n @if (mode() === 'determinate') {\n <circle class=\"fui-spinner__track\" cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n }\n <circle\n class=\"fui-spinner__circle\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"4\"\n [attr.stroke-dasharray]=\"mode() === 'determinate' ? circumference : null\"\n [attr.stroke-dashoffset]=\"mode() === 'determinate' ? strokeDashoffset() : null\"\n stroke-linecap=\"round\"\n />\n </svg>\n}\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-spinner{display:inline-flex;align-items:center;justify-content:center;--fui-spinner-color: var(--fui-primary)}.fui-spinner--sm{width:1rem;height:1rem}.fui-spinner--md{width:2.5rem;height:2.5rem}.fui-spinner--lg{width:4rem;height:4rem}.fui-spinner__svg{width:100%;height:100%}.fui-spinner__track{stroke:var(--fui-surface-05, #e2e8f0)}.fui-spinner__circle{stroke:var(--fui-spinner-color);transform-origin:center}.fui-spinner--indeterminate .fui-spinner__svg{animation:fui-spin var(--fui-duration-slow-02, .7s) linear infinite}.fui-spinner--indeterminate .fui-spinner__circle{stroke-dasharray:80,200;stroke-dashoffset:0;animation:fui-spinner-dash 1.5s ease-in-out infinite}.fui-spinner--determinate .fui-spinner__circle{transition:stroke-dashoffset var(--fui-duration-moderate-01, .3s) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1));transform:rotate(-90deg);transform-origin:center}.fui-spinner--overlay{position:static}.fui-spinner__overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:var(--fui-white-70);z-index:var(--fui-z-index-overlay, 10);border-radius:inherit}.fui-theme-dark .fui-spinner__overlay{background-color:var(--fui-black-50)}@keyframes fui-spinner-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@media(prefers-reduced-motion:reduce){.fui-spinner__svg,.fui-spinner__circle{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSpinnerComponent, decorators: [{
40
+ type: Component,
41
+ args: [{ selector: 'fui-spinner', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
42
+ class: 'fui-spinner',
43
+ '[class.fui-spinner--sm]': 'size() === "sm"',
44
+ '[class.fui-spinner--md]': 'size() === "md"',
45
+ '[class.fui-spinner--lg]': 'size() === "lg"',
46
+ '[class.fui-spinner--overlay]': 'overlay()',
47
+ '[class.fui-spinner--determinate]': 'mode() === "determinate"',
48
+ '[class.fui-spinner--indeterminate]': 'mode() === "indeterminate"',
49
+ role: 'status',
50
+ 'aria-live': 'polite',
51
+ '[attr.aria-valuenow]': 'mode() === "determinate" ? clampedValue() : null',
52
+ '[attr.aria-valuemin]': 'mode() === "determinate" ? 0 : null',
53
+ '[attr.aria-valuemax]': 'mode() === "determinate" ? 100 : null',
54
+ '[attr.aria-label]': 'ariaLabel()',
55
+ }, template: "@if (overlay()) {\n <div class=\"fui-spinner__overlay\">\n <svg class=\"fui-spinner__svg\" viewBox=\"0 0 48 48\" [style.--fui-spinner-color]=\"color()\">\n @if (mode() === 'determinate') {\n <circle class=\"fui-spinner__track\" cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n }\n <circle\n class=\"fui-spinner__circle\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"4\"\n [attr.stroke-dasharray]=\"mode() === 'determinate' ? circumference : null\"\n [attr.stroke-dashoffset]=\"mode() === 'determinate' ? strokeDashoffset() : null\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n} @else {\n <svg class=\"fui-spinner__svg\" viewBox=\"0 0 48 48\" [style.--fui-spinner-color]=\"color()\">\n @if (mode() === 'determinate') {\n <circle class=\"fui-spinner__track\" cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n }\n <circle\n class=\"fui-spinner__circle\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"4\"\n [attr.stroke-dasharray]=\"mode() === 'determinate' ? circumference : null\"\n [attr.stroke-dashoffset]=\"mode() === 'determinate' ? strokeDashoffset() : null\"\n stroke-linecap=\"round\"\n />\n </svg>\n}\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-spinner{display:inline-flex;align-items:center;justify-content:center;--fui-spinner-color: var(--fui-primary)}.fui-spinner--sm{width:1rem;height:1rem}.fui-spinner--md{width:2.5rem;height:2.5rem}.fui-spinner--lg{width:4rem;height:4rem}.fui-spinner__svg{width:100%;height:100%}.fui-spinner__track{stroke:var(--fui-surface-05, #e2e8f0)}.fui-spinner__circle{stroke:var(--fui-spinner-color);transform-origin:center}.fui-spinner--indeterminate .fui-spinner__svg{animation:fui-spin var(--fui-duration-slow-02, .7s) linear infinite}.fui-spinner--indeterminate .fui-spinner__circle{stroke-dasharray:80,200;stroke-dashoffset:0;animation:fui-spinner-dash 1.5s ease-in-out infinite}.fui-spinner--determinate .fui-spinner__circle{transition:stroke-dashoffset var(--fui-duration-moderate-01, .3s) var(--fui-ease-standard, cubic-bezier(.4, 0, .2, 1));transform:rotate(-90deg);transform-origin:center}.fui-spinner--overlay{position:static}.fui-spinner__overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:var(--fui-white-70);z-index:var(--fui-z-index-overlay, 10);border-radius:inherit}.fui-theme-dark .fui-spinner__overlay{background-color:var(--fui-black-50)}@keyframes fui-spinner-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@media(prefers-reduced-motion:reduce){.fui-spinner__svg,.fui-spinner__circle{animation:none}}\n"] }]
56
+ }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], overlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlay", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
57
+
58
+ /**
59
+ * Generated bundle index. Do not edit.
60
+ */
61
+
62
+ export { FuiSpinnerComponent };
63
+ //# sourceMappingURL=raintonic-formaui-components-spinner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-spinner.mjs","sources":["../../../lib/components/spinner/spinner.component.ts","../../../lib/components/spinner/spinner.component.html","../../../lib/components/spinner/raintonic-formaui-components-spinner.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, input, numberAttribute } from '@angular/core';\nimport { FuiSpinnerMode, FuiSpinnerSize } from './spinner.types';\n\n/**\n * @component FuiSpinnerComponent\n * @selector fui-spinner\n * @description A circular loading spinner with determinate and indeterminate modes.\n * Supports an overlay mode that covers its parent container.\n *\n * @input mode - Spinner mode: 'determinate' | 'indeterminate'. Default 'indeterminate'.\n * @input value - Progress value (0-100) for determinate mode. Default 0.\n * @input size - Spinner size: 'sm' | 'md' | 'lg'. Default 'md'.\n * @input color - Optional custom CSS color for the spinner stroke.\n * @input overlay - Whether to render as a full-area overlay. Default false.\n * @input ariaLabel - Accessible label. Default 'Loading'.\n *\n * @example\n * <fui-spinner></fui-spinner>\n *\n * @example\n * <fui-spinner mode=\"determinate\" [value]=\"progress\" size=\"lg\"></fui-spinner>\n */\n@Component({\n selector: 'fui-spinner',\n standalone: true,\n imports: [],\n templateUrl: './spinner.component.html',\n styleUrls: ['./spinner.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-spinner',\n '[class.fui-spinner--sm]': 'size() === \"sm\"',\n '[class.fui-spinner--md]': 'size() === \"md\"',\n '[class.fui-spinner--lg]': 'size() === \"lg\"',\n '[class.fui-spinner--overlay]': 'overlay()',\n '[class.fui-spinner--determinate]': 'mode() === \"determinate\"',\n '[class.fui-spinner--indeterminate]': 'mode() === \"indeterminate\"',\n role: 'status',\n 'aria-live': 'polite',\n '[attr.aria-valuenow]': 'mode() === \"determinate\" ? clampedValue() : null',\n '[attr.aria-valuemin]': 'mode() === \"determinate\" ? 0 : null',\n '[attr.aria-valuemax]': 'mode() === \"determinate\" ? 100 : null',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class FuiSpinnerComponent {\n readonly mode = input<FuiSpinnerMode>('indeterminate');\n readonly value = input<number, unknown>(0, { transform: numberAttribute });\n readonly size = input<FuiSpinnerSize>('md');\n readonly color = input<string | null>(null);\n readonly overlay = input(false);\n readonly ariaLabel = input('Loading', { alias: 'aria-label' });\n\n private readonly RADIUS = 20;\n readonly circumference = 2 * Math.PI * this.RADIUS;\n\n readonly clampedValue = computed(() => Math.max(0, Math.min(100, this.value() || 0)));\n readonly strokeDashoffset = computed(() => {\n return this.circumference - (this.clampedValue() / 100) * this.circumference;\n });\n}\n","@if (overlay()) {\n <div class=\"fui-spinner__overlay\">\n <svg class=\"fui-spinner__svg\" viewBox=\"0 0 48 48\" [style.--fui-spinner-color]=\"color()\">\n @if (mode() === 'determinate') {\n <circle class=\"fui-spinner__track\" cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n }\n <circle\n class=\"fui-spinner__circle\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"4\"\n [attr.stroke-dasharray]=\"mode() === 'determinate' ? circumference : null\"\n [attr.stroke-dashoffset]=\"mode() === 'determinate' ? strokeDashoffset() : null\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n} @else {\n <svg class=\"fui-spinner__svg\" viewBox=\"0 0 48 48\" [style.--fui-spinner-color]=\"color()\">\n @if (mode() === 'determinate') {\n <circle class=\"fui-spinner__track\" cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n }\n <circle\n class=\"fui-spinner__circle\"\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke-width=\"4\"\n [attr.stroke-dasharray]=\"mode() === 'determinate' ? circumference : null\"\n [attr.stroke-dashoffset]=\"mode() === 'determinate' ? strokeDashoffset() : null\"\n stroke-linecap=\"round\"\n />\n </svg>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;;;;;;AAkBG;MAyBU,mBAAmB,CAAA;AACrB,IAAA,IAAI,GAAG,KAAK,CAAiB,eAAe,2EAAC;IAC7C,KAAK,GAAG,KAAK,CAAkB,CAAC,6EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;AACjE,IAAA,IAAI,GAAG,KAAK,CAAiB,IAAI,2EAAC;AAClC,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,4EAAC;AAClC,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,8EAAC;IACtB,SAAS,GAAG,KAAK,CAAC,SAAS,iFAAI,KAAK,EAAE,YAAY,EAAA,CAAG;IAE7C,MAAM,GAAG,EAAE;IACnB,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM;IAEzC,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC5E,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,aAAa;AAC9E,IAAA,CAAC,uFAAC;uGAdS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,y8CC9ChC,+0CAqCA,EAAA,MAAA,EAAA,CAAA,ggGAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDSa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAxB/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,aAAa;AACpB,wBAAA,yBAAyB,EAAE,iBAAiB;AAC5C,wBAAA,yBAAyB,EAAE,iBAAiB;AAC5C,wBAAA,yBAAyB,EAAE,iBAAiB;AAC5C,wBAAA,8BAA8B,EAAE,WAAW;AAC3C,wBAAA,kCAAkC,EAAE,0BAA0B;AAC9D,wBAAA,oCAAoC,EAAE,4BAA4B;AAClE,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,WAAW,EAAE,QAAQ;AACrB,wBAAA,sBAAsB,EAAE,kDAAkD;AAC1E,wBAAA,sBAAsB,EAAE,qCAAqC;AAC7D,wBAAA,sBAAsB,EAAE,uCAAuC;AAC/D,wBAAA,mBAAmB,EAAE,aAAa;AACnC,qBAAA,EAAA,QAAA,EAAA,+0CAAA,EAAA,MAAA,EAAA,CAAA,ggGAAA,CAAA,EAAA;;;AE5CH;;AAEG;;;;"}