@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,55 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, input, booleanAttribute, signal, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, contentChildren, effect } from '@angular/core';
3
+ import { RouterLink } from '@angular/router';
4
+
5
+ const FUI_BREADCRUMB = new InjectionToken('FUI_BREADCRUMB');
6
+
7
+ class FuiBreadcrumbItemComponent {
8
+ routerLink = input(null, ...(ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []));
9
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
10
+ // Set by parent breadcrumb
11
+ isLast = signal(false, ...(ngDevMode ? [{ debugName: "isLast" }] : /* istanbul ignore next */ []));
12
+ _separator = signal('/', ...(ngDevMode ? [{ debugName: "_separator" }] : /* istanbul ignore next */ []));
13
+ isLink = computed(() => this.routerLink() != null && !this.isLast() && !this.disabled(), ...(ngDevMode ? [{ debugName: "isLink" }] : /* istanbul ignore next */ []));
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiBreadcrumbItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiBreadcrumbItemComponent, isStandalone: true, selector: "fui-breadcrumb-item", inputs: { routerLink: { classPropertyName: "routerLink", publicName: "routerLink", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fui-breadcrumb-item--active": "isLast()", "class.fui-breadcrumb-item--disabled": "disabled()", "attr.aria-current": "isLast() ? \"page\" : null" }, classAttribute: "fui-breadcrumb-item" }, ngImport: i0, template: "<li class=\"fui-breadcrumb-item__wrapper\">\n @if (isLink()) {\n <a class=\"fui-breadcrumb-item__link\" [routerLink]=\"routerLink()\"><ng-content></ng-content></a>\n } @else {\n <span class=\"fui-breadcrumb-item__text\"><ng-content></ng-content></span>\n }\n</li>\n@if (!isLast()) {\n <li class=\"fui-breadcrumb-item__separator\" aria-hidden=\"true\">{{ _separator() }}</li>\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-breadcrumb{display:block}.fui-breadcrumb__list{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:var(--fui-gap-4, .25rem)}.fui-breadcrumb-item{display:contents}.fui-breadcrumb-item__wrapper{display:flex;align-items:center}.fui-breadcrumb-item__link{color:var(--fui-primary);text-decoration:none;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);transition:color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-breadcrumb-item__link:hover{color:var(--fui-primary-80);text-decoration:underline}.fui-breadcrumb-item__link:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px;border-radius:var(--fui-border-radius-sm, 8px)}.fui-breadcrumb-item__text{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary)}.fui-breadcrumb-item--active .fui-breadcrumb-item__text{font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary)}.fui-breadcrumb-item--disabled .fui-breadcrumb-item__text{color:var(--fui-text-disabled)}.fui-breadcrumb-item__separator{display:flex;align-items:center;color:var(--fui-text-secondary);font-size:var(--fui-font-size-02);-webkit-user-select:none;user-select:none;padding:0 var(--fui-gap-4, .25rem)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiBreadcrumbItemComponent, decorators: [{
18
+ type: Component,
19
+ args: [{ selector: 'fui-breadcrumb-item', standalone: true, imports: [RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
20
+ class: 'fui-breadcrumb-item',
21
+ '[class.fui-breadcrumb-item--active]': 'isLast()',
22
+ '[class.fui-breadcrumb-item--disabled]': 'disabled()',
23
+ '[attr.aria-current]': 'isLast() ? "page" : null',
24
+ }, template: "<li class=\"fui-breadcrumb-item__wrapper\">\n @if (isLink()) {\n <a class=\"fui-breadcrumb-item__link\" [routerLink]=\"routerLink()\"><ng-content></ng-content></a>\n } @else {\n <span class=\"fui-breadcrumb-item__text\"><ng-content></ng-content></span>\n }\n</li>\n@if (!isLast()) {\n <li class=\"fui-breadcrumb-item__separator\" aria-hidden=\"true\">{{ _separator() }}</li>\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-breadcrumb{display:block}.fui-breadcrumb__list{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:var(--fui-gap-4, .25rem)}.fui-breadcrumb-item{display:contents}.fui-breadcrumb-item__wrapper{display:flex;align-items:center}.fui-breadcrumb-item__link{color:var(--fui-primary);text-decoration:none;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);transition:color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-breadcrumb-item__link:hover{color:var(--fui-primary-80);text-decoration:underline}.fui-breadcrumb-item__link:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px;border-radius:var(--fui-border-radius-sm, 8px)}.fui-breadcrumb-item__text{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary)}.fui-breadcrumb-item--active .fui-breadcrumb-item__text{font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary)}.fui-breadcrumb-item--disabled .fui-breadcrumb-item__text{color:var(--fui-text-disabled)}.fui-breadcrumb-item__separator{display:flex;align-items:center;color:var(--fui-text-secondary);font-size:var(--fui-font-size-02);-webkit-user-select:none;user-select:none;padding:0 var(--fui-gap-4, .25rem)}\n"] }]
25
+ }], propDecorators: { routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
26
+
27
+ class FuiBreadcrumbComponent {
28
+ separator = input('/', ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
29
+ ariaLabel = input('Breadcrumb', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
30
+ items = contentChildren(FuiBreadcrumbItemComponent, ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
31
+ constructor() {
32
+ effect(() => {
33
+ const items = this.items();
34
+ items.forEach((item, idx) => {
35
+ item.isLast.set(idx === items.length - 1);
36
+ item._separator.set(this.separator());
37
+ });
38
+ });
39
+ }
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiBreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiBreadcrumbComponent, isStandalone: true, selector: "fui-breadcrumb", inputs: { separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "fui-breadcrumb" }, providers: [{ provide: FUI_BREADCRUMB, useExisting: FuiBreadcrumbComponent }], queries: [{ propertyName: "items", predicate: FuiBreadcrumbItemComponent, isSignal: true }], ngImport: i0, template: "<nav [attr.aria-label]=\"ariaLabel()\">\n <ol class=\"fui-breadcrumb__list\">\n <ng-content></ng-content>\n </ol>\n</nav>\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-breadcrumb{display:block}.fui-breadcrumb__list{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:var(--fui-gap-4, .25rem)}.fui-breadcrumb-item{display:contents}.fui-breadcrumb-item__wrapper{display:flex;align-items:center}.fui-breadcrumb-item__link{color:var(--fui-primary);text-decoration:none;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);transition:color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-breadcrumb-item__link:hover{color:var(--fui-primary-80);text-decoration:underline}.fui-breadcrumb-item__link:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px;border-radius:var(--fui-border-radius-sm, 8px)}.fui-breadcrumb-item__text{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary)}.fui-breadcrumb-item--active .fui-breadcrumb-item__text{font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary)}.fui-breadcrumb-item--disabled .fui-breadcrumb-item__text{color:var(--fui-text-disabled)}.fui-breadcrumb-item__separator{display:flex;align-items:center;color:var(--fui-text-secondary);font-size:var(--fui-font-size-02);-webkit-user-select:none;user-select:none;padding:0 var(--fui-gap-4, .25rem)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiBreadcrumbComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'fui-breadcrumb', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
46
+ class: 'fui-breadcrumb',
47
+ }, providers: [{ provide: FUI_BREADCRUMB, useExisting: FuiBreadcrumbComponent }], template: "<nav [attr.aria-label]=\"ariaLabel()\">\n <ol class=\"fui-breadcrumb__list\">\n <ng-content></ng-content>\n </ol>\n</nav>\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-breadcrumb{display:block}.fui-breadcrumb__list{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:var(--fui-gap-4, .25rem)}.fui-breadcrumb-item{display:contents}.fui-breadcrumb-item__wrapper{display:flex;align-items:center}.fui-breadcrumb-item__link{color:var(--fui-primary);text-decoration:none;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);transition:color var(--fui-duration-fast-02, .15s) var(--fui-ease-standard) 0ms}.fui-breadcrumb-item__link:hover{color:var(--fui-primary-80);text-decoration:underline}.fui-breadcrumb-item__link:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px;border-radius:var(--fui-border-radius-sm, 8px)}.fui-breadcrumb-item__text{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);color:var(--fui-text-primary)}.fui-breadcrumb-item--active .fui-breadcrumb-item__text{font-weight:var(--fui-font-weight-medium, 500);color:var(--fui-text-primary)}.fui-breadcrumb-item--disabled .fui-breadcrumb-item__text{color:var(--fui-text-disabled)}.fui-breadcrumb-item__separator{display:flex;align-items:center;color:var(--fui-text-secondary);font-size:var(--fui-font-size-02);-webkit-user-select:none;user-select:none;padding:0 var(--fui-gap-4, .25rem)}\n"] }]
48
+ }], ctorParameters: () => [], propDecorators: { separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FuiBreadcrumbItemComponent), { isSignal: true }] }] } });
49
+
50
+ /**
51
+ * Generated bundle index. Do not edit.
52
+ */
53
+
54
+ export { FUI_BREADCRUMB, FuiBreadcrumbComponent, FuiBreadcrumbItemComponent };
55
+ //# sourceMappingURL=raintonic-formaui-components-breadcrumb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-breadcrumb.mjs","sources":["../../../lib/components/breadcrumb/breadcrumb.types.ts","../../../lib/components/breadcrumb/breadcrumb-item.component.ts","../../../lib/components/breadcrumb/breadcrumb-item.component.html","../../../lib/components/breadcrumb/breadcrumb.component.ts","../../../lib/components/breadcrumb/breadcrumb.component.html","../../../lib/components/breadcrumb/raintonic-formaui-components-breadcrumb.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const FUI_BREADCRUMB = new InjectionToken<unknown>('FUI_BREADCRUMB');\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n signal,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\n@Component({\n selector: 'fui-breadcrumb-item',\n standalone: true,\n imports: [RouterLink],\n templateUrl: './breadcrumb-item.component.html',\n styleUrls: ['./breadcrumb.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-breadcrumb-item',\n '[class.fui-breadcrumb-item--active]': 'isLast()',\n '[class.fui-breadcrumb-item--disabled]': 'disabled()',\n '[attr.aria-current]': 'isLast() ? \"page\" : null',\n },\n})\nexport class FuiBreadcrumbItemComponent {\n readonly routerLink = input<string | unknown[] | null>(null);\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n // Set by parent breadcrumb\n readonly isLast = signal(false);\n readonly _separator = signal('/');\n\n readonly isLink = computed(() => this.routerLink() != null && !this.isLast() && !this.disabled());\n}\n","<li class=\"fui-breadcrumb-item__wrapper\">\n @if (isLink()) {\n <a class=\"fui-breadcrumb-item__link\" [routerLink]=\"routerLink()\"><ng-content></ng-content></a>\n } @else {\n <span class=\"fui-breadcrumb-item__text\"><ng-content></ng-content></span>\n }\n</li>\n@if (!isLast()) {\n <li class=\"fui-breadcrumb-item__separator\" aria-hidden=\"true\">{{ _separator() }}</li>\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, contentChildren, effect, input } from '@angular/core';\nimport { FUI_BREADCRUMB } from './breadcrumb.types';\nimport { FuiBreadcrumbItemComponent } from './breadcrumb-item.component';\n\n@Component({\n selector: 'fui-breadcrumb',\n standalone: true,\n imports: [],\n templateUrl: './breadcrumb.component.html',\n styleUrls: ['./breadcrumb.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-breadcrumb',\n },\n providers: [{ provide: FUI_BREADCRUMB, useExisting: FuiBreadcrumbComponent }],\n})\nexport class FuiBreadcrumbComponent {\n readonly separator = input('/');\n readonly ariaLabel = input('Breadcrumb', { alias: 'aria-label' });\n\n readonly items = contentChildren(FuiBreadcrumbItemComponent);\n\n constructor() {\n effect(() => {\n const items = this.items();\n items.forEach((item, idx) => {\n item.isLast.set(idx === items.length - 1);\n item._separator.set(this.separator());\n });\n });\n }\n}\n","<nav [attr.aria-label]=\"ariaLabel()\">\n <ol class=\"fui-breadcrumb__list\">\n <ng-content></ng-content>\n </ol>\n</nav>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, ElementRef, Renderer2, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ /**
5
+ * # Button Group Component
6
+ *
7
+ * A container component that groups multiple buttons together, creating a unified
8
+ * visual element with connected borders. Follows Carbon Design System patterns.
9
+ *
10
+ * ## Features
11
+ * - Groups multiple buttons into a single visual unit
12
+ * - Removes internal border-radius, keeping only the extremities rounded
13
+ * - Surface-02 background with small padding
14
+ * - Automatically handles button border-radius for first and last buttons
15
+ *
16
+ * ## Usage
17
+ *
18
+ * ### Basic Button Group
19
+ * ```html
20
+ * <fui-button-group>
21
+ * <button fuiButton variant="outline">Left</button>
22
+ * <button fuiButton variant="outline">Center</button>
23
+ * <button fuiButton variant="outline">Right</button>
24
+ * </fui-button-group>
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { FuiButtonGroupComponent } from '@raintonic/formaui/components/button-group';
30
+ * import { FuiButtonDirective } from '@raintonic/formaui/components/button';
31
+ *
32
+ * @Component({
33
+ * standalone: true,
34
+ * imports: [FuiButtonGroupComponent, FuiButtonDirective],
35
+ * template: `
36
+ * <fui-button-group>
37
+ * <button fuiButton variant="outline">Option 1</button>
38
+ * <button fuiButton variant="outline">Option 2</button>
39
+ * <button fuiButton variant="outline">Option 3</button>
40
+ * </fui-button-group>
41
+ * `
42
+ * })
43
+ * export class MyComponent {}
44
+ * ```
45
+ */
46
+ class FuiButtonGroupComponent {
47
+ /**
48
+ * Accessible label for the button group
49
+ */
50
+ ariaLabel = input(undefined, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
51
+ _elementRef = inject(ElementRef);
52
+ _renderer = inject(Renderer2);
53
+ constructor() {
54
+ // Set up an effect to handle dynamic button changes
55
+ effect(() => {
56
+ this._updateButtonStyles();
57
+ });
58
+ }
59
+ ngAfterContentInit() {
60
+ this._updateButtonStyles();
61
+ }
62
+ _updateButtonStyles() {
63
+ const hostElement = this._elementRef.nativeElement;
64
+ const buttons = hostElement.querySelectorAll('[fuiButton]');
65
+ buttons.forEach((button, index) => {
66
+ // Remove all position classes first
67
+ this._renderer.removeClass(button, 'fui-button-group__button--first');
68
+ this._renderer.removeClass(button, 'fui-button-group__button--middle');
69
+ this._renderer.removeClass(button, 'fui-button-group__button--last');
70
+ this._renderer.removeClass(button, 'fui-button-group__button--only');
71
+ // Add appropriate class based on position
72
+ if (buttons.length === 1) {
73
+ this._renderer.addClass(button, 'fui-button-group__button--only');
74
+ }
75
+ else if (index === 0) {
76
+ this._renderer.addClass(button, 'fui-button-group__button--first');
77
+ }
78
+ else if (index === buttons.length - 1) {
79
+ this._renderer.addClass(button, 'fui-button-group__button--last');
80
+ }
81
+ else {
82
+ this._renderer.addClass(button, 'fui-button-group__button--middle');
83
+ }
84
+ });
85
+ }
86
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiButtonGroupComponent, isStandalone: true, selector: "fui-button-group", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "ariaLabel()" }, classAttribute: "fui-button-group" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [".fui-button-group{contain:layout style;display:inline-flex;align-items:center;gap:0;background-color:var(--fui-surface-02);padding:var(--fui-spacing-02);border-radius:var(--fui-border-radius-sm);box-sizing:border-box}.fui-button-group .fui-button{margin:0}.fui-button-group .fui-button-group__button--middle{border-radius:0}.fui-button-group .fui-button-group__button--first{border-top-right-radius:0;border-bottom-right-radius:0}.fui-button-group .fui-button-group__button--last{border-top-left-radius:0;border-bottom-left-radius:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiButtonGroupComponent, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: 'fui-button-group', standalone: true, template: `<ng-content></ng-content>`, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
92
+ class: 'fui-button-group',
93
+ role: 'group',
94
+ '[attr.aria-label]': 'ariaLabel()',
95
+ }, styles: [".fui-button-group{contain:layout style;display:inline-flex;align-items:center;gap:0;background-color:var(--fui-surface-02);padding:var(--fui-spacing-02);border-radius:var(--fui-border-radius-sm);box-sizing:border-box}.fui-button-group .fui-button{margin:0}.fui-button-group .fui-button-group__button--middle{border-radius:0}.fui-button-group .fui-button-group__button--first{border-top-right-radius:0;border-bottom-right-radius:0}.fui-button-group .fui-button-group__button--last{border-top-left-radius:0;border-bottom-left-radius:0}\n"] }]
96
+ }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
97
+
98
+ /**
99
+ * Generated bundle index. Do not edit.
100
+ */
101
+
102
+ export { FuiButtonGroupComponent };
103
+ //# sourceMappingURL=raintonic-formaui-components-button-group.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-button-group.mjs","sources":["../../../lib/components/button-group/button-group.component.ts","../../../lib/components/button-group/raintonic-formaui-components-button-group.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n AfterContentInit,\n ElementRef,\n Renderer2,\n inject,\n effect,\n input,\n} from '@angular/core';\n\n/**\n * # Button Group Component\n *\n * A container component that groups multiple buttons together, creating a unified\n * visual element with connected borders. Follows Carbon Design System patterns.\n *\n * ## Features\n * - Groups multiple buttons into a single visual unit\n * - Removes internal border-radius, keeping only the extremities rounded\n * - Surface-02 background with small padding\n * - Automatically handles button border-radius for first and last buttons\n *\n * ## Usage\n *\n * ### Basic Button Group\n * ```html\n * <fui-button-group>\n * <button fuiButton variant=\"outline\">Left</button>\n * <button fuiButton variant=\"outline\">Center</button>\n * <button fuiButton variant=\"outline\">Right</button>\n * </fui-button-group>\n * ```\n *\n * @example\n * ```typescript\n * import { FuiButtonGroupComponent } from '@raintonic/formaui/components/button-group';\n * import { FuiButtonDirective } from '@raintonic/formaui/components/button';\n *\n * @Component({\n * standalone: true,\n * imports: [FuiButtonGroupComponent, FuiButtonDirective],\n * template: `\n * <fui-button-group>\n * <button fuiButton variant=\"outline\">Option 1</button>\n * <button fuiButton variant=\"outline\">Option 2</button>\n * <button fuiButton variant=\"outline\">Option 3</button>\n * </fui-button-group>\n * `\n * })\n * export class MyComponent {}\n * ```\n */\n@Component({\n selector: 'fui-button-group',\n standalone: true,\n template: `<ng-content></ng-content>`,\n styleUrls: ['./button-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-button-group',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class FuiButtonGroupComponent implements AfterContentInit {\n /**\n * Accessible label for the button group\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n private readonly _elementRef = inject(ElementRef);\n private readonly _renderer = inject(Renderer2);\n\n constructor() {\n // Set up an effect to handle dynamic button changes\n effect(() => {\n this._updateButtonStyles();\n });\n }\n\n ngAfterContentInit(): void {\n this._updateButtonStyles();\n }\n\n private _updateButtonStyles(): void {\n const hostElement = this._elementRef.nativeElement as HTMLElement;\n const buttons = hostElement.querySelectorAll('[fuiButton]');\n\n buttons.forEach((button, index) => {\n // Remove all position classes first\n this._renderer.removeClass(button, 'fui-button-group__button--first');\n this._renderer.removeClass(button, 'fui-button-group__button--middle');\n this._renderer.removeClass(button, 'fui-button-group__button--last');\n this._renderer.removeClass(button, 'fui-button-group__button--only');\n\n // Add appropriate class based on position\n if (buttons.length === 1) {\n this._renderer.addClass(button, 'fui-button-group__button--only');\n } else if (index === 0) {\n this._renderer.addClass(button, 'fui-button-group__button--first');\n } else if (index === buttons.length - 1) {\n this._renderer.addClass(button, 'fui-button-group__button--last');\n } else {\n this._renderer.addClass(button, 'fui-button-group__button--middle');\n }\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCG;MAcU,uBAAuB,CAAA;AAClC;;AAEG;AACM,IAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,gFAAC;AAExC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAE9C,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ;IAEA,kBAAkB,GAAA;QAChB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,aAA4B;QACjE,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAE3D,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;;YAEhC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,iCAAiC,CAAC;YACrE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,kCAAkC,CAAC;YACtE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACpE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC;;AAGpE,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACnE;AAAO,iBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;gBACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAC;YACpE;iBAAO,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACnE;iBAAO;gBACL,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kCAAkC,CAAC;YACrE;AACF,QAAA,CAAC,CAAC;IACJ;uGA1CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,6VAVxB,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yhBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAU1B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EACN,CAAA,yBAAA,CAA2B,EAAA,eAAA,EAEpB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,kBAAkB;AACzB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,aAAa;AACnC,qBAAA,EAAA,MAAA,EAAA,CAAA,yhBAAA,CAAA,EAAA;;;ACjEH;;AAEG;;;;"}
@@ -0,0 +1,241 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, computed, inject, ElementRef, Renderer2, effect, HostListener, Directive } from '@angular/core';
3
+
4
+ const FUI_BUTTON_VARIANTS = ['primary', 'secondary', 'ghost', 'outline', 'danger', 'link', 'icon'];
5
+ const FUI_BUTTON_SIZES = ['sm', 'md', 'lg', 'xl', '2xl'];
6
+ /**
7
+ * # Button Directive
8
+ *
9
+ * A versatile button directive that can be applied to both `<button>` and `<a>` elements.
10
+ * Follows Carbon Design System patterns with full accessibility support.
11
+ *
12
+ * ## Features
13
+ * - Multiple variants: primary, secondary,ghost, outline, danger, link
14
+ * - Six sizes: sm, md, lg, xl, 2xl, field
15
+ * - Full accessibility support (ARIA attributes, keyboard navigation)
16
+ * - Loading and disabled states
17
+ * - Icon support with proper spacing
18
+ * - Full-width option
19
+ * - Works with both button and anchor elements
20
+ *
21
+ *
22
+ * ### Link Button
23
+ * ```html
24
+ * <a fuiButton href="/dashboard" variant="ghost">Go to Dashboard</a>
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { FuiButtonDirective } from '@raintonic/formaui/components/button';
30
+ *
31
+ * @Component({
32
+ * standalone: true,
33
+ * imports: [FuiButtonDirective],
34
+ * template: `
35
+ * <button fuiButton variant="primary" (click)="save()">
36
+ * Save Changes
37
+ * </button>
38
+ * `
39
+ * })
40
+ * export class MyComponent {
41
+ * save() {
42
+ * // Handle save action
43
+ * }
44
+ * }
45
+ * ```
46
+ */
47
+ class FuiButtonDirective {
48
+ /**
49
+ * Button variant that determines the color scheme
50
+ * @default 'primary'
51
+ */
52
+ variant = input('primary', { ...(ngDevMode ? { debugName: "variant" } : /* istanbul ignore next */ {}), transform: (v) => (FUI_BUTTON_VARIANTS.includes(v) ? v : 'primary') });
53
+ /**
54
+ * Button size
55
+ * @default 'md'
56
+ */
57
+ size = input('md', { ...(ngDevMode ? { debugName: "size" } : /* istanbul ignore next */ {}), transform: (v) => (FUI_BUTTON_SIZES.includes(v) ? v : 'md') });
58
+ /**
59
+ * Whether the button is disabled
60
+ * @default false
61
+ */
62
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
63
+ /**
64
+ * Whether the button should take full width of its container
65
+ * @default false
66
+ */
67
+ fullWidth = input(false, { ...(ngDevMode ? { debugName: "fullWidth" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
68
+ /**
69
+ * Whether the button is in loading state
70
+ * @default false
71
+ */
72
+ loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
73
+ /**
74
+ * Whether the button contains only an icon (for proper padding)
75
+ * @default false
76
+ */
77
+ iconOnly = input(false, { ...(ngDevMode ? { debugName: "iconOnly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
78
+ /**
79
+ * Accessible label for icon-only buttons.
80
+ * Required when `iconOnly` is true so screen readers can announce the button's purpose.
81
+ */
82
+ ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
83
+ /**
84
+ * Button type for native button elements
85
+ * @default 'button'
86
+ */
87
+ type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
88
+ // Computed properties
89
+ computedClasses = computed(() => {
90
+ const classes = ['fui-button', `fui-button--${this.variant()}`, `fui-button--${this.size()}`];
91
+ if (this.disabled()) {
92
+ classes.push('fui-button--disabled');
93
+ }
94
+ if (this.fullWidth()) {
95
+ classes.push('fui-button--full-width');
96
+ }
97
+ if (this.loading()) {
98
+ classes.push('fui-button--loading');
99
+ }
100
+ if (this.iconOnly()) {
101
+ classes.push('fui-button--icon-only');
102
+ }
103
+ return classes.join(' ');
104
+ }, ...(ngDevMode ? [{ debugName: "computedClasses" }] : /* istanbul ignore next */ []));
105
+ _elementRef = inject(ElementRef);
106
+ _renderer = inject(Renderer2);
107
+ // Element kind guards
108
+ get isButton() {
109
+ return this._elementRef.nativeElement.tagName.toLowerCase() === 'button';
110
+ }
111
+ get isAnchor() {
112
+ return this._elementRef.nativeElement.tagName.toLowerCase() === 'a';
113
+ }
114
+ constructor() {
115
+ // Manage loading spinner and anchor href disabled-state together
116
+ effect(() => {
117
+ if (this.loading()) {
118
+ this._addLoadingSpinner();
119
+ }
120
+ else {
121
+ this._removeLoadingSpinner();
122
+ }
123
+ this._syncAnchorHrefDisabledState();
124
+ });
125
+ }
126
+ ngAfterViewInit() {
127
+ // Ensure explicit type for native buttons to prevent accidental form submit
128
+ const el = this._elementRef.nativeElement;
129
+ if (this.isButton) {
130
+ this._renderer.setAttribute(el, 'type', this.type());
131
+ }
132
+ }
133
+ onClick(event) {
134
+ if (this.disabled() || this.loading()) {
135
+ event.preventDefault();
136
+ event.stopPropagation();
137
+ return;
138
+ }
139
+ }
140
+ onKeydown(event) {
141
+ if (this.disabled() || this.loading()) {
142
+ event.preventDefault();
143
+ return;
144
+ }
145
+ // Only synthesize activation for anchors
146
+ if (this.isAnchor) {
147
+ const ke = event;
148
+ if (ke.key === 'Enter') {
149
+ event.preventDefault();
150
+ this._elementRef.nativeElement.click();
151
+ }
152
+ else if (ke.key === ' ') {
153
+ // prevent page scroll; activation handled on keyup
154
+ event.preventDefault();
155
+ }
156
+ }
157
+ }
158
+ onKeyup(event) {
159
+ if (this.disabled() || this.loading()) {
160
+ return;
161
+ }
162
+ if (this.isAnchor && event.key === ' ') {
163
+ this._elementRef.nativeElement.click();
164
+ }
165
+ }
166
+ _addLoadingSpinner() {
167
+ // Prevent duplicate spinner nodes
168
+ if (this._elementRef.nativeElement.querySelector('.fui-icon'))
169
+ return;
170
+ const spinner = this._renderer.createElement('fui-icon');
171
+ this._renderer.addClass(spinner, 'fui-button__spinner');
172
+ this._renderer.setAttribute(spinner, 'aria-hidden', 'true');
173
+ // Add spinner icon
174
+ const spinnerIcon = this._renderer.createElement('span');
175
+ this._renderer.addClass(spinnerIcon, 'fui-button__spinner-icon');
176
+ this._renderer.appendChild(spinner, spinnerIcon);
177
+ this._renderer.appendChild(this._elementRef.nativeElement, spinner);
178
+ }
179
+ _removeLoadingSpinner() {
180
+ const spinner = this._elementRef.nativeElement.querySelector('.fui-button__spinner');
181
+ if (spinner) {
182
+ this._renderer.removeChild(this._elementRef.nativeElement, spinner);
183
+ }
184
+ }
185
+ _syncAnchorHrefDisabledState() {
186
+ const el = this._elementRef.nativeElement;
187
+ if (!this.isAnchor)
188
+ return;
189
+ const disabledLike = this.disabled() || this.loading();
190
+ const stored = el.getAttribute('data-fuiStoredHref');
191
+ const href = el.getAttribute('href');
192
+ if (disabledLike && href) {
193
+ this._renderer.setAttribute(el, 'data-fuiStoredHref', href);
194
+ this._renderer.removeAttribute(el, 'href');
195
+ }
196
+ else if (!disabledLike && !href && stored) {
197
+ this._renderer.setAttribute(el, 'href', stored);
198
+ this._renderer.removeAttribute(el, 'data-fuiStoredHref');
199
+ }
200
+ }
201
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
202
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.6", type: FuiButtonDirective, isStandalone: true, selector: "button[fuiButton], a[fuiButton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick($event)", "keydown": "onKeydown($event)", "keyup": "onKeyup($event)" }, properties: { "class": "computedClasses()", "attr.disabled": "isButton && (disabled() || loading()) ? \"\" : null", "attr.aria-disabled": "(disabled() || loading()) ? \"true\" : null", "attr.aria-busy": "loading() ? \"true\" : null", "attr.aria-label": "ariaLabel()", "attr.aria-live": "loading() ? \"polite\" : null", "attr.role": "isAnchor ? \"button\" : null", "attr.tabindex": "isAnchor && (disabled() || loading()) ? \"-1\" : null", "style.pointer-events": "isAnchor && (disabled() || loading()) ? \"none\" : null" } }, ngImport: i0 });
203
+ }
204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiButtonDirective, decorators: [{
205
+ type: Directive,
206
+ args: [{
207
+ selector: 'button[fuiButton], a[fuiButton]',
208
+ standalone: true,
209
+ host: {
210
+ '[class]': 'computedClasses()',
211
+ // Use attribute binding for boolean disabled; valid on <button>, ignored on <a>
212
+ '[attr.disabled]': 'isButton && (disabled() || loading()) ? "" : null',
213
+ // ARIA: present only when true
214
+ '[attr.aria-disabled]': '(disabled() || loading()) ? "true" : null',
215
+ '[attr.aria-busy]': 'loading() ? "true" : null',
216
+ '[attr.aria-label]': 'ariaLabel()',
217
+ '[attr.aria-live]': 'loading() ? "polite" : null',
218
+ // For anchors, provide role and manage tabindex
219
+ '[attr.role]': 'isAnchor ? "button" : null',
220
+ '[attr.tabindex]': 'isAnchor && (disabled() || loading()) ? "-1" : null',
221
+ // Optionally prevent interactions for anchors when disabled/loading
222
+ '[style.pointer-events]': 'isAnchor && (disabled() || loading()) ? "none" : null',
223
+ },
224
+ }]
225
+ }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], onClick: [{
226
+ type: HostListener,
227
+ args: ['click', ['$event']]
228
+ }], onKeydown: [{
229
+ type: HostListener,
230
+ args: ['keydown', ['$event']]
231
+ }], onKeyup: [{
232
+ type: HostListener,
233
+ args: ['keyup', ['$event']]
234
+ }] } });
235
+
236
+ /**
237
+ * Generated bundle index. Do not edit.
238
+ */
239
+
240
+ export { FUI_BUTTON_SIZES, FUI_BUTTON_VARIANTS, FuiButtonDirective };
241
+ //# sourceMappingURL=raintonic-formaui-components-button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raintonic-formaui-components-button.mjs","sources":["../../../lib/components/button/button.directive.ts","../../../lib/components/button/raintonic-formaui-components-button.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n Renderer2,\n input,\n computed,\n effect,\n HostListener,\n inject,\n Signal,\n AfterViewInit,\n booleanAttribute,\n} from '@angular/core';\n\n/**\n * Available button variants following Carbon Design System patterns\n */\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'danger' | 'link' | 'icon';\n\n/**\n * Available button sizes\n */\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport const FUI_BUTTON_VARIANTS = ['primary', 'secondary', 'ghost', 'outline', 'danger', 'link', 'icon'] as const;\nexport const FUI_BUTTON_SIZES = ['sm', 'md', 'lg', 'xl', '2xl'] as const;\n\nexport type ButtonType = 'button' | 'submit' | 'reset';\n\n/**\n * # Button Directive\n *\n * A versatile button directive that can be applied to both `<button>` and `<a>` elements.\n * Follows Carbon Design System patterns with full accessibility support.\n *\n * ## Features\n * - Multiple variants: primary, secondary,ghost, outline, danger, link\n * - Six sizes: sm, md, lg, xl, 2xl, field\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Loading and disabled states\n * - Icon support with proper spacing\n * - Full-width option\n * - Works with both button and anchor elements\n *\n *\n * ### Link Button\n * ```html\n * <a fuiButton href=\"/dashboard\" variant=\"ghost\">Go to Dashboard</a>\n * ```\n *\n * @example\n * ```typescript\n * import { FuiButtonDirective } from '@raintonic/formaui/components/button';\n *\n * @Component({\n * standalone: true,\n * imports: [FuiButtonDirective],\n * template: `\n * <button fuiButton variant=\"primary\" (click)=\"save()\">\n * Save Changes\n * </button>\n * `\n * })\n * export class MyComponent {\n * save() {\n * // Handle save action\n * }\n * }\n * ```\n */\n@Directive({\n selector: 'button[fuiButton], a[fuiButton]',\n standalone: true,\n host: {\n '[class]': 'computedClasses()',\n // Use attribute binding for boolean disabled; valid on <button>, ignored on <a>\n '[attr.disabled]': 'isButton && (disabled() || loading()) ? \"\" : null',\n // ARIA: present only when true\n '[attr.aria-disabled]': '(disabled() || loading()) ? \"true\" : null',\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-live]': 'loading() ? \"polite\" : null',\n // For anchors, provide role and manage tabindex\n '[attr.role]': 'isAnchor ? \"button\" : null',\n '[attr.tabindex]': 'isAnchor && (disabled() || loading()) ? \"-1\" : null',\n // Optionally prevent interactions for anchors when disabled/loading\n '[style.pointer-events]': 'isAnchor && (disabled() || loading()) ? \"none\" : null',\n },\n})\nexport class FuiButtonDirective implements AfterViewInit {\n /**\n * Button variant that determines the color scheme\n * @default 'primary'\n */\n readonly variant = input<ButtonVariant, ButtonVariant | string>('primary', {\n transform: (v) => ((FUI_BUTTON_VARIANTS as readonly string[]).includes(v) ? (v as ButtonVariant) : 'primary'),\n });\n\n /**\n * Button size\n * @default 'md'\n */\n readonly size = input<ButtonSize, ButtonSize | string>('md', {\n transform: (v) => ((FUI_BUTTON_SIZES as readonly string[]).includes(v) ? (v as ButtonSize) : 'md'),\n });\n\n /**\n * Whether the button is disabled\n * @default false\n */\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Whether the button should take full width of its container\n * @default false\n */\n readonly fullWidth = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Whether the button is in loading state\n * @default false\n */\n readonly loading = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Whether the button contains only an icon (for proper padding)\n * @default false\n */\n readonly iconOnly = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Accessible label for icon-only buttons.\n * Required when `iconOnly` is true so screen readers can announce the button's purpose.\n */\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n\n /**\n * Button type for native button elements\n * @default 'button'\n */\n readonly type = input<ButtonType>('button');\n\n // Computed properties\n readonly computedClasses: Signal<string> = computed(() => {\n const classes: string[] = ['fui-button', `fui-button--${this.variant()}`, `fui-button--${this.size()}`];\n\n if (this.disabled()) {\n classes.push('fui-button--disabled');\n }\n\n if (this.fullWidth()) {\n classes.push('fui-button--full-width');\n }\n\n if (this.loading()) {\n classes.push('fui-button--loading');\n }\n\n if (this.iconOnly()) {\n classes.push('fui-button--icon-only');\n }\n\n return classes.join(' ');\n });\n\n private readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _renderer: Renderer2 = inject(Renderer2);\n\n // Element kind guards\n get isButton(): boolean {\n return this._elementRef.nativeElement.tagName.toLowerCase() === 'button';\n }\n get isAnchor(): boolean {\n return this._elementRef.nativeElement.tagName.toLowerCase() === 'a';\n }\n\n constructor() {\n // Manage loading spinner and anchor href disabled-state together\n effect(() => {\n if (this.loading()) {\n this._addLoadingSpinner();\n } else {\n this._removeLoadingSpinner();\n }\n this._syncAnchorHrefDisabledState();\n });\n }\n\n ngAfterViewInit(): void {\n // Ensure explicit type for native buttons to prevent accidental form submit\n const el = this._elementRef.nativeElement;\n if (this.isButton) {\n this._renderer.setAttribute(el, 'type', this.type());\n }\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: Event): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n return;\n }\n\n // Only synthesize activation for anchors\n if (this.isAnchor) {\n const ke = event as KeyboardEvent;\n if (ke.key === 'Enter') {\n event.preventDefault();\n this._elementRef.nativeElement.click();\n } else if (ke.key === ' ') {\n // prevent page scroll; activation handled on keyup\n event.preventDefault();\n }\n }\n }\n\n @HostListener('keyup', ['$event'])\n onKeyup(event: Event): void {\n if (this.disabled() || this.loading()) {\n return;\n }\n if (this.isAnchor && (event as KeyboardEvent).key === ' ') {\n this._elementRef.nativeElement.click();\n }\n }\n\n private _addLoadingSpinner(): void {\n // Prevent duplicate spinner nodes\n if (this._elementRef.nativeElement.querySelector('.fui-icon')) return;\n\n const spinner = this._renderer.createElement('fui-icon');\n this._renderer.addClass(spinner, 'fui-button__spinner');\n this._renderer.setAttribute(spinner, 'aria-hidden', 'true');\n\n // Add spinner icon\n const spinnerIcon = this._renderer.createElement('span');\n this._renderer.addClass(spinnerIcon, 'fui-button__spinner-icon');\n this._renderer.appendChild(spinner, spinnerIcon);\n\n this._renderer.appendChild(this._elementRef.nativeElement, spinner);\n }\n\n private _removeLoadingSpinner(): void {\n const spinner = this._elementRef.nativeElement.querySelector('.fui-button__spinner');\n if (spinner) {\n this._renderer.removeChild(this._elementRef.nativeElement, spinner);\n }\n }\n\n private _syncAnchorHrefDisabledState(): void {\n const el = this._elementRef.nativeElement as HTMLElement & { getAttribute(name: string): string | null };\n if (!this.isAnchor) return;\n const disabledLike = this.disabled() || this.loading();\n const stored = el.getAttribute('data-fuiStoredHref');\n const href = el.getAttribute('href');\n\n if (disabledLike && href) {\n this._renderer.setAttribute(el, 'data-fuiStoredHref', href);\n this._renderer.removeAttribute(el, 'href');\n } else if (!disabledLike && !href && stored) {\n this._renderer.setAttribute(el, 'href', stored);\n this._renderer.removeAttribute(el, 'data-fuiStoredHref');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAwBO,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;AACjG,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;AAI9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCG;MAoBU,kBAAkB,CAAA;AAC7B;;;AAGG;AACM,IAAA,OAAO,GAAG,KAAK,CAAwC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EACvE,SAAS,EAAE,CAAC,CAAC,MAAO,mBAAyC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAI,CAAmB,GAAG,SAAS,CAAC,GAC7G;AAEF;;;AAGG;AACM,IAAA,IAAI,GAAG,KAAK,CAAkC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EACzD,SAAS,EAAE,CAAC,CAAC,MAAO,gBAAsC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAI,CAAgB,GAAG,IAAI,CAAC,GAClG;AAEF;;;AAGG;IACM,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEnF;;;AAGG;IACM,SAAS,GAAG,KAAK,CAAmB,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEpF;;;AAGG;IACM,OAAO,GAAG,KAAK,CAAmB,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAElF;;;AAGG;IACM,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEnF;;;AAGG;IACM,SAAS,GAAG,KAAK,CAAgB,IAAI,iFAAI,KAAK,EAAE,YAAY,EAAA,CAAG;AAExE;;;AAGG;AACM,IAAA,IAAI,GAAG,KAAK,CAAa,QAAQ,2EAAC;;AAGlC,IAAA,eAAe,GAAmB,QAAQ,CAAC,MAAK;AACvD,QAAA,MAAM,OAAO,GAAa,CAAC,YAAY,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,EAAE,eAAe,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC;AAEvG,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACtC;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC;QACxC;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC;QACrC;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;QACvC;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,sFAAC;AAEe,IAAA,WAAW,GAA4B,MAAM,CAAC,UAAU,CAAC;AACzD,IAAA,SAAS,GAAc,MAAM,CAAC,SAAS,CAAC;;AAGzD,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,QAAQ;IAC1E;AACA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG;IACrE;AAEA,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;gBAClB,IAAI,CAAC,kBAAkB,EAAE;YAC3B;iBAAO;gBACL,IAAI,CAAC,qBAAqB,EAAE;YAC9B;YACA,IAAI,CAAC,4BAA4B,EAAE;AACrC,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;;AAEb,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;AACzC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACtD;IACF;AAGA,IAAA,OAAO,CAAC,KAAY,EAAA;QAClB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YACrC,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB;QACF;IACF;AAGA,IAAA,SAAS,CAAC,KAAY,EAAA;QACpB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YACrC,KAAK,CAAC,cAAc,EAAE;YACtB;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,EAAE,GAAG,KAAsB;AACjC,YAAA,IAAI,EAAE,CAAC,GAAG,KAAK,OAAO,EAAE;gBACtB,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;YACxC;AAAO,iBAAA,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,EAAE;;gBAEzB,KAAK,CAAC,cAAc,EAAE;YACxB;QACF;IACF;AAGA,IAAA,OAAO,CAAC,KAAY,EAAA;QAClB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YACrC;QACF;QACA,IAAI,IAAI,CAAC,QAAQ,IAAK,KAAuB,CAAC,GAAG,KAAK,GAAG,EAAE;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;QACxC;IACF;IAEQ,kBAAkB,GAAA;;QAExB,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,WAAW,CAAC;YAAE;QAE/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC;;QAG3D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC;QACxD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC;AAEhD,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC;IACrE;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,sBAAsB,CAAC;QACpF,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC;QACrE;IACF;IAEQ,4BAA4B,GAAA;AAClC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,aAA4E;QACxG,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;QACtD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC;QACpD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;AAEpC,QAAA,IAAI,YAAY,IAAI,IAAI,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE,oBAAoB,EAAE,IAAI,CAAC;YAC3D,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC;QAC5C;aAAO,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;YAC3C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,EAAE,oBAAoB,CAAC;QAC1D;IACF;uGAvLW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,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,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,qDAAA,EAAA,oBAAA,EAAA,6CAAA,EAAA,gBAAA,EAAA,6BAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,+BAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,eAAA,EAAA,uDAAA,EAAA,sBAAA,EAAA,yDAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAnB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iCAAiC;AAC3C,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,mBAAmB;;AAE9B,wBAAA,iBAAiB,EAAE,mDAAmD;;AAEtE,wBAAA,sBAAsB,EAAE,2CAA2C;AACnE,wBAAA,kBAAkB,EAAE,2BAA2B;AAC/C,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,kBAAkB,EAAE,6BAA6B;;AAEjD,wBAAA,aAAa,EAAE,4BAA4B;AAC3C,wBAAA,iBAAiB,EAAE,qDAAqD;;AAExE,wBAAA,wBAAwB,EAAE,uDAAuD;AAClF,qBAAA;AACF,iBAAA;;sBA4GE,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;sBAShC,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;sBAoBlC,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;ACjOnC;;AAEG;;;;"}